粒子群优化

粒子群优化（Particle Swarm Optimization, PSO），又称粒子群算法、微粒群算法，是由 J. Kennedy 和 R. C. Eberhart 等于1995年开发的一种演化计算技术，来源于对一个简化社会模型的模拟。其中“群（swarm）”来源于微粒群符合 M. M. Millonas 在开发应用于人工生命（artificial life）的模型时所提出的群体智能的5个基本原则。“粒子（particle）”是一个折衷的选择，因为既需要将群体中的成员描述为没有质量、没有体积的，同时也需要描述它的速度和加速状态。

PSO 算法最初是为了图形化地模拟鸟群优美而不可预测的运动。而通过对动物社会行为的观察，发现在群体中对信息的社会共享提供一个演化的优势，并以此作为开发算法的基础。通过加入近邻的速度匹配、并考虑了多维搜索和根据距离的加速，形成了 PSO 的最初版本。之后引入了惯性权重w来更好的控制开发（exploitation）和探索（exploration），形成了标准版本。为了提高粒群算法的性能和实用性，中山大学、（英国）格拉斯哥大学等又开发了自适应（Adaptive PSO）版本和离散（discrete）版本。

PSO 算法属于一种万能启发式算法，能够在没有得知太多问题资讯的情况下，有效的搜寻具有庞大解空间的问题并找到候选解，但同时不保证其找到的最佳解为真实的最佳解。

## 算法原理

PSO 算法是基于群体的，根据对环境的适应度将群体中的个体移动到好的区域。然而它不对个体使用演化算子，而是将每个个体看作是 D 维搜索空间中的一个没有体积的微粒（点），在搜索空间中以一定的速度飞行，这个速度根据它本身的飞行经验和同伴的飞行经验来动态调整。第 i 个微粒表示为 Xi =(xi1, xi2, …, xiD)，它经历过的最好位置（有最好的适应值）记为 Pi = (pi1, pi2, …, piD)，也称为 pbest。在群体所有微粒经历过的最好位置的索引号用符号 g 表示，即 Pg，也称为 gbest。微粒 i 的速度用 Vi = (vi1, vi2, …, viD) 表示。对每一代，它的第 d+1 维（1 ≤ d+1 ≤ D）根据如下方程进行变化：

```
       v<sub>id+1</sub> = w∙v<sub>id</sub>+c<sub>1</sub>∙rand()∙(p<sub>id</sub>-x<sub>id</sub>)+c<sub>2</sub>∙Rand()∙(p<sub>gd</sub>-x<sub>id</sub>)        (1a)
       x<sub>id+1</sub> = x<sub>id</sub>+v<sub>id+1</sub>				              (1b)
```

其中w为惯性权重（inertia weight），c1和c2为加速常数（acceleration constants），rand 和 Rand 为两个在0,1范围里变化的随机值。

此外，微粒的速度 Vi 被一个最大速度 Vmax 所限制。如果当前对微粒的加速导致它的在某维的速度 vid 超过该维的最大速度 vmax,d，则该维的速度被限制为该维最大速度 vmax,d。

对公式（1a），第一部分为微粒先前行为的惯性，第二部分为“认知（cognition）”部分，表示微粒本身的思考；第三部分为“社会（social）”部分，表示微粒间的信息共享与相互合作。

“认知”部分可以由 Thorndike 的效应法则（law of effect）所解释，即一个得到加强的随机行为在将来更有可能出现。这里的行为即“认知”，并假设获得正确的知识是得到加强的，这样的一个模型假定微粒被激励着去减小误差。

“社会”部分可以由 Bandura 的替代强化（vicarious reinforcement）所解释。根据该理论的预期，当观察者观察到一个模型在加强某一行为时，将增加它实行该行为的几率。即微粒本身的认知将被其它微粒所模仿。

PSO 算法使用如下心理学假设：在寻求一致的认知过程中，个体往往记住自身的信念，并同时考虑同事们的信念。当其察觉同事的信念较好的时候，将进行适应性地调整。

标准 PSO 的算法流程如下：

