跳到主要内容

粒子群

一、直观理解:一群鸟根据自己与同伴的记忆朝食源飞​

粒子群优化(Particle Swarm Optimization, PSO)把每个候选解看作搜索空间中的「粒子」,粒子有位置 xix_i 与速度 viv_i。每一代根据:

  • 个体最优 pbestipbest_i:自己历史最好位置;
  • 全局最优 gbestgbest:群体历史最好位置;

更新速度并移动。像鸟群既记得自己找到过的好点,也受同伴成功经验牵引。

PSO 主要面向连续实数优化,实现简单、参数不多,但同样是随机启发式,不保证全局最优。

定位(必读):仅作兜底。光滑可微问题优先梯度/fmincon;凸问题优先凸求解器。PSO 用于多峰、不可微或黑箱连续优化,且必须报告种子、多次运行与基线(多起点局部搜索等)。

二、适用场景与优缺点​

类型说明
适用场景连续参数标定、多峰函数、目标不可微或差分昂贵;维数中等(几十维内更常见)。
核心优点无需求导;信息共享快;实现短;易与边界处理结合。
局限与缺点易早熟收敛;高维性能下降;离散问题需改编码;约束处理依赖罚函数;不可证明最优。

动用前:能否 fmincon 多初值?能否贝叶斯优化/直接搜索?有无物理界与合理缩放?

三、核心原理​

1. 标准更新​

vi←ωvi+c1r1(pbesti−xi)+c2r2(gbest−xi)xi←xi+vi\begin{aligned} v_i&\leftarrow \omega v_i+c_1 r_1(pbest_i-x_i)+c_2 r_2(gbest-x_i)\\ x_i&\leftarrow x_i+v_i \end{aligned}
  • ω\omega:惯性权重(可从 0.9 降到 0.4);
  • c1,c2c_1,c_2:认知/社会系数,常取 22 左右;
  • r1,r2∼U(0,1)r_1,r_2\sim U(0,1) 分量独立。

2. 速度钳制与边界​

∣v∣≤vmax⁡|v|\le v_{\max};位置越界则拉回边界并修正速度(置 0 或反射)。

3. 拓扑​

全局版所有粒子共享一个 gbestgbest;局部版只看邻域最优,多样性更好、收敛更慢。

4. 约束​

F(x)=f(x)+ρ∥max⁡(0,h(x))∥2F(x)=f(x)+\rho\| \max(0,h(x)) \|^2

或 Deb 可行性优先规则:可行优于不可行;不可行比违反程度。

四、关键决策​

1. 基线​

多起点 fmincon/fminsearch、随机采样最好值。PSO 应在相同评价次数预算下比较。

2. 变量缩放​

各维数量级差大会导致速度失衡,应归一化到 [−1,1][-1,1] 再映射回原空间。

3. 参数与种群​

粒子数 20∼5020\sim 50 常用;迭代 100∼1000100\sim 1000。报告 ω,c1,c2\omega,c_1,c_2。

4. 复现实验​

N≥10N\ge 10 次独立 rng;给 best/mean/std。

5. 离散问题​

不要生硬 PSO 后四舍五入完事;0-1 问题优先 IP。

五、MATLAB 示例​

手写 PSO + 与多起点局部搜索对比​

% Rastrigin 函数(多峰)
ras = @(x) 10*numel(x) + sum(x.^2 - 10*cos(2*pi*x));
n = 5;
lb = -5.12*ones(1,n); ub = 5.12*ones(1,n);

% ---- 基线:随机多起点 fmincon ----
baseF = inf;
for k = 1:25
rng(2000+k);
x0 = lb + rand(1,n).*(ub-lb);
opts = optimoptions("fmincon", "Display", "off", "Algorithm", "sqp");
[~, fk] = fmincon(@(x) ras(x(:)'), x0, [], [], [], [], lb, ub, [], opts);
baseF = min(baseF, fk);
end
fprintf("多起点 fmincon 基线最好 = %.6f\n", baseF);

% ---- PSO 多次 ----
nRuns = 15; fRec = zeros(nRuns,1); seeds = 9000+(1:nRuns);
for run = 1:nRuns
rng(seeds(run));
N = 30; maxIt = 120;
w = 0.7; c1 = 1.5; c2 = 1.5;
vmax = 0.2*(ub-lb);
X = lb + rand(N,n).*(ub-lb);
V = zeros(N,n);
pbest = X; fp = arrayfun(@(i) ras(X(i,:)), 1:N)';
[fg, gi] = min(fp); gbest = pbest(gi,:);
for it = 1:maxIt
for i = 1:N
r1 = rand(1,n); r2 = rand(1,n);
V(i,:) = w*V(i,:) + c1*r1.*(pbest(i,:)-X(i,:)) + c2*r2.*(gbest-X(i,:));
V(i,:) = max(min(V(i,:), vmax), -vmax);
X(i,:) = min(max(X(i,:) + V(i,:), lb), ub);
fi = ras(X(i,:));
if fi < fp(i)
fp(i) = fi; pbest(i,:) = X(i,:);
if fi < fg, fg = fi; gbest = X(i,:); end
end
end
w = 0.9 - 0.5*it/maxIt; % 线性递减惯性
end
fRec(run) = fg;
end
fprintf("PSO %d 次: best=%.6f mean=%.6f std=%.6f\n", ...
nRuns, min(fRec), mean(fRec), std(fRec));
fprintf("种子: "); disp(seeds);
fprintf("相对基线: PSO_best - base = %.6f (负表示更好)\n", min(fRec)-baseF);

工具箱 particleswarm​

fun = @(x) ras(x);
opts = optimoptions("particleswarm", "Display", "off", ...
"SwarmSize", 30, "MaxIterations", 120);
vals = zeros(10,1);
for r = 1:10
rng(100+r);
[~, vals(r)] = particleswarm(fun, 5, lb, ub, opts);
end
fprintf("particleswarm best/mean/std = %.4f/%.4f/%.4f\n", ...
min(vals), mean(vals), std(vals));

六、如何解释结果​

报告清单:

  1. 为何不用梯度/凸方法;
  2. 维数、边界、缩放;
  3. 种群、迭代、ω,c1,c2\omega,c_1,c_2、速度限制;
  4. 种子与统计指标;
  5. 同预算基线对比;
  6. 最终 xx 的业务解释与约束满足情况;
  7. 声明近优、非证明最优。

七、常见误区​

1. 光滑单峰问题弃用牛顿/fminunc​

效率与可靠性通常更差。

2. 不设边界与 vmax⁡v_{\max}​

粒子飞飞飞飞出有效区。

3. 一次运行定论​

PSO 方差可能很大。

4. 把 gbest 曲线下降当全局收敛证明​

只是群体记忆在改进。

5. 整数决策强行 PSO 再取整​

可行性与最优性双失,改 IP。

6. 无基线的「显著优越」​

无法评审。

八、小结​

粒子群优化的核心思想可以概括为:

一群带速度的连续解在个体记忆与群体记忆牵引下更新位置,以启发式搜索多峰或黑箱目标的近优解。

它在智能优化工具箱中适合连续兜底场景。使用纪律与 GA/SA 相同:精确与局部方法优先,种子与多次运行必报,基线对比必做,措辞保持「候选近优」。