总体概述
粒子群优化 (PSO) 是一种基于种群的随机搜索方法。种群中每个个体或粒子的位置代表了优化问题的可能解决方案。
搜索空间中给定位置的好坏/得分由目标函数衡量,目标函数是被优化的函数。
粒子在搜索空间中移动以寻找最优解。
粒子在搜索中移动的方式就是魔法发生的地方。假设您使用的是惯性权重模型,这由三个不同的因素控制:惯性分量、社会分量和认知分量。
惯性分量本质上引入了一种动量形式,因此粒子的运动从一次迭代到下一次迭代不会太不稳定。认知组件允许粒子记忆其先前在哪里找到了影响其运动方向的良好解决方案。社交组件允许其他群体成员的知识(即群体的其他成员找到好的解决方案的地方)来影响粒子的运动。
更新方程
在迭代t中,给定粒子的位置由x(t)表示。其下一次迭代的新位置根据以下公式计算:
x(t+1) = x(t) + v(t+1)
其中v(t+1)表示粒子在下一次迭代中的速度。请注意,上面的每个值都是向量。这些向量的长度将等于问题维数/目标函数的输入变量数。(为我糟糕的符号道歉;我没有足够的声誉来发布漂亮的方程式)。粒子的速度根据以下公式计算:
v(t+1) = w*v(t) + c1*r1*(pBest(t) - x(t)) + c2*r2*(gBest(t) - x(t))
前面描述的三个不同的组成部分(惯性、认知和社会)分别由上述等式中的三个项之一表示。
w称为惯性权重,调节动量分量的影响。c1和c2是认知和社会加速系数,它们分别调节认知和社会成分的重要性。r1 和 r2 是随机数向量(从 0 到 1 之间的 unifrom 分布中采样),用于缩放差异向量的每个分量。
第一个差分向量(pBest(t) - x(t))允许粒子移动到其个人最佳/pBest - 粒子迄今为止遇到的最佳位置。(为了实现该算法,因此粒子有必要检查它遇到的每个位置并保存它,如果它是迄今为止最好的)。
第二个差分向量(gBest(t) - x(t))允许粒子使用来自群体中其他粒子的信息。在这个表达式中,gBest(t)表示到目前为止 swarm 找到的最佳位置。(所以为了实现,在每次迭代之后,应该检查所有粒子的分数,以便保存最好的粒子以供将来使用)。
粒子根据这些方程在搜索空间中移动多次迭代,直到希望它们都收敛到同一点。然后可以将全局最佳作为算法产生的最终解决方案。
希望这能让 PSO 的内部工作更加清晰。在每次迭代中,每个粒子都会朝着由其个人最佳和全局最佳决定的方向移动。假设目标函数的最优值在这两个点附近,那么粒子很可能最终会遇到越来越好的解。
其他注意事项
请注意,上述过程有许多不同的变化。例如,可以只允许在群体粒子的一个子集之间共享知识。给定粒子可以与之通信的粒子子集称为其邻域。然后粒子将朝着在其附近找到的最佳解决方案的方向移动,即“局部最佳”而不是全局最佳。
此外,还有许多其他可能的陷阱,例如w、c1和c2的值。尽管在这里可以做一些花哨的事情,但一般的经验法则是设置:
w = 0.729844
c1 = c2 = 1.49618
正如http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=870279&tag=1所建议的那样导致收敛行为(即,所有粒子最终将收敛到大致相同的点)。
通常,粒子在整个搜索空间中随机初始化。尽管也可以随机初始化它们的速度,但这不是必需的,并且可能会导致不同的行为,因此只需将速度作为 0 向量开始就可以了。
一些人还建议使用速度钳制(其中每个速度分量的上下都以某个最大值和最小值为界;如果粒子的速度超过该值,则将其钳制为最大/最小值)。如果w、c1和c2选择正确并且 gBest 和 pBest 仅在它们在搜索空间的范围内时更新,这通常是不必要的。