粒子群算法 PSO · 深度手册
分类:优化类 | 难度:★★☆ 进阶 | 编号:
pso
一、这是什么(一句话用途)
连续空间全局优化(参数寻优)
二、核心思想
粒子群(PSO)受鸟群觅食启发:每个"粒子"代表一个候选解,它在搜索空间中飞行,飞行速度和方向由历史经验决定——既受自己找到过的最好位置(pbest)吸引,也受整个群体找到的最好位置(gbest)吸引。相比 GA,PSO 没有交叉变异,靠"社会-认知"双引力连续微调,实现简单、参数少、收敛快;缺点是后期易在局部最优附近群聚(早熟),需靠惯性权重等机制维持探索。
三、数学原理与推导
第 个粒子位置 、速度 。迭代更新:
其中 为惯性权重(平衡全局探索与局部开发), 为认知/社会学习因子, 为随机扰动。第一项是动量,保持原方向;第二项拉向自身历史最优;第三项拉向群体最优。速度常加 clamp 限制 防发散。gbest 收敛处即当前全局最优估计。惯性权重常线性递减 。
四、建模 / 求解步骤
- 初始化粒子群
- 评适应度
- 更新 pbest/gbest
- 更新速度 / 位置
- 迭代收敛
五、关键公式速查
v=w·v+c1·r1·(pbest−x)+c2·r2·(gbest−x)
六、典型示例
神经网络超参、函数极值寻优。
完整算例(数字演示,照着算一遍)
场景:min f(x)=Σx_i²(2 维),粒子 30,c1=c2=1.5,w=0.7。
收敛:约 200 代后 x≈(0.01,−0.02), f≈0.0005。
结论:粒子群靠社会 + 认知项快速收敛到原点。
七、Python 实现示例
import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","pso.csv"))
pts = df[["x","y"]].to_numpy(dtype=float)
rng=np.random.default_rng(3)
pos=rng.uniform(-5,5,(20,1)); vel=np.zeros((20,1)); pbest=pos.copy(); pval=pts[np.argmin(np.abs(pts[:,0]-pos[:,0]),axis=0),1]
gbest=pos[np.argmin(pval)]; gval=pts[np.argmin(np.abs(pts[:,0]-gbest[:,0]),axis=0),1] if False else min(pval)
for _ in range(100):
# 用解析式 f(x)=x^2 演示
f=lambda x:x**2
cur=f(pos)
pbest[cur<pval]=pos[cur<pval]; pval=np.minimum(pval,cur)
gbest=pbest[np.argmin(pval)]; gval=pval.min()
vel=0.7*vel+1.5*rng.random((20,1))*(pbest-pos)+1.5*rng.random((20,1))*(gbest-pos)
pos+=vel
print("PSO 最优 x=%.3f f=%.3f"%(gbest,gval))
配套文件:
py_pso.py(需 numpy / pandas;与下方数据集配套练习)
八、MATLAB 实现示例
%% 粒子群示例(MATLAB/Octave)
pts = readmatrix('..\datasets\pso.csv');
rng(3); pos=rand(20,1)*10-5; vel=zeros(20,1);
pbest=pos; pval=pos.^2; [gval,gi]=min(pval); gbest=pos(gi);
for i=1:100
cur=pos.^2;
pbest(cur<pval)=pos(cur<pval); pval=min(pval,cur);
[gval,gi]=min(pval); gbest=pos(gi);
vel=0.7*vel+1.5*rand(20,1).*(pbest-pos)+1.5*rand(20,1).*(gbest-pos);
pos=pos+vel;
end
fprintf('PSO 最优 x=%.3f f=%.3f\n', gbest, gval);
配套文件:
m_pso.m(基础 MATLAB / Octave 即可运行)
九、练手数据集(可下载)
25 个 (x, f(x)=x²) 采样点。用于粒子群算法寻全局最小。
- 字段:x, y
- 行数:25 行
- 下载:
pso.csv
十、常见误区与避坑清单
- 惯性权重 w 调节收敛
- 易陷局部(加扰动)
- 边界要处理
十一、结果怎么解读
gbest 即当前最优解。
十二、常与谁搭配
与 GA 互补。
十三、论文写作技巧(怎么把它写进论文)
把 粒子群算法 PSO 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。
1. 动机怎么写(为什么用它而不是别的)
先把问题「数学化」:决策变量、目标函数、约束条件——这一步写清楚比算法本身更重要。再说明为何用 粒子群算法 PSO 求解:连续可导用梯度 / 解析法,组合 / 非凸 / 黑箱用启发式(GA / PSO / SA)。
2. 结果怎么写(图表与指标)
放「收敛曲线(迭代 vs 目标值)」+「最优解参数表」+「约束是否满足」三件套。若是多目标,放 Pareto 前沿散点图。
3. 可直接套用的写作话术
- 中文模板:针对<问题>,本文采用 粒子群算法 PSO 进行连续空间全局优化(参数寻优)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
- 英文模板:To address
, we adopt 粒子群算法 PSO to 连续空间全局优化(参数寻优). Benefiting from its ability to , it outperforms on .
4. 同类易踩的写作坑
务必说明约束是否全部满足、是否陷入局部最优(可多次随机初始化对比);别把无约束结果当约束最优报。
5. 典型论文段落范例(可直接参考 / 改写)
下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。
将配送中心选址建模为带容量约束的总成本最小化问题,本文采用 粒子群算法 PSO 求解,得到 5 个选址及其服务分配方案,目标值较贪婪启发式降低 12.4%,且全部约束满足。
We formulate the distribution center location as a total-cost minimization problem with capacity constraints and solve it via 粒子群算法 PSO, yielding 5 sites and their service assignments. The objective is 12.4% lower than a greedy heuristic while satisfying all constraints.
十四、相关手册(延伸阅读)
- 遗传算法 GA · 优化类
十五、本手册导航
本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。