粒子群
一、直观理解:一群鸟根据自己与同伴的记忆朝食源飞
粒子群优化(Particle Swarm Optimization, PSO)把每个候选解看作搜索空间中的「粒子」,粒子有位置 与速度 。每一代根据:
- 个体最优 :自己历史最好位置;
- 全局最优 :群体历史最好位置;
更新速度并移动。像鸟群既记得自己找到过的好点,也受同伴成功经验牵引。
PSO 主要面向连续实数优化,实现简单、参数不多,但同样是随机启发式,不保证全局最优。
定位(必读):仅作兜底。光滑可微问题优先梯度/
fmincon;凸问题优先凸求解器。PSO 用于多峰、不可微或黑箱连续优化,且必须报告种子、多次运行与基线(多起点局部搜索等)。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 连续参数标定、多峰函数、目标不可微或差分昂贵;维数中等(几十维内更常见)。 |
| 核心优点 | 无需求导;信息共享快;实现短;易与边界处理结合。 |
| 局限与缺点 | 易早熟收敛;高维性能下降;离散问题需改编码;约束处理依赖罚函数;不可证明最优。 |
动用前:能否 fmincon 多初值?能否贝叶斯优化/直接搜索?有无物理界与合理缩放?
三、核心原理
1. 标准更新
- :惯性权重(可从 0.9 降到 0.4);
- :认知/社会系数,常取 左右;
- 分量独立。
2. 速度钳制与边界
;位置越界则拉回边界并修正速度(置 0 或反射)。
3. 拓扑
全局版所有粒子共享一个 ;局部版只看邻域最优,多样性更好、收敛更慢。
4. 约束
或 Deb 可行性优先规则:可行优于不可行;不可行比违反程度。
四、关键决策
1. 基线
多起点 fmincon/fminsearch、随机采样最好值。PSO 应在相同评价次数预算下比较。
2. 变量缩放
各维数量级差大会导致速度失衡,应归一化到 再映射回原空间。
3. 参数与种群
粒子数 常用;迭代 。报告 。
4. 复现实验
次独立 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. 光滑单峰问题弃用牛顿/fminunc
效率与可靠性通常更差。
2. 不设边界与
粒子飞飞飞飞出有效区。
3. 一次运行定论
PSO 方差可能很大。
4. 把 gbest 曲线下降当全局收敛证明
只是群体记忆在改进。
5. 整数决策强行 PSO 再取整
可行性与最优性双失,改 IP。
6. 无基线的「显著优越」
无法评审。
八、小结
粒子群优化的核心思想可以概括为:
一群带速度的连续解在个体记忆与群体记忆牵引下更新位置,以启发式搜索多峰或黑箱目标的近优解。
它在智能优化工具箱中适合连续兜底场景。使用纪律与 GA/SA 相同:精确与局部方法优先,种子与多次运行必报,基线对比必做,措辞保持「候选近优」。