pso算法|【原】粒子群算法(PSO)的简单应用

目录:

    • 0. 写在前面
    • 1. 粒子群算法PSO是是什么
      • 1.1 [简介][1]
      • 1.2 [算法步骤][2]
        • 1.2.1 简述
        • 1.2.2 基本PSO算法
      • 1.3 流程图
    • 2. 简单的PSO例子(python 实现)
    • 参考资料

0. 写在前面 之前写到优化的基本思想,里面提到了智能算法。目前有些学者对这些算法并不认可,但是实际使用中,在维度比较低的情况下,群智能算法确实能以很高的找到近似解。
这篇以我最熟悉的PSO开始,以demo的方式来探讨群智能算法的使用。
1. 粒子群算法PSO是是什么 1.1 [简介][1]
PSO是粒子群优化算法(–Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方式寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断改变其搜索模式。
1.2 [算法步骤][2]
1.2.1 简述 每个寻优的问题解都被想像成一只鸟,称为“粒子”。所有粒子都在一个D维空间进行搜索。
- 所有的粒子都由一个fitness-function确定适应值以判断目前的位置好坏。
- 每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置。
- 每一个粒子还有一个速度以决定飞行的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。
1.2.2 基本PSO算法
  • a. D维空间中,有m个粒子;
    粒子 ii 位置: xi=(xi1,xi2,…xiD) x i = ( x i 1 , x i 2 , … x i D )
    粒子 ii 速度: vi=(vi1,vi2,…viD),1≤i≤m,1≤d≤D v i = ( v i 1 , v i 2 , … v i D ) , 1 ≤ i ≤ m , 1 ≤ d ≤ D
    粒子 ii 经历过的历史最好位置: pi=(pi1,pi2,…piD) p i = ( p i 1 , p i 2 , … p i D )
    群体内(或领域内)所有粒子所经历过的最好位置:
    pg=(pg1,pg2,…pgD)p g = ( p g 1 , p g 2 , … p g D )
    一般来说,粒子的位置和速度都是在连续的实数空间内进行取值。
  • b. 基本公式
    vk+1iD=vkiD+c1r1(pkiD?xkiD)+pkgD?xkiDv i D k + 1 = v i D k + c 1 r 1 ( p i D k ? x i D k ) + p g D k ? x i D k
    xk+1iD=xkiD+vk+1iDx i D k + 1 = x i D k + v i D k + 1
    其中, c1c 1 ,c2c 2是学习因子和加速因子, r1r 1 ,r2r 2取值范围是 [0,1][ 0 , 1 ] , 是该区间范围内的随机数, vmaxv m a x 是例子速度能达到的最大值
1.3 流程图
st=>start: 开始 e=>end: 结束 init=>operation: 初始化粒子种群 fit=>operation: 计算适应度 update=>operation: 按全局最优和历史最优迭代粒子位置 cond=>condition: 满足结束条件? st->init->fit->updata->cond cond(yes)->e cond(no)->fit

2. 简单的PSO例子(python 实现)
  • 例1:[最值问题][3]
    求函数 z=?cos(x)?sin(y)(x∈[0,2?π],yin[0,2?π])z = ? c o s ( x ) ? s i n ( y ) ( x ∈ [ 0 , 2 ? π ] , y i n [ 0 , 2 ? π ] )的最大值
    首先,我们需要构造评价函数:
import numpy as np def fun(vars): x, y = vars if 0 <= x <= 2 * np.pi and 0 <= y <= 2 * np.pi: return -np.cos(x) - np.sin(y) + 10 else: return -10# 返回一个达不到的小值

这里我们注意到,在边界处理上,我们返回了一个较小值,而并非负无穷(-inf),是为了避免出现速度很大导致的越界。
然后我们可以调用snowland-algorithm工具包,进行求解
# 使用前请安装文件 # pip install snowland-algorithm # 确保版本号大于0.0.2 from slapy.swarm.pso import PSOEngine if __name__ == '__main__': engine = PSOEngine(vmax=0.01, bound=[[0, 2 * np.pi]], min_fitness_value=https://www.it610.com/article/-1, dim=2, fitness_function=fun, steps=100) engine.run() x, y = engine.gbest.indv print('计算得到的最大值是', fun(engine.gbest.indv)) print('x取值是:', x, 'y取值是:', y)

完整代码
  • 例2: 解方程
    求解方程 x=sqrt(x)?x?sin(x)x = s q r t ( x ) ? x ? s i n ( x ) 在[-2, 0]区间内的近似解
    问题的主要难点在于方程组向评价函数的转化。
    我们可以把右式移项,变成F(x) = 0的形式,我们用“越接近0越好”最为评价函数,问题即转化为最优值问题
def fun(x): x = x[0] # 评价函数 if 2 <= x <= 4: return 1 / (np.abs(x + x * np.sin(x) - np.sqrt(x)) + 1) else: return -1# 返回一个达不到的小值

在这里,我们用了一个减函数1/abs(·)的形式把接近0表示出来,当然也可以使用跟其他函数。在在分母处+1,为了防止分母为0导致评价变成无穷。
完整代码
- 例3: 优化问题

{max=x+yst.x2+y2≤1x>0y>0{ m a x = x + y s t . x 2 + y 2 ≤ 1 x > 0 y > 0【pso算法|【原】粒子群算法(PSO)的简单应用】
def fun(vars): # 评价函数 x, y = vars if 0 <= x <= 1 and 0 <= y <= 1: if x ** 2 + y ** 2 > 1: return -2 return x + y else: return -2# 返回一个达不到的小值

把约束条件写在评价函数内即可。注意,经验表明,约束排除的点的区间不应该大于整个区间的1/3.如果约束过多,需要考虑缩小变量的范围,否则可能影响迭代效果。
完整代码
参考资料 [1]: 360百科 https://baike.so.com/doc/6744648-24861474.html 2018-08-03
[2]: CSDN https://blog.csdn.net/zuochao_2013/article/details/53431767?ref=myread 2018-8-27
[3]: 码云 https://gitee.com/hoops/snowland-algorithm-python/blob/master/slapy/demo/gso_demo.py 2018-8-7
[4]: A.Star下载站 http://download.snowland.ltd 2018-8-27

    推荐阅读