MCM520 ← 资料站首页 粒子群算法 PSO · 深度手册 打开交互阅读器 →

粒子群算法 PSO · 深度手册

分类:优化类 | 难度:★★☆ 进阶 | 编号:pso

一、这是什么(一句话用途)

连续空间全局优化(参数寻优)

二、核心思想

粒子群(PSO)受鸟群觅食启发:每个"粒子"代表一个候选解,它在搜索空间中飞行,飞行速度和方向由历史经验决定——既受自己找到过的最好位置(pbest)吸引,也受整个群体找到的最好位置(gbest)吸引。相比 GA,PSO 没有交叉变异,靠"社会-认知"双引力连续微调,实现简单、参数少、收敛快;缺点是后期易在局部最优附近群聚(早熟),需靠惯性权重等机制维持探索。

三、数学原理与推导

第 ii 个粒子位置 xix_i、速度 viv_i。迭代更新:

vi(t+1)=w vi(t)+c1r1(pbesti−xi(t))+c2r2(gbest−xi(t)) v_i(t+1)=w\,v_i(t)+c_1 r_1\big(pbest_i-x_i(t)\big)+c_2 r_2\big(gbest-x_i(t)\big)
xi(t+1)=xi(t)+vi(t+1) x_i(t+1)=x_i(t)+v_i(t+1)

其中 ww 为惯性权重(平衡全局探索与局部开发),c1,c2c_1,c_2 为认知/社会学习因子,r1,r2∼U(0,1)r_1,r_2\sim U(0,1) 为随机扰动。第一项是动量,保持原方向;第二项拉向自身历史最优;第三项拉向群体最优。速度常加 clamp 限制 ∣vi∣≤vmax⁡|v_i|\le v_{\max} 防发散。gbest 收敛处即当前全局最优估计。惯性权重常线性递减 w=wmax⁡−(wmax⁡−wmin⁡)t/Tmax⁡w=w_{\max}-(w_{\max}-w_{\min})t/T_{\max}。

四、建模 / 求解步骤

  1. 初始化粒子群
  2. 评适应度
  3. 更新 pbest/gbest
  4. 更新速度 / 位置
  5. 迭代收敛

五、关键公式速查

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.

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。