初窥PSO粒子群算法

来源:互联网 发布:ipad怎么管理淘宝店铺 编辑:程序博客网 时间:2024/06/07 13:42

碎碎念:终于搞完了毕设写好了论文,现在坐等答辩,可以有大把时间去做自己一直很想做的一些事情了。恰好这几天一个朋友找我帮他写程序,提出想寻找一个数值最优解,这激起了我的兴趣,查了查资料,决定用PSO粒子群算法来做这件事,下面总结下解决这个问题的思路。

PSO算法简介

粒子群算法(Particle Swarm Optimization,PSO)属于现代优化算法,适用于求解没有目标函数解析式或者解析函数很复杂的优化问题,简单地说,就是我们没办法得到诸如f(x)=x2+1 这样可以求导的解析式,甚至根本就得不到一个具体的函数表达式,与此同时,我们还需要求出最小(大)值,在这个背景下,就出现了诸如模拟退火算法、遗传算法、粒子群算法等各种各样的优化算法。这些优化算法其实都是在模拟自然界的某些过程,并尝试着去解决问题。

粒子群算法最初是从研究鸟群捕食时得到的灵感,对于鸟群而言,如何在一大片区域中用有限的时间,最快地找到食物丰盛的领地,是一个决定鸟群生存繁衍的大问题。科学家们发现,单只鸟所能搜索的范围十分有限,但整个鸟群却像是被控制一般,很快聚集在食物最丰盛的地方。我们将每只鸟抽象成一个“粒子”(particle),每个粒子都有自己的位置和速度,并记忆自己曾经飞过的最好位置和群体曾经飞过的最好位置,那么在不断迭代的过程中,整体鸟群就很可能向最优目标出飞去。

概况起来说,一个群体中有m个粒子,在一个D维的空间中以一定速度飞行,每个粒子在飞行时,都能感知自己曾飞过的最好位置和整体群体的最好位置,并依据作为依据来变化。对于粒子群的第i个粒子而言,它的信息如下

  • 当前速度:vi=(vi1,vi2,....viD)
  • 当前位置:xi=(xi1,xi2,....xiD)
  • 粒子i经历的最好位置:pi,best=(pi1,pi2,....piD)
  • 粒子群经历的最好位置:pg,best=(pg1,pg2,....pgD)

PSO算法分为全局PSO和局部PSO,其中全局PSO指的是使用整个群体找到的最好解作为pg,best,而局部PSO令部分成员成为邻域,并取邻域中的最好点作为pg,best。在实际使用中,可以先用全局PSO找到大概位置,然后用局部PSO进行小范围内的搜索。

粒子每一个维度的位置其实就是这个问题中所包含的独立变量。在每一次的迭代过程中,粒子的位置xi都会被用来计算适应度,也就是计算目标函数的值,并依据计算的结果来决定下一次迭代过程中粒子的位置和方向。令ldD,那么每一个粒子的第d维的位置和速度按照如下的式子变化

  • vid=wvid+c1rand(pidxid)+c2rand(pgdxid)
  • xid=xid+vid

对上式进行解读,得到的几个结论如下:

  • w代表的是惯性权重,代表了粒子上一次迭代时的速度对当前速度的影响,起到了平衡算法全局搜索能力和局部搜索能力的作用,一般令w的取值范围是[0.9, 1.2]。w越大,粒子飞得越快,对全局的搜索能力也越强,而w越小,那么粒子飞得越慢,对局部的搜索能力就越强。
  • c1rand(pidxid)代表粒子向自我历史最优点进行飞行,c2rand(pgdxid)代表粒子向群体最优点进行飞行,其中rand是一个在(0,1)间取值的函数,一般用均分分布的函数即可。c1c2分别代表自我历史最优和群体最优点的学习因子,也起到了平衡算法全局搜索能力和局部搜索能力的作用,c1c2通常均为2,若取其他值,一般令c1=c2且范围在[0,4]之间。这里的学习因子越大,粒子越容易在局部收敛,这与权重w恰好是相反的。
  • 为了防止粒子飞离搜索空间,我们需要对粒子的速度做一个限制,令vid的范围在[vmax, vmax],且通常令vmax=kxd,max0.1k1,每一维均如此设置。

算法的整个流程图如下:

Created with Raphaël 2.1.0开始使用随机分布,初始化化粒子的位置和速度计算所有粒子的适应度更新个体最优位置和群体最优位置计算粒子的下一个位置和速度达到?结束继续下一次迭代yesno

实例分析

这次需要解决的是一个效率优化的问题,需要求出如何分配三个暖通机的输出功率,使得整栋楼的供暖系统的热量损失率最低,下面给出关键部分的伪代码和结果图供大家参考。

#! python3# time代表总的迭代次数, N为群体数目for i in time:    for j in range(N):        result = fit(x[j])          #fit函数计算第j个粒子的适应度        if result < pbest[j]:       #依据条件更新第j个粒子的个体历史最优点            p[j] = x[j]            pbest[j] = x[j]        if pbest[j] < gbest:        #依据条件更新群体最优点            g = p[j]            gbest = pbest[j]        while True:            # p[j]为第j个粒子的个体历史最好点,g为粒子群的最优点            v_test = w * v[j] + c1 * random.random() * (p[j] - x[j]) + c2 * random.random() * (g - x[j])            x_test = x[j] + v_test            if (监测是否溢出边界):                v[j] = v_test           #若不溢出,则更新位置和速度                x[j] = x[j] + v[j]                break               #若不溢出,则跳出循环,更新下一个粒子的位置和速度            else                v[j] = random.uniform(0, 0.1)       #若溢出了,则重新分配此粒子的位置和速度                x[j] = random.uniform(0, 1)

初始位置

初始速度
经过50次迭代后

最终位置

最终速度

线

收敛曲线

可以很明显地看到粒子收敛在一个小区间内。

总结

综上所述,这次上手PSO算法的几个想法如下:

  • PSO算法模拟了自然界鸟群在一个大区域内进行觅食的情况,适用于没有解析解的优化问题。
  • PSO算法对搜索空间进行了全局搜索,且与传统的遗传算法不同的是,PSO且将搜索过程中发现的好的解作为知识进行保存,且分享给所有粒子,这在一定程序上提高了搜索效率。
  • PSO算法主要依靠调节粒子的速度来控制算法,且需要重点注意粒子的越界问题。

附录

《粒子群算法的基本理论及其改进研究》

0 0
原创粉丝点击