粒子群优化中的粒子是一份候选解,用自身历史最优和群体信息调整搜索位置。它不自动等于多智能体强化学习。先把一次更新算正确,比直接修改一堆超参数更有用。下面采用一维自造输入,逐项核对速度和位置。
写清楚同一时刻的数据
标准全局最佳形式可写为 v新=w·v旧+c1·r1·(pbest−x)+c2·r2·(gbest−x),再用 x新=x+v新 更新位置。PySwarms 后端文档中的速度与位置操作分开,实际拓扑和边界处理仍应查对应实现。下面固定随机系数用于算术检查,而不是按真实优化迭代重新随机采样。

| 输入 | 值 | 作用 |
|---|---|---|
| 当前位置 x | 4 | 当前候选解 |
| 旧速度 v | 1 | 之前的运动量 |
| 个体最优 pbest | 2 | 该粒子历史上最好的位置 |
| 群体最优 gbest | 1 | 群体当前共享的最好位置 |
| w/c1/c2 | 0.5 / 1.5 / 1.5 | 三个项的系数 |
| r1/r2 | 0.2 / 0.4 | 本次固定的随机系数 |
惯性项为 0.5,个体项为 -0.6,群体项为 -1.8,合计新速度 -1.9;新位置为 2.1。不能先把 x 更新了,再拿新 x 去算另外两个项,否则已不是同一步公式。
运行一步数值核对
保存 particle_step.py,用 Python 3 运行 python particle_step.py。数学演示只依赖标准库,不需要安装 PySwarms。
from math import isclose
x, velocity = 4.0, 1.0
personal, global_best = 2.0, 1.0
w, c1, c2, r1, r2 = 0.5, 1.5, 1.5, 0.2, 0.4
parts = [w * velocity, c1 * r1 * (personal - x), c2 * r2 * (global_best - x)]
new_velocity = sum(parts)
new_position = x + new_velocity
print([round(v, 3) for v in parts], round(new_velocity, 3), round(new_position, 3))
assert isclose(new_velocity, -1.9) and isclose(new_position, 2.1)
objective = lambda z: (z - 1.0) ** 2
print("cost before/after:", objective(x), objective(new_position))
应得到速度 -1.9、位置 2.1。演示目标 (x−1)² 的成本从 9 降到约 1.21,这只说明这一步朝更低成本移动,不证明以后每一步成本都下降。粒子算法允许位置走坏,历史最优只有在新成本确实更小时才更新。
扩展成迭代时要检查什么
完整流程是初始化各粒子位置与速度、计算成本、更新各自最优与群体最优、采样随机系数、更新速度位置,再重新评估。保存最佳解的副本,避免位置数组原地变化把历史最优一起改掉。多维任务需要逐维向量运算,并保证随机系数的维度符合算法约定。
越界时如何反弹、截断或重新采样,会改变实际搜索行为;任务分配等离散问题也不能直接把连续位置当执行者编号。参数和拓扑需要在实际目标上评估。本例没有完整群体迭代、约束优化或收敛测试,下一步可以用一个已知最小值的二维函数核对完整循环。
资料与核对依据
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33003.html