初窥PSO粒子群算法
来源:互联网 发布:ipad怎么管理淘宝店铺 编辑:程序博客网 时间:2024/06/07 13:42
碎碎念:终于搞完了毕设写好了论文,现在坐等答辩,可以有大把时间去做自己一直很想做的一些事情了。恰好这几天一个朋友找我帮他写程序,提出想寻找一个数值最优解,这激起了我的兴趣,查了查资料,决定用PSO粒子群算法来做这件事,下面总结下解决这个问题的思路。
PSO算法简介
粒子群算法(Particle Swarm Optimization,PSO)属于现代优化算法,适用于求解没有目标函数解析式或者解析函数很复杂的优化问题,简单地说,就是我们没办法得到诸如
粒子群算法最初是从研究鸟群捕食时得到的灵感,对于鸟群而言,如何在一大片区域中用有限的时间,最快地找到食物丰盛的领地,是一个决定鸟群生存繁衍的大问题。科学家们发现,单只鸟所能搜索的范围十分有限,但整个鸟群却像是被控制一般,很快聚集在食物最丰盛的地方。我们将每只鸟抽象成一个“粒子”(particle),每个粒子都有自己的位置和速度,并记忆自己曾经飞过的最好位置和群体曾经飞过的最好位置,那么在不断迭代的过程中,整体鸟群就很可能向最优目标出飞去。
概况起来说,一个群体中有
- 当前速度:
vi=(vi1,vi2,....viD) - 当前位置:
xi=(xi1,xi2,....xiD) - 粒子
i 经历的最好位置:pi,best=(pi1,pi2,....piD) - 粒子群经历的最好位置:
pg,best=(pg1,pg2,....pgD)
PSO算法分为全局PSO和局部PSO,其中全局PSO指的是使用整个群体找到的最好解作为
粒子每一个维度的位置其实就是这个问题中所包含的独立变量。在每一次的迭代过程中,粒子的位置
vid=w⋅vid+c1⋅rand⋅(pid−xid)+c2⋅rand⋅(pgd−xid) xid=xid+vid
对上式进行解读,得到的几个结论如下:
w 代表的是惯性权重,代表了粒子上一次迭代时的速度对当前速度的影响,起到了平衡算法全局搜索能力和局部搜索能力的作用,一般令w 的取值范围是[0.9, 1.2]。w 越大,粒子飞得越快,对全局的搜索能力也越强,而w 越小,那么粒子飞得越慢,对局部的搜索能力就越强。c1⋅rand⋅(pid−xid) 代表粒子向自我历史最优点进行飞行,c2⋅rand⋅(pgd−xid) 代表粒子向群体最优点进行飞行,其中rand是一个在(0,1)间取值的函数,一般用均分分布的函数即可。c1 和c2 分别代表自我历史最优和群体最优点的学习因子,也起到了平衡算法全局搜索能力和局部搜索能力的作用,c1 和c2 通常均为2,若取其他值,一般令c1=c2 且范围在[0,4]之间。这里的学习因子越大,粒子越容易在局部收敛,这与权重w 恰好是相反的。- 为了防止粒子飞离搜索空间,我们需要对粒子的速度做一个限制,令
vid 的范围在[−vmax ,vmax ],且通常令vmax=k⋅xd,max ,0.1≤k≤1 ,每一维均如此设置。
算法的整个流程图如下:
实例分析
这次需要解决的是一个效率优化的问题,需要求出如何分配三个暖通机的输出功率,使得整栋楼的供暖系统的热量损失率最低,下面给出关键部分的伪代码和结果图供大家参考。
#! 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算法主要依靠调节粒子的速度来控制算法,且需要重点注意粒子的越界问题。
附录
《粒子群算法的基本理论及其改进研究》
- 初窥PSO粒子群算法
- 粒子群PSO算法
- 粒子群算法(PSO)
- pso粒子群算法
- PSO 粒子群算法
- 粒子群算法-PSO
- 粒子群算法(PSO)
- PSO粒子群算法
- 粒子群算法PSO
- PSO粒子群优化算法
- PSO粒子群优化算法
- PSO粒子群优化算法
- 粒子群算法(PSO)
- pso粒子群优化算法
- 粒子群优化算法(PSO)
- PSO-粒子群优化算法
- 粒子群优化算法(PSO)
- 粒子群算法(PSO)
- MYSQL全文索引—CONTAINS语法
- 项目记录-圆形边缘修正方法探索2
- vlc hotkey(热键)处理过程
- Mathematica 技术领域1
- 基于 Django1.10 文档的深入学习(9)—— Extra instance methods 之 get_FOO_display()
- 初窥PSO粒子群算法
- JavaScript---函数问题
- 量化浅谈——读懂自己,然后才能写出量化
- 死变态的跳台阶——爬楼梯进阶版本
- 第五单元
- 二值网络——开启小而快神经网络时代
- Spring@Autowired注解与自动装配
- 最小生成树kruskal算法适合稀疏图(网络整理)8.1.3
- html --CSS的盒子模型