2. PSO数学原理与算法流程

粒子群优化(PSO)的核心思想可以用一句话概括:每个候选解是一只“鸟”,它在解空间中飞行,速度由“自己飞过的最好位置”和“群体目前发现的最好位置”共同牵引。要把这句话变成可运行的算法,需要把“位置、速度、个体最优、全局最优”写成向量形式的递推公式,并明确每个符号的维度与含义。

速度—位置更新公式的推导

设搜索空间为 D 维,第 i 个粒子在第 t 次迭代时的位置为 xi(t) = (xi1, xi2, …, xiD),速度为 vi(t)。记该粒子历史最优位置为 pi(个体最优 pbest),整个种群历史最优位置为 pg(全局最优 gbest)。标准 PSO 的更新式为:

v_i(t+1) = w · v_i(t)
         + c1 · r1 · (p_i - x_i(t))
         + c2 · r2 · (p_g - x_i(t))
x_i(t+1) = x_i(t) + v_i(t+1)

三项各有明确物理含义。第一项 w·vi(t) 是惯性项,保留上一时刻的运动趋势,使粒子具有“记忆”和探索能力;第二项 c1·r1·(pi−xi) 是认知项,把粒子拉向自己曾经找到的最好点,体现个体经验;第三项 c2·r2·(pg−xi) 是社会项,把粒子拉向群体最优,体现信息共享。r1、r2 是 [0,1] 上均匀分布的随机数,逐维独立采样,正是这种随机性让粒子不会沿直线机械收敛,而是在最优解附近保持扰动。

从差分角度看,若忽略随机项,更新式近似于 xi(t+1) = xi(t) + w·vi(t) + c1(pi−xi) + c2(pg−xi),即粒子位置被三个“吸引中心”加权牵引。当 w、c1、c2 取值使系统阻尼足够时,粒子会在 pi 与 pg 之间振荡收敛;阻尼不足则持续震荡甚至发散。这解释了为什么参数整定本质上是在调节“惯性—吸引”的平衡。

惯性权重、学习因子与种群拓扑

惯性权重 w 控制探索与开发的权衡。w 较大(如 0.9)时粒子保持高速,利于全局搜索;w 较小(如 0.4)时速度衰减快,利于局部精细搜索。常用策略是线性递减:w(t) = wmax − (wmax−wmin)·t/Tmax,例如从 0.9 降到 0.4。也有采用非线性递减或自适应调整的做法。

学习因子 c1、c2 分别调节个体经验与社会经验的权重。经典取值 c1 = c2 = 2.0,此时 c1+c2 = 4,配合 w<1 可获得较好的收敛性。若 c1 偏大,粒子更“自信”,群体收敛慢但多样性好;若 c2 偏大,粒子过快涌向 gbest,易早熟陷入局部最优。工程上常令 c1 递减、c2 递增,使前期重探索、后期重收敛。

种群拓扑决定“社会项”中 pg 的来源。全局版 PSO 中所有粒子共享同一个 gbest,信息传播快但易早熟;局部版 PSO 中每个粒子只与若干邻居比较,取邻域最优 pl 替代 pg,信息传播慢但多样性保持好。常见拓扑有环形(每个粒子连接左右各 k 个邻居)、星形(全连接,即全局版)、冯·诺依曼网格等。拓扑的数学表达可写为邻域集合 Ni,社会项变为 c2·r2·(pl,i−xi),其中 pl,i = argminj∈Ni f(pj)。

速度更新的三项合成 x_i(t) w·v_i(t) 惯性 p_i (pbest) c1·r1·(p_i−x_i) p_g (gbest) c2·r2·(p_g−x_i) v_i(t+1) 合成 标准 PSO 流程 初始化 x、v、pbest 计算适应度 f(x_i) 更新 pbest / gbest 按公式更新 v、x 边界处理与 w 更新 满足终止条件? 否:t = t+1 输出 gbest

标准 PSO 伪代码与实现要点

把上述公式组织成循环结构,就得到标准 PSO 的伪代码。下面给出可直接对照实现的版本,其中边界处理采用“越界截断到边界并置速度为零”的常见做法:

输入:种群规模 N,维度 D,最大迭代 T_max,w_max, w_min, c1, c2
输出:全局最优位置 gbest 及其适应度 f(gbest)

for i = 1 to N:
    x[i] ← 在 [X_min, X_max] 内均匀随机初始化
    v[i] ← 在 [−V_max, V_max] 内均匀随机初始化
    p[i] ← x[i]
    f_p[i] ← f(x[i])
gbest ← argmin_i f_p[i]

for t = 1 to T_max:
    w ← w_max − (w_max − w_min) · t / T_max
    for i = 1 to N:
        for d = 1 to D:
            r1, r2 ← U(0,1)
            v[i][d] ← w·v[i][d]
                     + c1·r1·(p[i][d] − x[i][d])
                     + c2·r2·(gbest[d] − x[i][d])
            v[i][d] ← clamp(v[i][d], −V_max, V_max)
            x[i][d] ← x[i][d] + v[i][d]
            if x[i][d] < X_min or x[i][d] > X_max:
                x[i][d] ← clamp(x[i][d], X_min, X_max)
                v[i][d] ← 0
        f_x ← f(x[i])
        if f_x < f_p[i]:
            p[i] ← x[i]; f_p[i] ← f_x
            if f_x < f(gbest):
                gbest ← x[i]
return gbest

实现时有几个容易出错的细节。第一,r1、r2 必须逐维独立采样,若整个粒子共用一个随机数,搜索方向会被限制在 pi 与 pg 的连线上,多样性骤降。第二,速度上限 Vmax 常取搜索范围的 10%~20%,过大导致粒子飞出可行域,过小导致搜索停滞。第三,pbest 与 gbest 的更新时机应在位置更新并计算适应度之后,且 gbest 的比较对象是当前粒子的新 pbest,而非旧值。第四,惯性权重 w 的递减应在每轮迭代开始时统一计算,而不是每个粒子单独计算。

一个可手算的示例

为便于理解,取 D=1、N=2 的简化示例(示例参数为教学假设,非实测结果)。搜索范围 [−10,10],f(x)=x²,w=0.8,c1=c2=2.0。初始 x1=6、v1=1,x2=−4、v2=−1,则 p1=6、p2=−4,gbest=−4(因 f(−4)=16 < f(6)=36)。

对粒子 1,设 r1=0.5、r2=0.5,则 v1(1)=0.8×1 + 2×0.5×(6−6) + 2×0.5×(−4−6)=0.8+0−10=−9.2,x1(1)=6−9.2=−3.2。对粒子 2,设 r1=0.5、r2=0.5,v2(1)=0.8×(−1)+2×0.5×(−4+4)+2×0.5×(−4+4)=−0.8,x2(1)=−4−0.8=−4.8。可见粒子 1 被 gbest 强烈牵引而大幅左移,粒子 2 因已在 pbest 与 gbest 处而仅受惯性影响。这一轮后 f(−3.2)=10.24、f(−4.8)=23.04,gbest 更新为 −3.2。手算一轮即可看出:社会项主导了远离最优的粒子,而惯性项决定了已接近最优的粒子是否继续漂移。

调参时建议先固定 c1=c2=2.0、w 线性递减 0.9→0.4,观察收敛曲线;若早熟,优先增大种群规模或改用环形拓扑;若收敛过慢,再考虑提高 c2 或降低 wmin。每次只改一个参数,才能判断变化来源。