粒子群算法(particle swarm optimization,PSO)也叫粒子群优化算法,由Kennedy和 Eberhart在1995年提出,该算法源于对鸟群捕食行为的研究。
来源:鸟群寻找食物
设想一个场景:一群鸟随机的分布在一个区域中,在这个区域里只有一块食物。所有的鸟都不知道食物在哪里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢? 最简单有效的方法就是搜寻目前离食物最近的鸟的周围区域,根据自己飞行的经验判断食物的所在。快速找到食物的核心是群体中个体之间的协作和信息共享。
如果把食物当作最优点,把鸟离食物的距离当作函数的适应度,那么鸟寻觅食物的过程就可以当作一个函数寻优的过程。由此受到启发,经过简化提出了粒子群优化算法(PSO)。
同遗传算法类似,粒子群算法(PSO)也是基于群体迭代的,根据对环境的适应度将群体中的个体移动到好的区域。PSO中使用无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性速度和位置。
每个粒子在搜索空间中搜寻最优解,并将其记为当前个体极值(个体最优解)(pbest),所有个体的极值中的最优极值作为整个粒子群的全局最优解(gbest),粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。以尽可能地朝pbest和gbest所指向的区域“飞”去。
ω: 惯性权重,反映了个体历史成绩对现在的影响,一般取0.5~1; c1和c2:自我学习因子和群体学习因子,一般取0~4; pbest:个体极值,粒子本身所找到的最优解; gbest: 全局极值,整个种群目前所找到的最优解
位置限制:限制粒子搜索的空间,即自变量的取值范围;
速度限制:如果粒子飞行速度过快,很可能直接飞过最优解位置,但是如果飞行速度过慢,会使得收敛速度变慢,因此需要设置合理的速度。一般设为每维变量变化范围的10%~20%。
惯性部分:代表粒子保持先前速度的趋势,相当于惯性或动量;
认知部分:表示粒子本身的思考,即粒子自身经验的部分,可理解为粒子当前位置与自身历史最优位置之间的距离和方向;
社会部分:表示粒子之间的信息共享与合作,即来源于群体中其他优秀粒子的经验,可理解为粒子当前位置与群体历史最优位置之间的距离和方向。
算法实现步骤:
1.初始化随机粒子群
计算其中粒子的适应度,个体极值,根据适应度得出全局最优极值。
2.更新粒子的位置和速度
3.计算新粒子的适应度,更新个体极值和全局最优极值。
4.循环迭代上述步骤多次最终得到x(位置)。
其中gbest=(0.81,0.29)
2.更新粒子速度
Matlab代码:
fun:目标函数句柄
fun=@(x)-x(1)-exp(-x(1)^2-x(2)^2);
nvars:变量个数
nvars=2;
lb:变量上限
lb=[-6,-3];
ub:变量下限
ub=[6,3];
[x,fval]=particleswarm(fun,nvars,lb,ub);
fval=-fval;
函数求解默认为最小值,此处求解最大值应该加负号。