粒子群优化(particle swarm optimization, PSO)算法 是由 Kennedy, J.和 Eberhart, R. (1995) 提出的一种群智能计算方法,与更著名且经典的遗传算法类似,同为进化算法。
一个系统里面有若干个粒子,每个粒子代表一个问题的候选解,而这些粒子在系统的控制下根据一定的方法进行迭代更新(进化),直到最后系统会输出全局最优解。更详细地,在算法的运行过程中,这些维护中的粒子以一定的策略在解空间进行搜索,并且把搜索结果放入目标函数进行衡量,如果结果更优则会被记录下来,以用于进一步的进化。达到一定的条件(确定的迭代次数或一定程度的目标值),算法就会停止,并输出此时获得的最优解。
值得一提的是,PSO 所获得的解并不是理论上的最优解。因为对于诸多所谓的 NP-hard 问题(就是说使用确定性算法时间复杂度会非常高,高到不能接受)情况下,实际并不需要理论最优解,而只需要一个满足一定条件,符合工程需求的次最优解就能解决问题。而 PSO 所获得的正是这样的一个次最优解。
下面具体看看算法。PSO 核心公式有两个:速度更新公式与位置更新公式。
在公式(1)中,Vid( t+1) 表示第 i 个粒子的第 d 维在 (t+1)时刻的速度值,pid 为 第 i 个粒子第 d 维时刻的个体最优, pgd 为当前种群内的全局最优, xid 则为该粒子当前的位置。除此, c1, c2 表示两个参数,被称为个体学习因子与全局(环境)学习因子,r1, r2 为随机数,在0-1之间。
公式(2)更好理解,一个速度 vid 与当前位置 xid 相加,获得新的位置 xid。
PSO是模拟鸟群的算法,有一堆哲学上的说明与数学上的证明,这里都不说。只要记住上面两个公式,慢慢就会全方位理解 PSO 的设计思想。
算法的具体步骤如下
- 初始化一群粒子,随机初始位置与速度
- for T 个循环
- for 每个粒子
- 用(1)更新速度,用(2)更新位置