粒子群优化算法(Particle Swarm Optimization,PSO)
PSO算法对每个粒子的要求
- 所有粒子都在一个D维空间中进行搜索
- 所有粒子都由一个适应函数确定适应值以判断目前位置的好坏
- 每个粒子都有记忆功能,可以记住寻找到的最佳位置
- 每个粒子有一个速度和飞行方向
粒子群优化算法求最优解:(D维空间中,有N个粒子)
- 粒子i的位置: X i = ( x i 1 , x i 2 , . . . x i D ) X_i=(x_{i1},x_{i2},...x_{iD}) Xi=(xi1,xi2,...xiD),将 X i X_i Xi带入适应函数 f ( x i ) f(x_i) f(xi)求适应值
- 粒子i的速度: V i = ( v i 1 , v i 2 , . . . v i D ) V_i=(v_{i1},v_{i2},...v_{iD}) Vi=(vi1,vi2,...viD)
- 粒子i自身经历最好的位置: p b a s t i = ( p i 1 , p i 2 , . . . p i D ) pbast_i=(p_{i1},p_{i2},...p_{iD}) pbasti=(pi1,pi2,...piD)
- 粒子种群经历过最好的位置: g b a s t = ( g 1 , g 2 , . . . g D ) gbast=(g_{1},g_{2},...g_{D}) gbast=(g1,g2,...gD)
- 在d ( 1 ≤ d ≤ D ) (1{\leq}d{\leq}D) (1≤d≤D)维的位置变化范围限定在 [ X m i n , d , X m a x , d ] [X_{min,d},X_{max,d}] [Xmin,d,Xmax,d]内。(保证所有粒子在有限可控范围内进行迭代)
- 速度变化范围限定在 [ − V m a x , d , V m a x , d ] [-V_{max,d},V_{max,d}] [−Vmax,d,Vmax,d]内。(保证粒子速度变化可控)
粒子群算法迭代过程
粒子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
)
V^{k}_{id}=WV^{k-1}_{id}+c_{1}r_{1}(pbest_{id}-x^{k-1}_{id})+c_{2}r_{2}(gbest_{d}-x^{k-1}_{id})
Vidk=WVidk−1+c1r1(pbestid−xidk−1)+c2r2(gbestd−xidk−1)
W V i d k − 1 WV^{k-1}_{id} WVidk−1:粒子先前的速度矢量
c 1 r 1 ( p b e s t i d − x i d k − 1 ) c_1r_1(pbest_{id}-x^{k-1}_{id}) c1r1(pbestid−xidk−1):本粒子找到的最优解,自我认知部分
c 2 r 2 ( g b e s t d − x i d k − 1 ) c_{2}r_{2}(gbest_{d}-x^{k-1}_{id}) c2r2(gbestd−xidk−1):群体找到的最优解,社会经验部分
粒子i的第d维位置更新公式:
x i d k = x i d k − 1 + v i d k − 1 x^{k}_{id}=x^{k-1}_{id}+v^{k-1}_{id} xidk=xidk−1+vidk−1
x i d k − 1 x^{k-1}_{id} xidk−1:之前迭代中的位置信息
v i d k − 1 v^{k-1}_{id} vidk−1:当前的速度矢量
- v i d k v^k_{id} vidk:第k次迭代粒子i飞行速度矢量的第d维分量
- x i d k x^k_{id} 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:惯性权重,非负数,调节对解空间的搜索范围。(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−(Wmax−Wmin)×runmaxrun
- W m a x W_{max} Wmax:最大惯性权重
- W m a n W_{man} Wman:最小惯性权重
- r u n run run:当前迭代次数
- r u n m a x run_{max} runmax:本次算法迭代总次数
其中较大的w有较好的全局搜索能力,较小的W有较强的局部收敛能力。次公式完成的任务就是:随着迭代次数的增加,惯性权重W不断减小,从而使得PSO算法在前期具有较强的搜索能力,在后期具有较强的收敛能力。
粒子群算法构成要素
群体大小m
-
当m很小:陷入局部最优解的可能性很大
-
当m很大:虽然PSO效果好,但是效率会变慢,比较冗余
权重因子
惯性因子:W
- 当W=1时,为基本粒子群算法
- 当W=0时,将失去对粒子本身的速度记忆(会造成粒子随机性过重,使得寻优更加困难)
学习因子: c 1 , c 2 c_1,c_2 c1,c2
- c 1 r 1 ( p b e s t i d − x i d k − 1 ) c_1r_1(pbest_{id}-x^{k-1}_{id}) c1r1(pbestid−xidk−1):当 c 1 c_1 c1=0,无私型粒子群算法(会迅速丧失群体多样性,容易陷入局部最优)
- c 2 r 2 ( g b e s t d − x i d k − 1 ) c_{2}r_{2}(gbest_{d}-x^{k-1}_{id}) c2r2(gbestd−xidk−1):当 c 2 c_2 c2=0,自我认知型粒子群算法(完全没有信息社会共享,导致算法收敛速度过低)
邻域拓扑结构
- 全局粒子群算法,将种群所有粒子都设为邻域
- 收敛速度快
- 容易陷入局部最优
- 局部粒子群算法,只将部分粒子设为邻域,邻域随迭代次数线性变大,最后邻域扩展到整个粒子群
- 收敛速度慢
- 但是不容易陷入局部最优