最优化——粒子群算法(PSO)

粒子群算法(PSO)

基本概念

D维空间中,有N个粒子;

粒子i位置: X i = ( x i 1 , x i 2 , x i 3 , … , x i D ) X_i = (x_{i1},x_{i2},x_{i3},\dots,x_{iD}) Xi=(xi1,xi2,xi3,,xiD),将Xi代入适应度函数f(Xi)求适应值;

粒子i速度: V i = ( V i 1 , V i 2 , V i 3 , … , V i D ) V_i = (V_{i1},V_{i2},V_{i3},\dots,V_{iD}) Vi=(Vi1,Vi2,Vi3,,ViD)

粒子i经历过的最好位置: p b e s t = ( p i 1 , p i 2 , … , p i D ) pbest=(p_{i1},p_{i2},\dots,p_{iD}) pbest=(pi1,pi2,,piD)

种群所经历过的最好位置: g b e s t = ( g 1 , g 2 , … , g D ) gbest = (g_1,g_2,\dots,g_D) gbest=(g1,g2,,gD)

注意:速度变化范围需要被限制在[ − V m a x , d , V m a x , d -V_{max,d},V_{max,d} Vmax,d,Vmax,d]内,若 V i d V_{id} Vid超过了最大边界值,则该维的速度被限制为该维的最大速度。

(从ppt后面的例子,在解四维空间最小值的问题中貌似不会强行拉回解空间)

粒子i的第d维速度和位置更新公式:
V i d k = w V i d k − 1 + c 1 r 1 ( p b e s t i d − x i d k − 1 ) + c 2 r 2 ( g b e s t d − x i d k − 1 ) x i d k = x i d k − 1 + V i d k V_{id}^k = w V_{id}^{k-1} + c_1r_1(pbest_{id}-x_{id}^{k-1}) + c_2r_2(gbest_d-x_{id}^{k-1}) \\ x_{id}^{k} = x_{id}^{k-1} + V_{id} ^k Vidk=wVidk1+c1r1(pbestidxidk1)+c2r2(gbestdxidk1)xidk=xidk1+Vidk
V i d k V_{id}^k Vidk : 第k次迭代粒子i的速度矢量的第d维分量。

x i d k x_{id}^k xidk:第k次迭代粒子i的位置矢量的第d维分量。

c 1 , c 2 c_1,c_2 c1,c2:加速常数,。

r 1 , r 2 r_1,r_2 r1,r2:[0,1]随机数,增加随机性

w:惯性权重因子,决定当前速度与上一次速度关联的大小(了解过momentum的同学应该非常熟悉)

惯性权重因子w

w较大,全局寻优强,w较小,局部寻优强。启示我们要在迭代开始时让w较大,快结束时让w较小。

线性递减权值
w = w m a x − ( w m a x − w m i n ) × r u n r u n m a x w = w_{max} - (w_{max}-w_{min}) \times \frac{run}{run_{max}} w=wmax(wmaxwmin)×runmaxrun
如此设置权重使得开始迭代时w较大,全局寻优强(避免陷入局部最优解),快结束时w较小,局部寻优强(避免震荡不收敛)。

算法过程

  1. 初始化参数和控制参数
    • 粒子群大小,初始位置,初始位置,最大迭代次数,速度范围,位置范围;
    • 惯性因子w,加速度系数,已经迭代的次数(0)。
  2. 根据适应度函数,评价每个粒子的适应度
  3. 对于每个粒子,将其适应度值与其个人历史最佳(pbest)相比较。如果当前适应度值更高,则将用当前位置去更新最佳位置
  4. 对于每个粒子,将其当前适应度值与全局最佳位置(gbest)对应的适应度值比较,如果当前适应度值更高,则将用当前位置去更新最佳位置gbest
  5. 根据公式去更新每个粒子的速度,判断速度是否满足范围要求,若不满足需要纠正,纠正后更新位置。
  6. 判断是否满足退出条件,即算法到达最大迭代次数或者最佳适应度值得增量小于某个给定的阈值,则算法停止,否则返回步骤2.

应用

考试中如何书写?给出具体例子。
求 m i n x 2 − 4 x + 3 求 min \quad x^2-4x+3 minx24x+3

  1. 首先初始化参数,粒子群大小设置为30,粒子维度为1维,适应度函数为 x 2 − 4 x + 3 x^2-4x+3 x24x+3,惯性权重因子w为0.8,加速常数c1为2,c2为2,最大迭代次数为100次。然后去随机初始化种群每个个体的位置和初始速度,并记录下此时每个粒子经历过的最好位置(即当前位置)以及种群最好的位置。

  2. 根据适应度函数去评价每个粒子的适应度

  3. 对于每个粒子,将其适应度值与其个人历史最佳(pbest)相比较。如果当前适应度值更高,则将用当前位置去更新最佳位置

    temp = self.function(self.x[i])
    if temp < self.p_fit[i]:
    	self.p_fit[i] = temp
    	self.pbest[i] = self.x[i]
    
  4. 在该粒子小于其个人历史最佳的基础之上,再将其与全局最佳位置(gbest)对应的适应度值比较,如果当前适应度值更高,则将用当前位置去更新最佳位置gbest

    temp = self.function(self.x[i])
    if temp < self.p_fit[i]:
    	self.p_fit[i] = temp
    	self.pbest[i] = self.x[i]
        if self.p_fit[i] < self.fit:  # 更新全局最优
        	self.gbest = self.X[i]
            self.fit = self.p_fit[i] 
    
  5. 根据公式去更新每个粒子的速度,判断速度是否满足范围要求,若不满足需要纠正,纠正后更新位置。

  6. 判断是否满足退出条件,即算法到达最大迭代次数或者最佳适应度值得增量小于某个给定的阈值,则算法停止,否则返回步骤2.

你可能感兴趣的:(最优化,算法,机器学习)