粒子群优化算法(PSO)是一种进化计算技术,源于对鸟群捕食行为的研究。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物及群活动行为观察的基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
粒子群算法,也称粒子群优化算法或鸟群觅食算法,缩写为PSO,是一种新的进化算法。PSO算法属于进化算法中的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质,但是比遗传算法规则更为简单,并没有遗传算法的”交叉“和”变异“操作,它通过追随当前搜索到的最优质来寻找全局最优。这种算法以其容易实现、精度高、收敛快等优点引起重视,并在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。
PSO模拟的是鸟群的捕食行为。设想场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有鸟都不知道食物在哪里。但是他们知道当前的位置距离食物还有多远。那么找到食物的最优策略是什么?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
鸟群在整个搜寻过程中,通过相互传递各自的信息,让其他鸟知道自己当前的位置,通过这样的协作来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终整个鸟群都能聚集在食物源的周围,即找到了最优解。
PSO中,每个优化问题的解都是搜索空间的一只鸟,我们称之为“粒子”。所有的粒子都有一个被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解,在每一次迭代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值。另一个极值是整个种群目前找到的最优解,这个极值是全局机制。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
粒子群算法的基本思想是通过群体中个体之间的协作和信息共享来寻找最优解。试想一群鸟在寻找食物,在这个区域中只有一种虫子,所有鸟都不知道虫子在哪。但是它们知道自己的当前位置距离食物有多远,同时他们知道离食物最近的鸟的位置。那么这时候会发生什么?鸟群中每只鸟都会朝距离虫子最近的鸟的方向移动。同时各只鸟在位置不停变化的时候离食物的距离也不断变化,所以每个鸟一定有过离食物最近的位置,这是他们的一个参考。
所以粒子群算法就是把鸟看成一个个粒子,并且他们拥有位置和速度两个属性,然后根据自身已经找到的离食物最近的解和参考整个共享于整个集群中找到的最近的解去改变自己的飞行方向,最后我们会发现,整个集群大致向同一个方向聚集。而这个地方是离食物最近的区域,条件好的话就会找到食物。
粒子群算法统领给设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅有两个属性:速度和位置,速度代表移动的快慢,粒子代表移动的方向。
鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子i在N维空间的位置表示为矢量Xi = (x1,x2,…,xn),飞行速度表示为矢量Vi=(v1,v2,…,vn)。每个粒子都有一个由目标函数决定的适应值,并且知道自己到目前为止发现的最好位置(pbest)和现在的位置Xi。这个可以看作是粒子自己的飞行经验。除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好的位置(gbest),这个可以看作是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步运动。
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个“极值(pbest和gbest)”来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
对于公式(1):
迭代终止条件根据具体问题一般选为最大迭代次数Gk或微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。
公式(2)、(3)中pbest和gbest分别表示微粒群的局部和全局最优位置。
当C1 = 0 时,则粒子没有了认知能力,变为只有社会的模型(social-only):
称为全局PSO算法。粒子有扩展搜索空间的能力,具有较快的收敛速度,但由于缺少局部搜索,对复杂问题比标准PSO更易陷入局部最优。
c1 = 0 表示与单粒子本身的pbest无关了
当C2 = 0 时,则粒子之间没有社会信息,模型变为只有认知(cognition-only)模型。
此时称为局部PSO算法。由于个体之间没有信息交流,整个群体相当于多个粒子进行盲目的随机搜索,收敛速度满,因而得到最优解的可能性小。
在D维空间中,有N个粒子;
粒子i的速度:xi = (xi1,xi2,…,xiD),将xi带入**适应函数f(xi)**求适应值;
粒子i的速度:vi = (vi1,vi2,…,viD)
粒子i个体经历的最好位置:pbest = (pi1,pi2,…,piD)
种群所经历的最好位置:gbest = (g1,g2,…,gD)
通常,在第d(1<=d<=D)维的位置变化范围限定在(Xmin d,Xmax d)内,速度变化范围限定在(-Vmax d,Vmax d)内(即在迭代中若超出了边界值,则该维的速度或位置被限制维该维最大速度或边界位置)
通常算法达到最大迭代次数或者最佳适应度值的增量小于某个给定的阈值时算法停止。
m很小容易陷入局部最优;m很大,PSO的优化能力很好,当种群数目增长到一定水平时,再增长将不再有显著的作用。
对于粒子的速度更新的三部分:
这三个参数的选择非常重要,如何调整这三个参数使得算法避免早熟又可以较快收敛,对于解决实际问题的意义较大。
速度限制作用为:维护算法的探索能力与开发能力的平衡。
Vm较大时,探索能力强,但是粒子容易飞过最优解;
Vm较小时,开发能力强,但是粒子容易陷入局部最优解;
Vm一般设定为每维变量变化范围的10%–20%。
最大迭代次数;
可以接受的满意解(通过fitness function判断是否满意)
较好地选择粒子的初始化空间,将大大缩短收敛时间。初始化空间根据具体问题的不同而不同,根据具体问题进行设定。该算法为数不多的关键参数的设置却对算法的精度和效率有着显著影响。
Wmax最大惯性权重,Wmin为最小惯性权重,run为当前迭代次数,runmax为算法迭代总次数。
较大的w有较好的全局收敛能力,较小的w则有较强的局部收敛能力。因此随着迭代次数的增加,惯性权重w应不断减少,从而使得粒子群算法在初期具有较强的全局收敛能力,而晚期具有较强的局部收敛能力。
1999年,引入收缩因子以保证算法的收敛性,因此更改速度公式:
K为收缩因子,φ1 φ2 限制的w。φ1 φ2是需要预先设定的模型参数。
收缩因子法控制系统行为最终收敛,且可以有效搜索不同区域,该法能得到较高质量的解。
粒子群算法的邻域拓扑结构包括两种:一种是将群体内所有个体都作为粒子的邻域,另一种是只将群体中的部分个体作为粒子的邻域。邻域拓扑结构决定群体历史最优位置,因此该算法分为全局粒子群算法和局部粒子群算法。
全局粒子群算法:
局部粒子群算法:
邻域随迭代次数的增加先行增大,最后邻域扩展至整个粒子群。
实践证明:全局版本的粒子群算法收敛速度快,但是容易陷入局部最优。局部最优的粒子群算法收敛速度慢,但是很难陷入局部最优。现在粒子群算法大都在收敛速度与摆脱局部最优这两个方面下功夫。