基于成功历史的自适应差分进化算法(SHADE)
SHADE是基于JADE的有效优化,相比于JADE更稳定。
current-to-pbest
SHADE使用了JADE的优化策略DE/current-to-pbest。
v
i
,
G
=
x
i
,
G
+
F
i
⋅
(
x
p
b
e
s
t
,
G
−
x
i
,
G
)
+
F
i
⋅
(
x
r
1
,
G
−
x
r
2
,
G
)
\begin{equation} v_{i,G}=x_{i,G}+F_i \centerdot(x_{pbest,G}-x_{i,G})+F_i\centerdot(x_{r1,G}-x_{r2,G}) \end{equation}
vi,G=xi,G+Fi⋅(xpbest,G−xi,G)+Fi⋅(xr1,G−xr2,G)
相比于JADE中p是固定值,SHADE中p取值
[
2
/
p
o
p
_
s
i
z
e
,
0.2
]
[2/pop\_size,0.2]
[2/pop_size,0.2],其中0.2是JADE作者在其论文中建议的最大值。
外部存储器
SHADE有一个外部存储器用于保存上一代被淘汰的亲本向量 x i , G x_{i,G} xi,G,该存储其中的样本集合被记为A,规定 ∣ A ∣ = ∣ P ∣ |A|=|P| ∣A∣=∣P∣,当档案大小超过 ∣ P ∣ |P| ∣P∣时,随机替换其中的样本,(1)式中 x r 2 , G x_{r2,G} xr2,G就取自 P ∪ A P\cup A P∪A。
参数自适应
C
R
i
=
r
a
n
d
n
i
(
μ
C
R
,
0.1
)
F
i
=
r
a
n
d
c
i
(
μ
F
,
0.1
)
\begin{equation} CR_i=randn_i(\mu_{CR},0.1) \end{equation}\\[2mm] \begin{equation} F_i=randc_i(\mu_F,0.1) \end{equation}
CRi=randni(μCR,0.1)Fi=randci(μF,0.1)
r
a
n
d
n
randn
randn表示正态分布,形状相对集中,而
r
a
n
d
c
randc
randc表示柯西分布,其形状则可以取更广的范围。
柯西分布的长尾特性可以更高的捕捉极端事件的发生概率。
生成的 C R CR CR如果超出范围[0,1]则取边界值,而 F F F如果大于1取1,小于等于0则重新生成。
在每一代中,在
C
R
i
CR_i
CRi和
F
i
F_i
Fi值成功生成优于亲本个体
x
i
,
G
x_{i,G}
xi,G的试验向量
u
i
,
G
u_{i,G}
ui,G,记录为
S
C
R
S_{CR}
SCR,
S
F
S_F
SF,并且在生成结束时,JADE中
μ
C
R
μ_{CR}
μCR,
μ
F
μ_F
μF更新为:
μ
C
R
=
(
1
−
c
)
⋅
μ
C
R
+
c
⋅
m
e
a
n
W
A
(
S
C
R
)
μ
F
=
(
1
−
c
)
⋅
μ
F
+
c
⋅
m
e
a
n
L
(
S
F
)
\begin{equation} μ_{CR}=(1-c)\centerdot μ_{CR}+c\centerdot mean_{WA}(S_{CR}) \end{equation}\\[2mm] \begin{equation} μ_F=(1-c)\centerdot \mu_F+c\centerdot mean_L(S_F) \end{equation}
μCR=(1−c)⋅μCR+c⋅meanWA(SCR)μF=(1−c)⋅μF+c⋅meanL(SF)
其中,
m
e
a
n
A
mean_A
meanA是算术均值,
m
e
a
n
L
mean_L
meanL是莱默均值。
设 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn是n个正实数, t t t为任意实数。
则莱默均值定义为:
L t ( x 1 , . . . , x n ) = x 1 t + 1 + x 2 t + 1 + . . . + x n t + 1 x 1 t + x 2 t + . . . + x n t = ∑ i = 1 n x i ( t + 1 ) ∑ i = 1 n x i t \begin{equation} L_t(x_1,...,x_n)=\frac{x_1^{t+1}+x_2^{t+1}+...+x_n^{t+1}}{x_1^{t}+x_2^{t}+...+x_n^{t}}=\frac{\sum_{i=1}^nx_i^{(t+1)}}{\sum_{i=1}^nx_i^{t}} \end{equation} Lt(x1,...,xn)=x1t+x2t+...+xntx1t+1+x2t+1+...+xnt+1=∑i=1nxit∑i=1nxi(t+1)
之所以用莱默均值是因为 F F F是由柯西分布随机生成,可能存在部分极端值,而莱默均值对于极端值计算时还会考虑权重,对整个数据分布的形状更加稳健。
上式中
μ
C
R
\mu_{CR}
μCR是使用算术均值更新的,这会偏置
μ
C
R
\mu_{CR}
μCR,使其收敛到一个较小的值。因此SHADE采用了权重均值(6)。
m
e
a
n
W
A
(
S
C
R
)
=
∑
k
=
1
∣
S
C
R
∣
w
k
⋅
S
C
R
,
k
\begin{equation} mean_{WA}(S_{CR})=\sum_{k=1}^{|S_{CR}|}w_k\centerdot S_{CR,k} \end{equation}
meanWA(SCR)=k=1∑∣SCR∣wk⋅SCR,k
权重计算如下,其中
∇
f
k
=
∣
f
(
u
k
,
G
)
−
f
(
x
x
,
G
)
∣
\nabla f_k=|f(u_{k,G})-f(x_{x,G})|
∇fk=∣f(uk,G)−f(xx,G)∣。
w
k
=
∇
f
k
∑
k
=
1
∣
S
C
R
∣
∇
f
k
\begin{equation} w_k=\frac{\nabla f_k}{\sum_{k=1}^{|S_{CR}|}\nabla f_k} \end{equation}
wk=∑k=1∣SCR∣∇fk∇fk
而由于权重的计算方式,在算法中,当
f
(
u
i
,
G
)
⩽
f
(
x
i
,
G
)
f(u_{i,G})\leqslant f(x_{i,G})
f(ui,G)⩽f(xi,G)时更新个体,而只在
f
(
u
i
,
G
)
<
f
(
x
i
,
G
)
f(u_{i,G})<f(x_{i,G})
f(ui,G)<f(xi,G)时记录
S
C
R
S_{CR}
SCR和
S
F
S_F
SF。如流程图16-24行。
同样的,
μ
F
\mu_F
μF也使用了权重·莱默均值进行更新,如下:
m
e
a
n
W
L
=
∑
i
=
1
n
w
i
⋅
x
i
(
t
+
1
)
∑
i
=
1
n
w
i
⋅
x
i
t
\begin{equation} mean_{WL}=\frac{\sum_{i=1}^nw_i\centerdot x_i^{(t+1)}}{\sum_{i=1}^nw_i\centerdot x_i^{t}} \end{equation}
meanWL=∑i=1nwi⋅xit∑i=1nwi⋅xi(t+1)
M
C
R
M_{CR}
MCR和
M
F
M_F
MF用于保存
S
C
R
S_{CR}
SCR和
S
F
S_F
SF,全初始化为0.5。经试验,H取值为
p
o
p
_
s
i
z
e
pop\_size
pop_size时收敛效果最好。
与JADE一样,成功个体使用的
C
R
i
CR_i
CRi和
F
i
F_i
Fi值记录在
S
C
R
S_{CR}
SCR和
S
F
S_F
SF中,在生成结束时,存储器的内容更新如下:
M
C
R
,
k
,
G
+
1
=
{
m
e
a
n
W
A
(
S
C
R
)
if
S
C
R
≠
∅
M
C
R
,
k
,
G
otherwise
M
F
,
k
,
G
+
1
=
{
m
e
a
n
W
L
(
S
F
)
if
S
F
≠
∅
M
F
,
k
,
G
otherwise
\begin{equation} M_{CR,k,G+1}= \begin{dcases} mean_{WA}(S_{CR}) &\text{if } S_{CR}\not=\empty \\ M_{CR,k,G} &\text{otherwise} \end{dcases} \end{equation}\\[2mm] \begin{equation} M_{F,k,G+1}= \begin{dcases} mean_{WL}(S_{F}) &\text{if } S_{F}\not=\empty \\ M_{F,k,G} &\text{otherwise} \end{dcases} \end{equation}
MCR,k,G+1={meanWA(SCR)MCR,k,Gif SCR=∅otherwiseMF,k,G+1={meanWL(SF)MF,k,Gif SF=∅otherwise
显然当
G
G
G代中的所有个体未能生成比父代更好的试验向量时,
S
C
R
=
S
F
=
∅
S_{CR}=S_F=\empty
SCR=SF=∅,此时存储器不更新。
k
∈
[
1
,
H
]
k\in[1,H]
k∈[1,H],决定存储器更新的位置,初始化为1,每次更新加1,当
k
⩾
H
k\geqslant H
k⩾H时重新赋值1。
算法流程图
为了避免陷入局部最优,我采用了排队搜索算法(Queuing search algorithm, QSA)来生成初始值。简单来说就是使用QSA优化一定轮次的随机矩阵,优化的结果作为SHADE的初始值。
通过对QSA与一些最先进或知名的元启发式算法的比较,证明了QSA是一种极具竞争力的元启发式算法,在
跳出局部最优解
和搜索全局最优解
方面具有很大的优势和竞争力。
以下是近期实验结果整理:
N阶 | SHADE | QSA-SHADE | ||
---|---|---|---|---|
成功率 (es<5e-6) | 运行时间 | 成功率 (es<5e-6) | 运行时间 | |
6阶 | 77.5% | 27.9s (epoch=2000) | 67.5% | 21.4s (epoch=2000) |
8阶 | 100% | 114.19s (epoch=6000) | 100% | 105.88s (epoch=6000) |
10阶 | 65% | 667.03s (epoch=10000) | 72.5% | 537.72s (epoch=10000) |