固定惯性权重无法自适应优化阶段需求:初期需大w增强全局探索,后期需小w提升局部开发与收敛精度,否则易早熟收敛或震荡不收敛。

惯性权重 w 不是固定值,必须动态调整;设成常数(比如 0.729)只适用于极简单函数,实际问题中大概率早熟收敛或震荡不收敛。
为什么不能用固定 w
固定 w 会锁死“探索–开发”平衡:
- w 太大(>0.9)→ 粒子速度衰减慢,容易飞出可行域或绕圈不收敛
- w 太小(w=0.729 在 30 维 Rosenbrock 函数上的失败率超 65%
线性递减策略最稳妥,w_start=0.9, w_end=0.4
这是工业界和多数论文默认方案,实现简单、鲁棒性强:
double w = w_start - (w_start - w_end) * current_iter / max_iter;
- 前 1/3 迭代:
w ∈ [0.9, 0.7],鼓励大步探索,快速覆盖解空间 - 中段:
w ∈ [0.7, 0.55],开始聚焦高潜力区域 - 后 1/3:
w ∈ [0.55, 0.4],精细搜索,避免跳过精确极值点
遇到多峰/噪声函数时,试试非线性衰减
当目标函数存在大量局部极小(如 Rastrigin、Griewank),线性衰减可能仍过早收敛。可换为:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 指数衰减:
w = w_end + (w_start - w_end) * exp(-0.5 * current_iter / max_iter) - 余弦退火:
w = w_end + 0.5 * (w_start - w_end) * (1 + cos(π * current_iter / max_iter)) - 注意:这两种在后期
w下降更缓,能维持一定探索能力,但需配合速度边界v_max同步收紧,否则易发散
别忽略速度边界对 w 效果的实际约束
再好的 w 策略,如果 v_max 没设对,照样失效:
-
v_max一般取位置范围的 10%–20%,例如x ∈ [-5, 5]→v_max = 1.0 - 若
v_max过大(如设为 5.0),即使w已降到 0.4,粒子仍可能因速度残量过大而反复穿越最优区域 - 若
v_max过小(如 0.1),则w再大也带不动粒子,等效于提前冻结
真正卡住 PSO 收敛的,往往不是 w 的公式本身,而是它和 v_max、位置边界、以及目标函数梯度尺度之间的隐式耦合——调参时永远先同步看三者是否匹配。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










