粒子群算法的修正
基础的PSO算法可以成功解决一些问题,例如数学优化问题、组合问题即多层神经网络训练等。但也存在着算法收敛性与收敛速度等问题,因此对PSO算法有许多修正方法,用于提升性能。这些修改包括引入惯性权重、最大速度、速度收缩、确定个人最佳和全局最佳(或局部最佳)位置以及不同的速度模型等方法。
一、最大速度
决定优化算法效率和准确性的很重要的一个方面是
e
x
p
l
o
r
a
t
i
o
n
–
e
x
p
l
o
i
t
a
t
i
o
n
t
r
a
d
e
−
o
f
f
exploration–exploitation\;\; trade-off
exploration–exploitationtrade−off,即探索能力与利用能力的权衡。
e
x
p
l
o
r
a
t
i
o
n
exploration
exploration指算法探索不同搜索空间来确定最优解位置所在区域的能力;
e
x
p
l
o
i
t
a
t
i
o
n
exploitation
exploitation指算法在给定范围内寻找一个优秀候选解的能力。一个好的优化算法可以很好的平衡这两个目标的矛盾。在PSO中,是利用速度更新公式来达到这一目标。
如前面几篇所述,粒子
i
i
i 的速度更新公式为:
v i ( t + 1 ) = v i ( t ) + c 1 ⋅ r 1 ( t ) ⋅ [ y i ( t ) − x i ( t ) ] + c 2 ⋅ r 2 ( t ) ⋅ [ y ^ i ( t ) − x i ( t ) ] \mathbf v_{i}(t+1)=\mathbf v_{i}(t)+c_1\cdot \mathbf r_{1}(t)\cdot [\mathbf y_{i}(t)-\mathbf x_{i}(t)]+c_2\cdot \mathbf r_{2}(t)\cdot [\hat \mathbf y_{i}(t)-\mathbf x_{i}(t)] vi(t+1)=vi(t)+c1⋅r1(t)⋅[yi(t)−xi(t)]+c2⋅r2(t)⋅[y^i(t)−xi(t)]。
对于 g − b e s t g-best g−best PSO算法, 粒子 i i i 在第 j j j 维上的速度更新公式为:
v i j ( t + 1 ) = v i j ( t ) + c 1 ⋅ r 1 j ( t ) ⋅ [ y i j ( t ) − x i j ( t ) ] + c 2 ⋅ r 2 j ( t ) ⋅ [ y ^ i j ( t ) − x i j ( t ) ] v_{ij}(t+1)=v_{ij}(t)+c_1\cdot r_{1j}(t)\cdot [y_{ij}(t)-x_{ij}(t)]+c_2\cdot r_{2j}(t)\cdot [\hat y_{ij}(t)-x_{ij}(t)] vij(t+1)=vij(t)+c1⋅r1j(t)⋅[yij(t)−xij(t)]+c2⋅r2j(t)⋅[y^ij(t)−xij(t)]
常数最大速度
若速度过大,则容易使粒子飞出搜索空间边界,造成粒子发散。为控制粒子的探索能力(即使粒子尽可能不飞出边界),引入速度的边界限制,即最大速度,以
V
m
a
x
,
j
V_{max,j}
Vmax,j 代表允许的在第
j
j
j 维上的最大速度,则粒子速度更新公式可改为:
v
i
(
t
+
1
)
=
{
v
i
j
′
(
t
+
1
)
,
i
f
v
i
j
′
(
t
+
1
)
)
<
V
m
a
x
,
j
V
m
a
x
,
j
,
i
f
v
i
j
′
(
t
+
1
)
)
≥
V
m
a
x
,
j
\displaystyle v_i(t+1)=\left\{ \begin{aligned} v'_{ij}(t+1), & & {if\,\,v'_{ij}(t+1))< V_{max,j}}\\ V_{max,j}, & & {if\,\,v'_{ij}(t+1))\ge V_{max,j}}\\ \end{aligned} \right.
vi(t+1)={vij′(t+1),Vmax,j,ifvij′(t+1))<Vmax,jifvij′(t+1))≥Vmax,j, 其中,
v
i
j
′
(
t
+
1
)
v'_{ij}(t+1)
vij′(t+1) 是根据上述速度更新公式计算得到的。最大速度对搜索的影响如下所示:
V m a x , j V_{max,j} Vmax,j 的值是很重要的,它控制着由逐渐增加的速度所决定的搜索粒度。 V m a x , j V_{max,j} Vmax,j 越大,全局探索能力越强; V m a x , j V_{max,j} Vmax,j 越小,局部开发能力越强。因此,需要确定一个合适的 V m a x , j V_{max,j} Vmax,j 值,以使粒子不能移动的太快或太慢,使得算法的探索与开发能力相平衡。通常, V m a x , j = δ ⋅ ( x m a x , j − x m i n , j ) V_{max,j}=\delta\cdot (x_{max,j}-x_{min,j}) Vmax,j=δ⋅(xmax,j−xmin,j) , δ \delta δ 具有问题独立性,可以使用一些经验方法得到(如交叉验证法)。
控制最大速度有许多优势,但也存在着一些问题:其一,最大速度不仅改变步长,也改变粒子移动的方向,可能有利于最优解的搜素,也可能不利;其二,当粒子的所有速度都达到最大速度时,就会使得粒子的搜索域变为一个的 [ x i ( t ) − V m a x , x i ( t ) + V m a x ] [\mathbf x_i(t)-\mathbf V_{max},\mathbf x_i(t)+\mathbf V_{max}] [xi(t)−Vmax,xi(t)+Vmax] 超立方体,这就使得粒子可能跳过最优解,也很难对局部区域进行良好的开发利用。这一问题可使用随时间变化的最大速度来解决(即 V m a x , j V_{max,j} Vmax,j 随时间衰减)。
可利用双曲正切函数对速度进行限制,降低 PSO算法对 δ \delta δ 的敏感性,如: v i j ( t + 1 ) = V m a x , j ⋅ t a n h ( v i j ′ ( t + 1 ) V m a x , j ) \displaystyle v_{ij}(t+1)=V_{max,j}\cdot tanh(\frac{v'_{ij}(t+1)}{V_{max,j}}) vij(t+1)=Vmax,j⋅tanh(Vmax,jvij′(t+1))。
动态最大速度
1.当经过 τ \tau τ 次迭代,全局最优解没有提升时 :
V m a x , j ( t + 1 ) = { γ ⋅ V m a x , j ( t ) , f ( y ^ ( t ) ) ≥ f ( y ^ ( t − t ′ ) ) ∀ t ′ = 1 , ⋯ , n t ′ V m a x , j ( t ) , o t h e r w i s e \displaystyle V_{max,j}(t+1)=\left\{ \begin{aligned} \gamma \cdot V_{max,j}(t), & & {f(\hat\mathbf y(t))\ge f(\hat\mathbf y(t-t'))\;\;\;\forall t'=1,\cdots,n_{t'}}\\ V_{max,j}(t), & & {otherwise}\\ \end{aligned} \right. Vmax,j(t+1)={γ⋅Vmax,j(t),Vmax,j(t),f(y^(t))≥f(y^(t−t′))∀t′=1,⋯,nt′otherwise
2.指数衰减: V m a x , j ( t + 1 ) = ( 1 − ( t n t ) α ) ⋅ V m a x , j ( t ) \displaystyle V_{max,j}(t+1)=(1-(\frac{t}{n_t})^{\alpha})\cdot V_{max,j}(t) Vmax,j(t+1)=(1−(ntt)α)⋅Vmax,j(t),其中, α \alpha α 是由实验或误差或正交验证等方法发现的一个正常数, n t n_t nt 是最大时间步数(迭代次数)。
二、惯性权重
惯性权重可作为一个不使用最大速度时的机制,虽然对速度更新中第一项的作用上很成功,但并不能完全消除最大速度。惯性权重 ω \omega ω 控制先前速度对新速度的影响,对于 g − b e s t g-best g−best PSO算法, 粒子 i i i 在第 j j j 维上的速度更新公式该为:
v i j ( t + 1 ) = ω ⋅ v i j ( t ) + c 1 ⋅ r 1 j ( t ) ⋅ [ y i j ( t ) − x i j ( t ) ] + c 2 ⋅ r 2 j ( t ) ⋅ [ y ^ i j ( t ) − x i j ( t ) ] v_{ij}(t+1)=\omega\cdot v_{ij}(t)+c_1\cdot r_{1j}(t)\cdot [y_{ij}(t)-x_{ij}(t)]+c_2\cdot r_{2j}(t)\cdot [\hat y_{ij}(t)-x_{ij}(t)] vij(t+1)=ω⋅vij(t)+c1⋅r1j(t)⋅[yij(t)−xij(t)]+c2⋅r2j(t)⋅[y^ij(t)−xij(t)]
大的 ω \omega ω 值提升探索能力,增加多样性;小的 ω \omega ω 值提升局部开发能力,但太小的 ω \omega ω 会使种群丧失探索能力,小的 ω \omega ω 值使得对应的动量也小,这样使得粒子的方向变化会很容易。 ω \omega ω 越小,认知和社会成分就越能控制位置的更新。
对于 ω \omega ω 的设置,可在迭代的初始阶段设置一个大一点静态值,使得可以充分搜索,之后使用动态的 ω \omega ω ,使得粒子对局部区域的开发能力逐渐增强。 ω \omega ω 值和加速度常数之间的重要关系是至关重要的,因此 ω \omega ω 的选择需要与 c 1 , c 2 c_1,c_2 c1,c2 一同进行。需满足: ω > 1 2 ( c 1 + c 2 ) − 1 \displaystyle \omega>\frac{1}{2}(c_1+c_2)-1 ω>21(c1+c2)−1,这保证粒子轨迹线的收敛,若不满足,则会使粒子发散或产生循环行为。
一些动态变化的惯性权重如下:
1.随机调整:在每一代使用随机选择的不同的惯性权重
ω
\omega
ω ,
ω
\omega
ω 的选择与认知部分和社会部分无关;
2.线性衰减: ω ( t ) = [ ω ( 0 ) − ω ( n t ) ] ⋅ ( n t − t ) n t + ω ( n t ) \displaystyle \omega(t)=[\omega(0)-\omega(n_t)]\cdot\frac{(n_t-t)}{n_t}+\omega(n_t) ω(t)=[ω(0)−ω(nt)]⋅nt(nt−t)+ω(nt) ,其中, n t n_t nt 是执行算法的最大时间步数, ω ( 0 ) \omega(0) ω(0) 为初始惯性权重, ω ( n t ) \omega(n_t) ω(nt) 为终止惯性权重,有 ω ( 0 ) > ω ( n t ) \omega(0)>\omega(n_t) ω(0)>ω(nt)
3.非线性衰减:非线性衰减相较于线性衰减,进行探索的时间较短,更多的时间用在开发优秀解上。非线性衰减在平滑搜索的空间上更合适。有以下方法:
(1)
ω
(
t
+
1
)
=
(
ω
(
t
)
−
0.4
)
⋅
(
n
t
−
t
)
n
t
+
0.4
\displaystyle \omega(t+1)=\frac{(\omega(t)-0.4)\cdot(n_t-t)}{n_t+0.4}
ω(t+1)=nt+0.4(ω(t)−0.4)⋅(nt−t),其中
ω
(
0
)
=
0.9
\omega(0)=0.9
ω(0)=0.9
(2)
ω
(
t
+
1
)
=
α
⋅
ω
(
t
′
)
\displaystyle \omega(t+1)=\alpha\cdot\omega(t')
ω(t+1)=α⋅ω(t′),可取
α
=
0.975
\alpha=0.975
α=0.975,
t
′
t'
t′ 是惯性权重上一次改变时的时间。只有当种群的适应度没有大的变化时,惯性权重才会发生改变。
(3)自适应惯性权重,其中惯性值的变化量与群体的相对改进成正比,即
ω
i
(
t
+
1
)
=
ω
(
0
)
+
[
ω
(
n
t
)
−
ω
(
0
)
]
⋅
e
m
i
(
t
)
−
1
e
m
i
(
t
)
+
1
\displaystyle \omega_i(t+1)=\omega(0)+[\omega(n_t)-\omega(0)]\cdot\frac{e^{m_i(t)}-1}{e^{m_i(t)}+1}
ωi(t+1)=ω(0)+[ω(nt)−ω(0)]⋅emi(t)+1emi(t)−1 ,其中相对改进
m
i
(
t
)
=
f
(
y
^
i
(
t
)
)
−
f
(
x
^
i
(
t
)
)
f
(
y
^
i
(
t
)
)
+
f
(
x
^
i
(
t
)
)
\displaystyle m_i(t)=\frac{f(\hat\mathbf y_i(t))-f(\hat\mathbf x_i(t))}{f(\hat\mathbf y_i(t))+f(\hat\mathbf x_i(t))}
mi(t)=f(y^i(t))+f(x^i(t))f(y^i(t))−f(x^i(t)),
ω
(
0
)
<
1
,
ω
(
n
t
)
≈
0.5
\omega(0)<1,\omega(n_t)\approx0.5
ω(0)<1,ω(nt)≈0.5
。该方法的速度更新与认知部分无关,每个粒子的权重仅与距邻居中最优位置的距离有关。
4.模糊适应权重
5.增加型权重
三、限制系数
限制系数设置如下:
v
i
j
(
t
+
1
)
=
χ
⋅
{
v
i
j
(
t
)
+
ϕ
1
⋅
[
y
i
j
(
t
)
−
x
i
j
(
t
)
]
+
ϕ
2
⋅
[
y
^
i
j
(
t
)
−
x
i
j
(
t
)
]
}
v_{ij}(t+1)=\chi\cdot\{v_{ij}(t)+\phi_1\cdot [y_{ij}(t)-x_{ij}(t)]+\phi_2\cdot [\hat y_{ij}(t)-x_{ij}(t)]\}
vij(t+1)=χ⋅{vij(t)+ϕ1⋅[yij(t)−xij(t)]+ϕ2⋅[y^ij(t)−xij(t)]},
其中 χ = 2 κ ∣ 2 − ϕ − ϕ ( ϕ − 4 ) ∣ \displaystyle\chi=\frac{2\kappa}{|2-\phi-\sqrt{\phi(\phi-4)}|} χ=∣2−ϕ−ϕ(ϕ−4)∣2κ, ϕ 1 = c 1 ⋅ r 1 , ϕ 2 = c 2 ⋅ r 2 , ϕ = ϕ 1 + ϕ 2 \phi_1=c_1\cdot r_1,\phi_2=c_2\cdot r_2,\phi=\phi_1+\phi_2 ϕ1=c1⋅r1,ϕ2=c2⋅r2,ϕ=ϕ1+ϕ2,需满足 ϕ ≥ 4 , κ ∈ [ 0 , 1 ] \phi\ge4,\kappa\in[0,1] ϕ≥4,κ∈[0,1]。
上述方程可以衍生出一种对种群特征值动态分析的方法。上述限制条件确保了在不需要最大速度时,使得算法可收敛于一个稳定点, χ ∈ [ 0 , 1 ] \chi\in[0,1] χ∈[0,1] 表示速度在每次迭代时的衰减程度。参数 κ \kappa κ 控制种群的探索与开发能力的平衡。当 κ ≈ 0 \kappa\approx0 κ≈0 时,算法通过局部开发达到快速收敛,整个种群的行为几乎类似于爬坡;当 κ ≈ 1 \kappa\approx1 κ≈1 时,算法有很高的探索能力,收敛很慢。通常, κ \kappa κ 被置为一个常数,但也可动态设置。
四、同步更新与异步更新
同步更新时,最佳位置与粒子位置更新是分开进行的,一次迭代中当所有粒子更新完成后再更新最佳位置;
异步更新时,在每次有粒子位置更新后就计算新的最佳位置。
异步更新有着关于搜索空间最佳区域及时反馈的特性,而同步更新则是每迭代一次,只反馈一次信息。异步更新更适用于像 l − b e s t l-best l−best PSO 这种低连通性的结构,而同步更新则更适用于像 g − b e s t g-best g−best PSO 这样连通性高的结构。
五、速度模型
认知模型
在速度更新公式中去掉了社会部分,速度更新公式变为:
v
i
j
(
t
+
1
)
=
ω
⋅
v
i
j
(
t
)
+
c
1
⋅
r
1
j
(
t
)
⋅
[
y
i
j
(
t
)
−
x
i
j
(
t
)
]
v_{ij}(t+1)=\omega\cdot v_{ij}(t)+c_1\cdot r_{1j}(t)\cdot [y_{ij}(t)-x_{ij}(t)]
vij(t+1)=ω⋅vij(t)+c1⋅r1j(t)⋅[yij(t)−xij(t)]
认知模型中,粒子的行为可以类比为怀旧,即粒子有回到原来最佳位置的随机趋势。相较于全模型,认知模型是脆弱的,趋向于在初始区域进行局部搜索,其在动态环境中的表现是较差。
社会模型
在速度更新公式中去掉了认知部分,速度更新公式变为: v i j ( t + 1 ) = ω ⋅ v i j ( t ) + + c 2 ⋅ r 2 j ( t ) ⋅ [ y ^ i j ( t ) − x i j ( t ) ] v_{ij}(t+1)=\omega\cdot v_{ij}(t)++c_2\cdot r_{2j}(t)\cdot [\hat y_{ij}(t)-x_{ij}(t)] vij(t+1)=ω⋅vij(t)++c2⋅r2j(t)⋅[y^ij(t)−xij(t)]
无私模型
无私模型基本上是社会模型,但是邻域最佳解只从粒子的邻域中选择。即粒子本身是不允许成为最佳邻域解的。无私模型在动态变化的环境中表现也很惨。
有关粒子群算法的其他信息,可参见其之前的两篇博客:
粒子群算法(PSO)——总体概述
粒子群算法(PSO)——算法详解(一)