
简介完整Word版文档系统讲解基本粒子群优化算法PSO的原理与MATLAB实现适合需要入门智能优化算法的高校学生、科研人员和工程技术人员。文档从Kennedy和Eberhart于1995年提出的粒子群算法背景入手详细阐述了鸟群捕食模型如何转化为解空间搜索策略依次介绍惯性权重、认知系数、社会系数等核心参数的作用并区分全局PSO与局部PSO的更新方式。随后给出可直接运行的MATLAB主函数与初始化函数代码包含种群大小、粒子维度、搜索范围等参数设置及注释同时配有算法流程图、速度-位置更新公式、适应度评估和迭代终止条件说明。读者既可将其作为课程作业或毕业设计的参考也能据此二次开发用于函数优化、神经网络训练等实际场景。资源为1个doc文档大小仅39KB已有50人学习轻量易载适合随时查阅。1. 基本粒子群算法能做什么一份 Word 文档背后的真实需求看到“完整word版基本粒子群算法的原理和matlab程序(1).doc”这个文件名多数人第一反应是赶紧下载、打开、把代码复制进 MATLAB跑通一个算例交差。但基本粒子群算法PSO真正要解决的问题并不复杂在连续解空间里用一组随机初始化的候选解通过模拟群体协作的方式逼近全局最优值。它不需要目标函数可导、不需要初值离最优解多近这比传统梯度下降法在工程优化里更扛造。这篇文章把 PSO 的原理、MATLAB 最小实现、参数边界和常见翻车点一次讲透新手能照步骤复现熟手能避开那些只靠文档说明根本看不出来的坑。2. 基本粒子群算法的原理速度-位置更新公式在算什么PSO 的数学模型看起来就三行公式但它浓缩了三个不同层面的决策逻辑。想用好这个算法不能只背公式得知道每一项在干什么、为什么这么设计。2.1 粒子、速度和位置一个粒子就是一个候选解在 PSO 里每个粒子代表解空间中的一个点。假设优化问题有 D 个决策变量那么每个粒子就是一个 D 维向量。粒子群里有 N 个粒子相当于同时养了 N 个候选解在目标函数上打分。这个 解 不是最终结果而是搜索过程中一个随时会被替换的临时方案。粒子 i 在第 t 代有两个属性位置 $x_i^t$ 和速度 $v_i^t$。位置决定它对应的目标函数值适应度速度决定下一轮它往哪个方向移动。速度本身也是一个 D 维向量每一维代表在该维度上的移动步长和方向。初始化时位置通常在 $[lb, ub]$ 边界内均匀随机分布速度在 $[-v_{max}, v_{max}]$ 内随机生成。这里有个容易忽略的点位置的随机性决定了算法的探索范围速度的随机性只决定初始移动方向两者尺度不一样不能混为一谈。下一个关键设计是个体记忆。每个粒子会记住自己历史上去过的最优位置记为 $p_i$个体最优pbest。整个种群所有 pbest 中最好的那一个记为 $p_g$全局最优gbest。gbest 是全体粒子共享的信息也是这个算法的 全局视野 。没有 pbest粒子就只会朝当前最优莽撞冲锋没有 gbest粒子就退化成一堆互不通信的随机游走。2.2 更新公式拆解惯性项、认知项和社会项标准 PSO 的速度更新公式如下$$v_{id}^{t1} w \cdot v_{id}^t c_1 r_1 (p_{id} - x_{id}^t) c_2 r_2 (p_{gd} - x_{id}^t)$$位置更新公式$$x_{id}^{t1} x_{id}^t v_{id}^{t1}$$下标 d 表示第 d 个维度i 表示第 i 个粒子。把速度更新公式拆成三项来看第一项 $w \cdot v_{id}^t$ 是惯性项。$w$ 是惯性权重乘以上一代速度。它代表粒子延续原有运动趋势的意愿。$w$ 大粒子飞得远探索范围大$w$ 小粒子容易停下来被局部位置吸引。第二项 $c_1 r_1 (p_{id} - x_{id}^t)$ 是认知项。$p_{id} - x_{id}^t$ 是粒子当前朝向自己历史最优位置的差距向量$c_1$ 是认知学习因子$r_1$ 是 [0,1] 均匀随机数。这一项的作用是把粒子拽回它自己曾经表现最好的区域。第三项 $c_2 r_2 (p_{gd} - x_{id}^t)$ 是社会项。$p_{gd} - x_{id}^t$ 是朝向全局最优位置的差距向量$c_2$ 是社会学习因子。这一项让粒子跟随整个群体的当前最优。三项叠加后粒子既不完全跟着大部队走也不完全凭惯性横冲直撞而是在 自己觉得好 和 大家觉得好 之间取折中。这正是 PSO 这个算法最朴素的部分个体的记忆加群体的经验形成一种不借助梯度信息的寻优机制。2.3 有限制速度这一说vmax、越界与算法收敛速度更新公式本身没有约束如果不加限制速度会随迭代次数积累得越来越大粒子直接飞出搜索边界。所以标准实现里有三个防线。第一是速度上限 $v_{max}$每次更新后把速度钳位到 $[-v_{max}, v_{max}]$ 区间内。第二是位置越界处理位置更新后如果超出 $[lb, ub]$要么拉回边界钳位要么反弹回来要么重新随机初始化。第三是 $w$ 的设定如果 $w$ 长期大于 1速度只增不减算法必然发散。从收敛角度看PSO 并不是一个收敛性质有严格数学保证的算法。它所谓的 收敛 是指粒子群逐渐聚拢到某个 gbest 附近但聚拢不等于收敛到全局最优。早期版本没有惯性权重收敛容易变成早熟引入 $w$ 之后通过让 $w$ 随迭代次数从大变小前期全局探索、后期局部精修这才是工程里最常用、最管用的控制收敛节奏的手段。伪代码基本 PSO 一次完整迭代 for t 1 to max_iter for i 1 to pop_size 更新 v_i: 惯性项 认知项 社会项 限制 v_i 在 [-vmax, vmax] 更新 x_i x_i v_i 处理 x_i 越界 计算 f(x_i) 更新 pbest_i 更新 gbest 记录本代 gbest 适应度到收敛曲线 end这个流程里需要特别注意一次迭代中先更新位置再计算适应度适应度计算用的必须是新位置。有些初版代码把适应度计算放在速度更新之前那相当于用旧位置判断新位置逻辑错位结果会慢半拍。3. 用 MATLAB 写一个可复现的最小 PSO主函数、边界处理与收敛曲线原理清楚了直接上代码。下面这套实现是我自己常用的最小结构主函数和目标函数完全解耦换测试函数不碰主函数代码。3.1 主函数设计参数结构体与目标函数句柄先写 PSO 主函数。它接收目标函数句柄、维度、边界和参数结构体返回全局最优位置、最优适应度和收敛曲线数据。function [gbest, gbest_val, curve] pso_basic(fh, dim, lb, ub, opt) % pso_basic: 基本粒子群算法最小实现 % 输入: % fh - 目标函数句柄, 输入 pop_size x dim 矩阵, 返回 pop_size x 1 适应度列向量 % dim - 解空间维度 % lb - 1 x dim 或标量, 下界 % ub - 1 x dim 或标量, 上界 % opt - 结构体: pop_size, max_iter, w, c1, c2, vmax % 输出: % gbest - 全局最优位置, 1 x dim % gbest_val- 全局最优适应度 % curve - 每代全局最优适应度, 用于画收敛曲线 pop_size opt.pop_size; max_iter opt.max_iter; w opt.w; c1 opt.c1; c2 opt.c2; vmax opt.vmax; % --- 初始化粒子群 --- X rand(pop_size, dim) .* (ub - lb) lb; % 位置均匀随机落在搜索域内 V (rand(pop_size, dim) * 2 - 1) .* vmax; % 速度均匀随机落在 [-vmax, vmax] val fh(X); % 矢量法一次算完所有粒子的适应度 pbest X; pbest_val val; [gbest_val, idx] min(pbest_val); gbest pbest(idx, :); curve zeros(max_iter, 1); % --- 迭代主循环 --- for t 1:max_iter for i 1:pop_size r1 rand(1, dim); r2 rand(1, dim); V(i, :) w * V(i, :) ... c1 * r1 .* (pbest(i, :) - X(i, :)) ... c2 * r2 .* (gbest - X(i, :)); % 限速: 把每个维度速度钳到 [-vmax, vmax] V(i, :) min(max(V(i, :), -vmax), vmax); % 位置更新并做边界钳位 X(i, :) X(i, :) V(i, :); X(i, :) min(max(X(i, :), lb), ub); end % 计算全部粒子在新位置的适应度 val fh(X); % 更新个体最优 for i 1:pop_size if val(i) pbest_val(i) pbest(i, :) X(i, :); pbest_val(i) val(i); end end % 更新全局最优 [cur_best, idx] min(pbest_val); if cur_best gbest_val gbest_val cur_best; gbest pbest(idx, :); end curve(t) gbest_val; end end这个代码里有几个设计点值得说明。目标函数句柄采用矢量输入的设计一次性传入 pop_size 行 dim 列的矩阵返回 pop_size 行列向量。这个约定比逐粒子循环调用目标函数快得多尤其在 MATLAB 里矩阵化运算比 for 循环有数量级的性能优势。初始化时对 lb 和 ub 用了与矩阵维度广播的写法意味着 lb、ub 既可以是标量也可以是 1 x dim 的向量。所以调用时用-5.12 * ones(1, 10)或直接传-5.12都能跑。vmax 的钳位写在位置更新之前还是之后需要留意。代码里的顺序是先更新速度再钳位速度然后更新位置最后钳位位置。如果把位置更新放在速度钳位之前实际生效的速度上限就形同虚设粒子会跑出很远再被拉回来轨迹质量变差。这个顺序问题在不少从 Word 复制出来的版本里都会写反。3.2 初始化阶段种群规模、边界和速度上限的取值主函数不长但初始化部分的三个参数直接决定后续行为。种群规模 pop_size 常见取 20 到 40对大多数二维到三十维的问题够用。少于 15 个粒子群体多样性不足容易绕开最优区域超过 100 个粒子收敛快但是单次迭代计算量大在高维度问题上得不偿失。边界 lb、ub 必须覆盖到最优解附近如果给窄了算法再能搜索也找不回来。速度上限 vmax 的取值常被忽略。一个经验值是 vmax 取单维边界宽度的 10% 到 20%。边界宽度是 ub - lb如果是对称边界如 [-5.12, 5.12]宽度是 10.24vmax 取 1 到 2 之间比较稳妥。vmax 太大粒子一步跨出大半个搜索域前期的精细搜索完全丧失vmax 太小粒子只能在初始位置附近蠕动全局探索能力不足。这是个会被 感觉调参 坑掉的地方先用边界宽度的 0.1 倍做基线再按收敛曲线微调。% 调用示例: 以 10 维 Rastrigin 函数为例 opt.pop_size 30; opt.max_iter 200; opt.w 0.8; opt.c1 1.5; opt.c2 1.5; opt.vmax 1.0; dim 10; lb -5.12 * ones(1, dim); ub 5.12 * ones(1, dim); [gbest, gbest_val, curve] pso_basic(rastrigin, dim, lb, ub, opt); fprintf(最优值: %.6f\n, gbest_val); plot(1:numel(curve), curve); xlabel(迭代次数); ylabel(全局最优适应度); grid on;这段调用代码把参数封装在结构体里传给主函数。用结构体而不是拆成多个位置参数好处是参数多时不用记顺序改哪个参数一目了然。fprintf 输出最优值plot 画收敛曲线这两行是复现实验报告时最常用的验证手段。3.3 迭代主循环与三种常见的边界处理方式主循环里的核心操作就是二点二的公式对应到代码是三个乘法项累加。r1 和 r2 每次迭代每个粒子都要重新生成这是随机性的来源。这里必须注意的是rand(1, dim)生成的是一个 1 x dim 的随机行向量与后面的差向量逐元素相乘保证每个维度上的随机扰动是独立的。如果误写成rand生成标量那么所有维度共用同一个随机数搜索方向会被限制在一条直线上算法性能大幅退化这个坑后面细说。边界处理在主函数里用了最保守的钳位方案位置超出则拉回边界。钳位实现简单但对边界附近的搜索行为有一点负面影响粒子贴在边界上时速度可能还有较大值下一轮位置更新后又被拉回导致边界附近出现无效震荡。两种常见的替代方案是反弹和随机重生。反弹的做法是在越界维度把速度取反模拟粒子撞墙弹回随机重生则是把越界粒子在边界内重新随机初始化换来新的多样性。三种方式里钳位最稳定但可能损失多样性反弹在边界连续型问题上表现好随机重生适合多峰函数。初学者先上钳位跑通之后再把边界处理换成反弹对比同一测试函数的效果差异。注意如果碰到那种把越界粒子直接丢弃的实现相当于每轮都在悄悄减小种群规模迭代几百次后粒子所剩无几这种实现不建议用。3.4 目标函数怎么写Rastrigin 与 Sphere 的标准形式主函数解耦之后目标函数是独立的 MATLAB 函数文件。写对目标函数的关键在于它必须接收一个矩阵 X每一行是一个候选解返回一个列向量每一行是该候选解的适应度。function y rastrigin(x) % Rastrigin 函数, 多峰, 在原点取全局最小值 0 n size(x, 2); y sum(x.^2 - 10 * cos(2 * pi * x) 10, 2); endfunction y sphere(x) % Sphere 函数, 单峰, 在原点取全局最小值 0 y sum(x.^2, 2); end注意sum(..., 2)这个参数它指定沿第二个维度求和也就是对每行求和。如果漏掉第二个参数sum 默认沿第一个维度求和返回的是 1 x dim 的行向量主函数里val(i)逻辑全部错乱。这是目标函数写法里最高频的错误。Rastrigin 函数是典型的多峰测试函数局部最优极多适合检验 PSO 会不会早熟Sphere 是单峰函数适合检验参数改了以后收敛速度和精度的变化。测试 PSO 时同时跑这两个函数一个管全局搜索能力一个管局部收敛精度哪个函数表现差就说明哪个方面出了问题。4. 关键参数怎么设惯性权重、学习因子与种群规模的边界跑通代码只是第一步真正考验 PSO 的是参数调整。参数之间互相耦合找一组可靠参数需要理解每一项的实际影响。4.1 惯性权重 w固定值还是线性递减w 是 PSO 里对收敛行为影响最直接的一个参数。w 偏大粒子保持高速飞行的能力强搜索范围大但容易跳过最优区域w 偏小粒子很快被 pbest 和 gbest 拉过去局部精细化好但容易陷在前期的某一个最优附近出不来。常见的做法是取固定值 0.6 到 0.9或者用线性递减策略w 从 0.9 随迭代次数线性降到 0.4。递减的逻辑是前期需要大范围探索寻找有潜力的区域后期需要小步精修已经找到的好区域。实现只需要在主循环里加一行% 线性递减惯性权重: wmin 0.4, wmax 0.9 w wmax - (wmax - wmin) * t / max_iter;需要注意这一行放在使用 w 之前并且不能用 t 1 时代入得到 wmax 再乘以当前 w 这种方式重复折减。有些实现把 w 的更新放在迭代末尾下一轮开始时 w 已经被更新第一轮用的却是初始 w逻辑上会慢半拍。把更新放在迭代开头是最直接可靠的写法。固定 w 和递减 w 的性能差异在 Rastrigin 这类多峰函数上体现得很明显。固定 w 0.8 的前期探索力强但后期收敛慢w 0.9 的后期容易在局部最优附近来回振动。递减策略实际上是拿一个确定性的调度换取了两个阶段的平衡。这个改变实现成本极低收益却很实在属于最值得做的低成本改动。4.2 c1、c2 和 pop_size常见搭配与翻车点学习因子 c1 和 c2 控制粒子被个体经验和群体经验拉拽的强度。两个因子的取值通常在 0.5 到 2.5 之间。经典参数组合是 c1 c2 2配合 w 0.7298 使用时具有较好的收敛行为。这个 0.7298 来自文献中的收敛性分析结论配合 c1 c2 1.49445 也是一个常见的稳定组合。实际使用中不必过于纠结这几个常数重要的是理解 c1 和 c2 的相对大小关系c1 明显大于 c2 时粒子更倾向于在自己历史最优附近搜索群体的信息共享变弱c2 明显大于 c1 时整个种群快速涌向当前全局最优多样性可能瞬间崩塌。pop_size 与问题维度直接相关。经验法则是 pop_size 取 dim 的 2 到 5 倍同时在 20 到 100 之间截断。10 维问题配 30 到 50 个粒子够用50 维问题建议 100 到 150 个粒子。粒子数过少在 Rastrigin 这种多峰函数上几乎必然早熟粒子数过多则计算量上升收敛精度未必成比例提升。确定 pop_size 的一个办法是固定其他参数分别跑 20、40、80 个粒子对比收敛曲线最终平台期的 gbest_val而不是对比运行时间。速度上限 vmax 和边界宽度要配套。vmax 设成边界宽度的 10% 到 20%这个经验值在大多数标准测试函数上都能给出不错的行为。vmax 如果设得比边界宽度还大速度钳位形同虚设vmax 如果设成 0.01 倍边界宽度粒子每一步移动距离都极短迭代上限内根本趟不完搜索空间。这两个极端都让参数看起来像 玄学 但实际问题是量纲没配对。4.3 用 Sphere 和 Rastrigin 检验你的参数两个基准测试函数参数调完怎么判断调得好不好稳定可复现的办法是跑两个基准测试函数各跑 30 次记录每次的 gbest_val统计均值和标准差。均值反映算法找得准不准标准差反映算法稳不稳。大量调参过程中常见的误区是只看一次运行结果这一次跑得好就认为参数好。PSO 是随机算法单次结果不能说明任何问题。% 30 次独立重复实验的统计脚本 rng(0); % 先固定种子验证代码正确性, 正式统计时放开 results zeros(30, 1); for k 1:30 [~, gbest_val, ~] pso_basic(rastrigin, 10, lb, ub, opt); results(k) gbest_val; end fprintf(均值: %.6f, 标准差: %.6f, 最优单次: %.6f\n, ... mean(results), std(results), min(results));这段脚本里rng(0)是一个调试技巧先固定随机种子确保每次运行结果一致用来排查代码逻辑错误。正式做参数对比时把这一行放开让每次运行独立。30 次重复实验下来均值太高说明搜索能力弱标准差太大说明参数不稳定、对起始位置过于敏感。如果两种情况同时出现优先检查 w 和 vmax 的量级再看种群规模是不是太小。这里顺带提一下 MATLAB 优化工具箱里的 particleswarm 函数。工具箱自带实现参数设置更规范但作为一个学习者还是建议先把上面的手写版本跑通。手写版本能让你对每个参数的变化有直观感受工具箱实现把这些细节都封装掉了出了问题就变成一个黑匣子反而不利于理解算法。5. 从 Word 代码到能跑的 PSO五个常见坑与排查顺序这一章是实际使用中踩过才会明白的部分。那个 Word 文档里的代码往往不是逻辑多难而是挡在运行前的各种小问题。按下面五个坑的顺序排查能省下大量时间和精力。5.1 复制到 MATLAB 的代码第一行就报红隐藏字符和全角标点现象从 Word 里复制代码到 MATLAB 编辑器粘贴后第一行就标红甚至有中文引号和空格混在代码里。原因Word 编辑的文档里引号、逗号、括号经常被自动替换成中文全角符号。MATLAB 只认英文半角符号全角逗号和引号在语法上直接报错。还有一类是 Word 的自动首行缩进、自动编号带进来的制表符做空格和制表符的混排MATLAB 对缩进不敏感但制表符隐藏了视觉上的错位问题让人误以为括号配对正确。解决粘贴后先在 MATLAB 编辑器里用 全部替换 把中文标点批量替换成英文标点。检查的重点是引号、逗号、分号和圆括号这四类。做了替换后仍然报错的话把报错行删掉重新手敲一遍这是最省时间的处理方式。也可以把代码保存成 .m 文件再打开比直接在编辑器里粘贴更干净。5.2 每次运行结果都不一样论文里怎么复现现象同一个程序不修改任何参数连续运行三次得到三个明显不同的 gbest_val。原因PSO 的随机性来自 r1、r2 和初始化阶段的 rand这是算法设计的一部分不是程序 bug。但论文或报告里需要给出可复现的结果时随机性就变成了麻烦。还有一种情况是初始化代码写得不规范比如用rand但没指定维度矩阵维度不对导致部分粒子初始在边界外运行结果波动巨大。解决在程序开头加一行rng(seed)seed 取任意正整数比如 2026。这样每次运行的随机序列被固定下来结果完全一致。正式实验时去掉 rng做 30 次统计。论文里可以同时报告固定种子下的一次运行结果和多次统计的均值标准差比只写一次结果可信得多。有一类玄学是固定种子后结果反而变差那说明参数本身在某个随机种子附近的性能就不稳定更值得关注的是标准差而不是单次好坏。5.3 适应度一路飙升或只有 NaN目标函数写法没对上现象适应度曲线不是下降而是上升或者 gbest_val 直接变成 NaN、Inf。原因目标函数的输入输出约定与主函数不一致。主函数传入的是矩阵逐行代表粒子目标函数如果按单向量设计返回的是标量适应度比较和更新逻辑就全乱套。NaN 的出现通常是目标函数里出现了 log 负数、除零或者 cos 的参数超界Rastrigin 函数里如果 x 超出边界cos 的周期震荡会让适应度骤增看起来像 飙升 。解决先在主函数外单独验证一次目标函数构造一个小矩阵手工算出每行的适应度和目标函数的返回值对比。比如一个 3 x 5 的随机矩阵手算前两行的 Rastrigin 值和函数返回的第 1、2 行对比能直接暴露输入输出约定不匹配。排查 NaN 时把目标函数里可能出现异常的分段打印出来定位是哪个维度越界触发了非法运算。5.4 粒子越走越偏或早熟收敛vmax 和 w 的组合问题现象跑了上百次迭代后所有粒子全都挤到同一个位置gbest_val 停在某个远大于理论最优的值不动或者粒子的位置逐渐超出边界曲线出现奇异抖动。原因早熟收敛是 PSO 最典型的问题本质是粒子群在某一轮被一个当前较优的局部位置吸引所有粒子的速度过快衰减无法跳出局部区域。诱因集中在 w 固定且偏小、c2 偏大、vmax 太小、pop_size 过少这四类它们共同的效果就是群体多样性快速丧失。越走越偏则是 vmax 过大加上边界处理不当粒子飞出了搜索域边界钳位又被某种条件绕过。解决先确认 vmax 在边界宽度的 10% 到 20% 内。再看 w 是否采用了线性递减如果没有先改成 0.9 到 0.4 的递减策略。最后检查 c1 和 c2 的相对关系把 c2 调小到与 c1 相近。排查早熟收敛最有效的调试手段是画所有粒子的位置轨迹图看粒子是不是很快聚成一团。MATLAB 里在迭代主循环中把每代的位置矩阵存下来迭代结束后用plot画出前两维的散点分布能直接看出多样性的丧失速度。5.5 R2023b 到 R2026b 上跑旧代码版本差异的几个注意点现象同一份 PSO 代码在旧版本 MATLAB 上能跑换到新版抛出语法错误或输出结果偏差。原因MATLAB 版本升级带来的语言差异。R2016b 之前脚本文件里不能定义局部函数所有子函数都必须写在独立的 function 文件中R2016b 之后脚本可以包含局部函数但局部函数必须放在脚本末尾。R2016b 引入 string 类型双引号与旧版的 char 数组单引号行为不同字符串拼接和比较方式有差异。绘图相关的旧函数有些在新版中被警告弃用如plot系列的部分参数传递方式。解决如果代码报 脚本中的函数定义必须出现在文件末尾 说明脚本里定义了局部函数但位置不对把函数移到脚本最后即可。新版兼容问题上最直接的排查办法是把报错信息复制到 MATLAB 官方文档里查对应函数的版本变更说明比逐行猜更高效。另外提醒一点新版 MATLAB 对矩阵索引和维度核对更严格旧代码里依赖隐式扩展的行为在新版可能变成运行时错误查错时先确认所有矩阵运算的维度是否一致。6. 惯性权重线性递减一行改动带走的早熟收敛基本 PSO 最容易被人诟病的一点就是它不保证收敛到全局最优实际表现为在多峰函数上频繁早熟。而惯性权重线性递减是我最推荐先做的一个改动它只用一行代码把固定 w 换成随迭代次数从 0.9 降到 0.4 的动态调度。前面第四章给了公式这里补一个具体的验证方法。改动的核心是在迭代循环里每一轮先按当前代数更新 w再代入速度更新公式。固定 w 情况下如果 w 取 0.8前期探索和后期收敛被强制用同一个力度这本身就矛盾。递减策略缓解了这种矛盾。验证方法很简单同一目标函数、同一组 c1/c2/pop_size/vmax分别跑固定 w 0.8 和线性递减 0.9 到 0.4 两组各跑 30 次比较均值、标准差和收敛曲线形态。固定 w 的典型表现是前期下降快、后期平台高递减 w 的曲线前期略慢但最终平台低一两个数量级。再补一个实用的工程习惯做任何 PSO 实验前先画一次收敛曲线确认曲线形态符合预期。曲线应该大致单调下降末期趋于水平。如果曲线出现上升说明目标函数写法或 pbest/gbest 更新逻辑有明显问题不要急着调参数。我自己的血泪经验是调参前先修曲线别拿一套有 bug 的程序去测参数那测出来的都是噪声。最后一句实在话PSO 这算法代码三行、调参三年先跑通、再统计、后调参按这个顺序来能少走一半弯路。希望帮到你。本文还有配套的精品资源点击获取