python实现粒子群算法
粒子群算法(PSO),又可以叫做鸟群算法,是学者观察模仿鸟群的行为而发展的一种智能搜索算法,和遗传算法一样,也是一种群智能算法。
总的来说,粒子群算法也是一种进化算法,粒子分布在空间中,粒子在空间中的坐标组成的向量可以看做成遗传算法中的个体,或者是鸟群中的一只鸟儿,初始的粒子群是由随机分布于空间中的各个粒子的组成的,转换成数学就是,由很多个列向量组成的矩阵,粒子群就是矩阵,粒子就是矩阵中的列向量。那么对于粒子群中的每个粒子的属性是什么呢?有三个属性:1,粒子在空间中的位置坐标;2,粒子移动的速度;3,粒子的位置坐标对应于所求的目标函数的函数值,也就是适应度值。粒子群中的粒子中适应度值最好的那个粒子的坐标就是目标函数的解。
那么粒子是如何进化的呢?上面讲了粒子有三个属性,在遗传算法中,个体的进化是根据适应度值来的,而粒子群算法中粒子的进化是根据粒子群中的其他粒子的位置,以及粒子本身的位置,还有粒子的速度决定的。我们知道粒子在空间中的位置坐标决定了粒子所对应的适应度值,粒子的位置坐标又取决于这个粒子在上次移动前,粒子的位置坐标和粒子的速度。而粒子移动前的位置坐标已知,那么粒子的速度又是什么决定的呢?我们来看看鸟群中鸟儿的迁徙规律,鸟儿在鸟群中的移动是受两个因素制约的,第一个,受这只鸟儿自己在成长过程中形成的经验制约,可以理解为这只鸟儿自己认为食物所在的位置,对应于粒子中就是,这个粒子在过去的多次的移动过程中,适应度值最好的时候的位置坐标,第二个,受鸟群中的首领的位置制约。有了这两个因素制约,这只鸟儿就可以决定移动的速度的大小和方向了。为了表示这两个因素的强弱,我们引入两个常数c1,c2,c1表示第一个因素的强度,c2表示第二个因素的强度,c1比c2较大时,粒子群收敛慢,c2比c1较大时,粒子群收敛快。下面是粒子的迁移公式
速度迁移公式:
v = w*v +c1*(pbest-pop)+c2*(gbest-pop)
w表示粒子过去的速度所占的权重,c1,c2表示上面所说的两个参数,gbest表示粒子过去所达到的最好的适应度值对应的位置,gbest表示粒子群中的首领过去达到过的最好的适应度值对应的位置,pop表示粒子当前的位置
位置迁移公式:
pop = pop+v (默认时间取1)
pop表示粒子当前的位置,v表示粒子的速度
注意:由于粒子群算法没有遗传算法的交叉、变异等操作,所以粒子群算法的效率要比遗传算法高,但是由于迁移公式本身的关系,我们无法保证粒子在迁移的过程中跑到了边界的外面,所以要对粒子的速度上限和位置上限进行限制,这样可以有效的保证算法的收敛性。
下面是具体的例子:
求解函数f = x1**2+x2**2-x3**2+3*sin(x1*x2*x3)
,在坐标范围x~(-10,10) z~(-10,10) y~(-10,10)
的范围中的最大值,以及最大值所对应的x1,x2,x3。
分析:粒子的位置即函数的解,也就是说一个粒子就是由1x3的列向量表示
- 算法:
- 初始化粒子群
- 循环:
- 粒子群速度迁移
- 粒子速度限制
- 粒子群位置迁移
- 粒子位置限制
- 更新粒子中最好的位置
- 直到粒子群迁移次数达到程序设置上限
- 结果分析
基于numpy(python2.7.9)的粒子群算法,程序运行结果:
适应度值迭代结果:
分析:
之前同样的目标函数,使用matlab实现的遗传算法,用时3.3秒左右,使用基于numpy的python实现的遗传算法,用时1.6秒左右,现在使用基于numpy的python实现的粒子群算法,用时1.2秒!