- 初始化一群微粒（群体规模为 m），包括随机的位置和速度。
- 评价每个微粒的适应度。
- 对每个微粒，将它的适应值和它经历过的最好位置 pbest 的作比较，如果较好，则将其作为当前的最好位置pbest。
- 对每个微粒，将它的适应值和全局所经历最好位置 gbest 的作比较，如果较好，则重新设置gbest的索引号。
- 根据方程（1）变化微粒的速度和位置。
- 如未达到结束条件（通常为足够好的适应值或达到一个预设最大代数 Gmax），回到（2）。

## 算法参数

PSO 参数包括：群体规模 m，惯性权重 w，加速常数 c1 和 c2，最大速度 Vmax，最大代数 Gmax。

Vmax 决定在当前位置与最好位置之间的区域的分辨率（或精度）。如果 Vmax 太高，微粒可能会飞过好解，如果 Vmax 太小，微粒不能进行足够的探索，导致陷入局部优值。该限制有三个目的：防止计算溢出；实现人工学习和态度转变；决定问题空间搜索的粒度。

惯性权重w使微粒保持运动的惯性，使其有扩展搜索空间的趋势，有能力探索新的区域。

加速常数 c1 和 c2 代表将每个微粒推向 pbest 和 gbest 位置的统计加速项的权重。低的值允许微粒在被拉回来之前可以在目标区域外徘徊，而高的值导致微粒突然的冲向或者越过目标区域。

如果没有后两部分，即 c1 = c2 = 0，微粒将一直以当前的速度飞行，直到到达边界。由于它只能搜索有限的区域，将很难找到好的解。

如果没有第一部分，即 w = 0，则速度只取决于微粒当前的位置和它们历史最好位置 pbest 和 gbest，速度本身没有记忆性。假设一个微粒位于全局最好位置，它将保持静止。而其它微粒则飞向它本身最好位置 pbest 和全局最好位置 gbest 的加权中心。在这种条件下，微粒群将统计的收缩到当前的全局最好位置，更像一个局部算法。

在加上第一部分后，微粒有扩展搜索空间的趋势，即第一部分有全局搜索的能力。这也使得w的作用为针对不同的搜索问题，调整算法全局和局部搜索能力的平衡。

如果没有第二部分，即 c1 = 0，则微粒没有认知能力，也就是“只有社会（social-only）”的模型。在微粒的相互作用下，有能力到达新的搜索空间。它的收敛速度比标准版本更快，但是对复杂问题，比标准版本更容易陷入局部优值点。

如果没有第三部分，即 c2 = 0，则微粒之间没有社会信息共享，也就是“只有认知（cognition-only）”的模型。因为个体间没有交互，一个规模为m的群体等价于m个单个微粒的运行。因而得到解的几率非常小。

### 收敛性

收敛性的数学证明帮助了 PSO 的发展和应用，但此类分析具有很大的局限性。为 PSO 加入正交学习后，算法的全局收敛、收敛精度及稳健可靠性都得到了提高。

近年来，为了提升PSO求解大规模高维优化问题的能力，竞争学习PSO（Competitive Swarm Optimizer，CSO）和层次学习（Level-based Swarm Optimizer，LLSO）等相继被提出，被从理论和数值实验验证了算法平衡全局探索和局部开发的能力。此外，在分布式多智能体的共识优化场景中，基于内外部学习机制的PSO算法（Multi-Agent Swarm Optimization With Adaptive Internal and External Learning，MASOIE）也被提出，并在理论上证明了该方法的共识收敛性。

### 离散化

传统的PSO算法一般用于求解连续空间的优化问题。有多种方法可以尝试将PSO应用于求解离散空间的组合优化问题，例如采用二进制编码的二进制PSO，以及将速度和位置更新公式在带概率的集合空间中重定义的集合型PSO（set-based PSO）。

## 外部链接

- DMOZ Particle Swarm People
- PSO源代码链接
- Parameter Estimation of a Pressure Swing Adsorption Model for Air Separation Using Multi-objective Optimisation and Support Vector Regression ModelYang Liu 2013
- Automatic calibration of a rapid flood spreading model using multiobjective optimisations -Yang Liu 2013
- https://web.archive.org/web/20160507233728/http://userweb.eng.gla.ac.uk/yun.li/ga_demo/（格拉斯哥大学的交互式群体演化在线学习课件 EA_demo，可以帮助读者更好地理解进化及粒群算法，允许用户直接在网页上一代一代地手动运行，以看进化算法是怎样一步一步操作的，亦可在背景中批次运行，以观察算法的收敛和个体是否跳出局部最优）