改进的䲟鱼优化算法(Modified Remora Optimization Algorithm,MROA)(原文作者)
一、算法灵感
䲟鱼优化算法(Remora Optimization Algorithm, ROA)是2021年提出的一种元启发式优化算法,其灵感来自于海洋中䲟鱼的寄生行为。作为海洋中最聪明的鱼,为了免受敌人的入侵,同时也为了节省体力,䲟鱼会寄生在旗鱼、鲸鱼或其他生物上觅食。算法以䲟鱼寄生在旗鱼(Swordfish Optimization Algorithm, SFO)和鲸鱼(Whale Optimization Algorithm, WOA)身上为例。因此,ROA借鉴了SFO和WOA的部分更新公式,进行全局和局部的位置更新。此外,为了确定是否需要更换宿主,䲟鱼会在宿主周围进行小范围移动,即经验积累,若不需要更换宿主,则进行宿主边觅食。图1展示了䲟鱼捕食的详细过程。
二、算法介绍
2.1 初始化阶段
在ROA中,初始化䲟鱼种群位置的计算公式如下:
X
i
=
l
b
+
r
a
n
d
×
(
u
b
−
l
b
)
(1)
{X_i} = lb + rand \times (ub - lb) \tag{1}
Xi=lb+rand×(ub−lb)(1)式中,
X
i
{X_i}
Xi 为个体
i
{i}
i 的位置,
l
b
{lb}
lb 和
u
b
{ub}
ub 是搜索空间的下界和上界,
r
a
n
d
{rand}
rand 为
0
0
0 到
1
1
1 之间的随机数。
2.2 吸附跟随(探索阶段)
2.2.1 SFO 策略
当䲟鱼吸附在旗鱼身上时,䲟鱼会跟随旗鱼移动。基于SFO算法的精英策略,对SFO算法的公式进行了改进,得到了以下公式:
X
i
t
+
1
=
X
B
e
s
t
t
−
(
r
a
n
d
×
(
X
B
e
s
t
t
+
X
r
a
n
d
t
2
)
−
X
r
a
n
d
t
)
(2)
{X_i}^{t + 1} = {X^t_{Best}} - {{(rand}} \times {{(}}{{{X^t_{Best}} + {X^t_{rand}}} \over 2}{{)}} - {X^t_{rand}}{{)}} \tag{2}
Xit+1=XBestt−(rand×(2XBestt+Xrandt)−Xrandt)(2)其中,
t
{t}
t 为当前迭代次数,
X
B
e
s
t
t
{X^t_{Best}}
XBestt 为当前最优䲟鱼个体,
X
r
a
n
d
t
{X^t_{rand}}
Xrandt 为当前随机䲟鱼个体。
2.2.2 经验积累
当䲟鱼吸附宿主身上时,会根据上一代䲟鱼的位置与当前宿主的位置,在宿主周围进行小范围移动,判断是否需要更换宿主,该过程类似经验上的积累,其数学计算公式如下:
X
a
t
t
=
X
i
t
+
(
X
i
t
−
X
p
r
e
)
×
r
a
n
d
n
(3)
{X_{att}} = {X_i}^t + {{(}}{{{X}}_i}^t - {X_{pre}}{{)}} \times {randn} \tag{3}
Xatt=Xit+(Xit−Xpre)×randn(3)其中,
X
a
t
t
X_{att}
Xatt 是䲟鱼的一次试探性移动,
X
p
r
e
{X_{pre}}
Xpre 表示上一代䲟鱼的位置,可以看做是一种经验,
r
a
n
d
n
randn
randn 为
0
0
0 到
1
1
1 之间正态分布的随机数。
经过小范围移动之后,䲟鱼根会公式(4)判断是否需要切换宿主,切换宿主的公式如公式(5)所示:
f
(
X
i
t
)
>
f
(
X
a
t
t
)
(4)
f(X_i^t) > f({X_{att}}) \tag{4}
f(Xit)>f(Xatt)(4)
H
(
i
)
=
r
o
u
n
d
(
r
a
n
d
)
(5)
H(i) = {{round}}({rand}) \tag{5}
H(i)=round(rand)(5)其中,
H
(
i
)
H(i)
H(i) 决定䲟鱼寄生的宿主,初始值为0或1,若
H
(
i
)
H(i)
H(i) 等于0,则吸附鲸鱼,若
H
(
i
)
H(i)
H(i) 等于1,则吸附旗鱼,round为四舍五入的函数,
f
(
X
i
t
)
f(X_i^t)
f(Xit) 和
f
(
X
a
t
t
)
f({X_{att}})
f(Xatt) 分别为
X
i
t
X_i^t
Xit 与
X
a
t
t
X_{att}
Xatt 的适应度值。
2.3 为吃着想(开发阶段)
2.3.1 WOA 策略
当宿主为鲸鱼时,䲟鱼会跟随鲸鱼同步移动,其计算公式如下:
X
i
t
+
1
=
D
×
e
k
×
cos
(
2
π
a
)
+
X
i
t
(6)
{X_i}^{t + 1} = D \times {e^k} \times \cos {{(}}2\pi a{{)}} + {X_i}^t \tag{6}
Xit+1=D×ek×cos(2πa)+Xit(6)
D
=
∣
X
B
e
s
t
t
−
X
i
t
∣
(7)
D = \left| {{X_{Best}}^t - {X_i}^t} \right| \tag{7}
D=
XBestt−Xit
(7)
k
=
r
a
n
d
×
(
a
−
1
)
+
1
(8)
k = {rand} \times {{(}}a - 1{{)}} + 1 \tag{8}
k=rand×(a−1)+1(8)
a
=
−
(
1
+
t
T
)
(9)
a = - {{(}}1 + {t \over T}{{)}} \tag{9}
a=−(1+Tt)(9)其中,
D
D
D 表示更新前最优位置与当前位置之间的距离,
k
k
k 为
−
1
-1
−1 到
1
1
1 之间的随机数,
a
a
a 在迭代中会在
[
−
2
,
1
]
[-2,1]
[−2,1] 之间线性递减,
T
T
T 为最大迭代次数。
2.3.2 宿主边觅食
宿主边觅食阶段是开发阶段的进一步细分,搜索范围减小,䲟鱼会在宿主周围寻找食物,不再考虑吸附,其数学计算公式如下:
X
i
t
+
1
=
X
i
t
+
A
(10)
{X_i}^{t + 1} = {X_i}^t + A \tag{10}
Xit+1=Xit+A(10)
A
=
B
×
(
X
i
t
−
C
×
X
B
e
s
t
)
(11)
A = B \times {{(}}X_i^t - C \times {X_{Best}}{{)}} \tag{11}
A=B×(Xit−C×XBest)(11)
B
=
2
×
V
×
r
a
n
d
−
V
(12)
B = 2 \times V \times {{rand}} - V \tag{12}
B=2×V×rand−V(12)
V
=
2
∗
(
1
−
t
T
)
(13)
V = 2*{{(}}1 - {t \over T}{{)}} \tag{13}
V=2∗(1−Tt)(13)其中,
A
A
A 为䲟鱼移动的距离,其与䲟鱼和宿主体积有关,䲟鱼因子
C
C
C 用于限制䲟鱼的位置,其值为
0.1
0.1
0.1,
B
B
B 用于模拟宿主的体积,
V
V
V 用于模拟䲟鱼的体积。
三、改进的䲟鱼优化算法
3.1 宿主切换机制
ROA通过对比经验攻击前后位置的适应度值判断是否需要更换宿主。经验攻击与上一代䲟鱼的位置和当前的宿主相关,但䲟鱼主要依靠宿主获取食物,自身觅食的能力差,通过经验攻击切换宿主容易造成探索阶段与开发阶段失衡。因此本文提出了一种新的宿主切换机制,根据公式(14)对宿主周围环境进行新一次评估,根据公式(18)判断是否需要切换宿主。新的宿主切换机制降低了䲟鱼自身觅食能力的影响,提高了算法的性能。
X
n
e
w
=
X
i
t
+
k
×
s
t
e
p
(14)
{X_{new}} = {X_i}^t + k \times step \tag{14}
Xnew=Xit+k×step(14)
k
=
β
×
(
1
−
r
a
n
d
)
+
r
a
n
d
(15)
k = \beta \times {{(}}1 - {{rand)}} + {{rand}} \tag{15}
k=β×(1−rand)+rand(15)
s
t
e
p
=
X
r
1
t
−
X
r
2
t
(16)
step = {X_{r1}}^t - {X_{r2}}^t \tag{16}
step=Xr1t−Xr2t(16)
P
=
0.5
(
2
−
t
/
T
)
(17)
P = 0.5{{(}}2 - t/T{{)}} \tag{17}
P=0.5(2−t/T)(17)
f
(
X
n
e
w
)
<
f
(
X
i
t
)
(18)
f({X_{new}}) < f(X_i^t) \tag{18}
f(Xnew)<f(Xit)(18)其中,
X
n
e
w
X_{new}
Xnew 为宿主周围的一个新位置,
k
k
k 是一个随机移动因子,
β
β
β 为用来控制移动因子,本文选用
0.2
0.2
0.2,用来限制评估的范围,
s
t
e
p
step
step 表示移动的步长,
X
r
1
t
X_{r1}^t
Xr1t 和
X
r
2
t
X_{r2}^t
Xr2t 为随机两个鮣鱼个体的位置,
f
(
X
n
e
w
)
f(X_{new})
f(Xnew) 为
X
n
e
w
X_{new}
Xnew 的适应度值。
P
P
P 线性递减,因为䲟鱼在迭代前期由于所处区域食物匮乏,为了生存会频繁的对宿主周围进行评估,判断是否需要切换宿主;迭代后期进入食物丰富的区域后,由于食物充足,䲟鱼也会减少对切换宿主的需要,这样的改进就更加符合䲟鱼的生活习性。
3.2 联合反向学习
联合反向学习结合了选择性反向和动态反向的优点,进一步平衡了算法的探索与开发的能力,同时又增强了算法的全局性,提高了算法的寻优能力。
3.2.1 选择性领先反向(Selective Leading Opposition,SLO)
SLO是由选择性反向(SO)拓展而来,通过计算当前个体与最优个体之间每个维度的距离,并与一个阈值做比较,大于阈值的为远距离维度,小于阈值的为近距离维度。同时还需要计算当前个体与最优个体之间的斯皮尔曼等级相关系数,对相关性小于
0
0
0 的个体进行选择性领先反向学习。
以二维问题为例,如图2,假设
P
1
P_1
P1、
P
2
P_2
P2、
P
3
P_3
P3 代表䲟鱼的位置,
G
G
G 为最好的位置。假设阈值为
3
3
3,
P
1
P_1
P1 与
G
G
G 第一维度之间的距离为
5
5
5,第二维度之间的距离为
1
1
1,只有第二维度之间的距离小于阈值。在此情况下,仅将SLO策略应用于第二维度。同理,对于个体
P
2
P_2
P2,仅对第一维度进行选择性领先反向;而对于个体
P
3
P_3
P3,第一维度与第二维度都需要进行选择性领先反向。
SLO的计算公式如下:
X
i
,
d
c
‾
=
l
b
+
u
b
−
X
i
,
d
c
,
i
f
s
r
c
<
0
a
n
d
s
i
z
e
(
d
c
)
>
s
i
z
e
(
d
f
)
(19)
\overline {{X_{i,}}_{{d_c}}} = lb + ub - {X_{i,{d_c}}}{{ \ ,}}if{{\ }}src{{ < 0\ and\ size(}}{d_c}{{) > size(}}{d_f}{{)}} \tag{19}
Xi,dc=lb+ub−Xi,dc ,if src<0 and size(dc)>size(df)(19)
s
r
c
=
1
−
6
×
∑
j
=
1
d
i
m
(
d
d
i
,
j
)
2
n
×
(
n
2
−
1
)
(20)
src = 1 - {{6 \times \sum\limits_{j = 1}^{dim} {{{(d{d_{i,j}})}^2}} } \over {n \times ({n^2} - 1)}} \tag{20}
src=1−n×(n2−1)6×j=1∑dim(ddi,j)2(20)其中, 为当前个体的近距离维度,为近距离维度的反向位置,
s
r
c
src
src 为斯皮尔曼等级相关系数,
s
i
z
e
(
d
c
)
size(d_c)
size(dc)和
s
i
z
e
(
d
f
)
size(d_f)
size(df)分别为为个体近距离维度(
d
c
d_c
dc)和远距离维度(
d
f
d_f
df)的数量。通过公式(19)计算当前个体与最优个体之间每个维度之间的距离,小于阈值的为
d
c
d_c
dc,反之为
d
f
df
df,通过公式(20)计算阈值。
d
d
i
,
j
t
=
∣
X
b
e
s
t
,
j
t
−
X
i
,
j
t
∣
(21)
d{d_{i,j}^t}= \left| {{X_{best,j}^t} - {X_{i,j}^t}} \right| \tag{21}
ddi,jt=
Xbest,jt−Xi,jt
(21)
t
h
r
e
s
h
o
l
d
=
2
−
2
t
T
(22)
threshold = {{2 - }}{{2t} \over T} \tag{22}
threshold=2−T2t(22)
3.2.2 动态反向(Dynamic opposite,SLO)
动态反向学习融合了准反射学习与准反射学习,其优点在于能够动态地搜索空间,在搜索空间不对称地移动,有助于算法跳出局部最优,其计算公式如下。
X
i
‾
=
l
b
+
u
b
−
X
i
(23)
\overline {{X_i}} = lb + ub - {X_i} \tag{23}
Xi=lb+ub−Xi(23)
X
r
=
r
a
n
d
×
X
i
‾
(24)
{X_r} = {{rand}} \times \overline {{X_i}} \tag{24}
Xr=rand×Xi(24)
X
‾
d
o
=
X
i
+
r
a
n
d
×
(
X
r
−
X
i
)
,
i
f
r
a
n
d
<
j
r
(25)
{\overline X _{do}} = {X_i} + {{rand}} \times ({X_r} - {X_i}){{ \ ,}}if{{\ rand}} < jr \tag{25}
Xdo=Xi+rand×(Xr−Xi) ,if rand<jr(25)式中,
X
i
‾
\overline {{X_i}}
Xi 为个体的反向,
X
i
{X_i}
Xi 为随机反向解,
X
r
{X_r}
Xr 为动态反向解,
j
r
jr
jr 为跳跃率,即进行动态反向的概率,文
j
r
jr
jr 值为
0.25
0.25
0.25 时效果最优。
3.3 重启策略
重启策略一般用来帮助较差的个体跳出局部最优,摆脱停滞状态。Zhang等使用一个试验向量
t
r
i
a
l
(
i
)
trial(i)
trial(i)记录个体停滞在局部最优的时间,若个体的位置长时间没有得到改善,
t
r
i
a
l
(
i
)
trial(i)
trial(i) 就会加
1
1
1,否则
t
r
i
a
l
(
i
)
trial(i)
trial(i) 会重置为
0
0
0。当个体停滞的时间到达一个界限(即
l
i
m
i
t
limit
limit)时,会通过公式(24)和公式(25)生产一个两个新位置
T
1
T_1
T1 和
T
2
T_2
T2,若
T
2
T_2
T2 超出边界,则通过公式(26)拉回边界,在
T
1
T_1
T1 和
T
2
T_2
T2 中选择一个较优的位置替换当前个体的位置。本文的
l
i
m
i
t
limit
limit 设为
l
n
t
ln^t
lnt ,前期探索阶段
l
i
m
i
t
limit
limit 小一些有助于增强算法的全局性,后期开发阶段若
l
i
m
i
t
limit
limit 值过小可能会导致算法远离最优解。
T
1
=
(
u
b
−
l
b
)
×
r
a
n
d
+
l
b
(26)
{T_1} = (ub - lb) \times {{rand}} + lb \tag{26}
T1=(ub−lb)×rand+lb(26)
T
2
=
(
u
b
+
l
b
)
×
r
a
n
d
−
X
i
(27)
{T_2} = (ub + lb) \times {{rand}} - {X_i} \tag{27}
T2=(ub+lb)×rand−Xi(27)
T
2
=
(
u
b
−
l
b
)
×
r
a
n
d
+
l
b
,
i
f
T
2
>
u
b
∣
∣
T
2
<
l
b
(28)
{T_2} = (ub - lb) \times rand + lb{{\ ,if\ }}{T_2} > ub\ ||\ {T_2} < lb \tag{28}
T2=(ub−lb)×rand+lb ,if T2>ub ∣∣ T2<lb(28)
3.4 MROA的伪代码
- 初始化䲟鱼数量 N N N 和最大迭代次数 T T T 等
- 初始化种群: X i ( i = 1 , 2 , . . . , N ) X_i(i=1,2,...,N) Xi(i=1,2,...,N)
- While t < T t<T t<T do
- 检查是否有䲟鱼超出了搜索空间并进行修改
- 计算每条䲟鱼的饥饿值(适应度值),并找到吃的最饱的䲟鱼 X b e s t X_{best} Xbest
- 通过公式(19)进行选择性领先反向
- For i = 1 i=1 i=1 to N N N do
- If H ( i ) H(i) H(i)==0 then
- 使用公式 (6) 更新被鲸鱼带到的位置
- Else If H ( i ) H(i) H(i)==1 then
- 使用公式 (2) 更新被旗鱼带到的位置
- End If
- 通过公式(3)进行经验积累,并判断是否更换宿主
- 使用公式(17)更新 P P P
- If r a n d < P rand<P rand<P then
- 使用公式(14)对宿主周围环境进行一次评估
- If f ( X i t ) > f ( X a t t ) f(X_i^t)>f({X_{att}}) f(Xit)>f(Xatt) then
- 使用公式 (5) 切换宿主
- End If
- End If
- 使用公式(10)进行宿主边觅食
- 通过公式(23)进行联合反向学习
- 更新每个搜索代理的 t r i a l ( i ) trial(i) trial(i)
- If t r i a l ( i ) > l i m i t trial(i)>limit trial(i)>limit then
- 通过公式(24)和(25)生成两个位置
- 保留饥饿值更小的䲟鱼
- End If
- End For
- t = t + 1 t=t+1 t=t+1
- End While
- 返回吃的最饱的鱼(最优解) X b e s t X_{best} Xbest
四、实验结果
MROA和ROA在23个经典测试函数(设置维度 d i m = 30 dim=30 dim=30)的F2、F5、F6中的收敛曲线,测试函数公式如下:
函数 | 公式 | 理论值 |
---|---|---|
F2 | F 2 ( x ) = ∑ i = 1 n ∣ x i ∣ + ∏ i = 1 n ∣ x i ∣ {F_2}(x) = \sum\nolimits_{i = 1}^n {\left| {{x_i}} \right|} + \prod _{i = 1}^n\left| {{x_i}} \right| F2(x)=∑i=1n∣xi∣+i=1∏n∣xi∣ | 0.00 0.00 0.00 |
F5 | F 5 ( x ) = ∑ i = 1 d − 1 [ 100 ( x i + 1 − x i 2 ) 2 + ( x i − 1 ) 2 ] {F_5}(x) = \sum\nolimits_{i = 1}^{d - 1} {[100{{({x_{i + 1}} - x_i^2)}^2} + {{({x_i} - 1)}^2}]} F5(x)=∑i=1d−1[100(xi+1−xi2)2+(xi−1)2] | 0.00 0.00 0.00 |
F6 | F 6 ( x ) = ∑ i = 1 d ( x i + 5 ) 2 {F_6}(x) = {\sum\nolimits_{i = 1}^d {({x_i} + 5)} ^2} F6(x)=∑i=1d(xi+5)2 | 0.00 0.00 0.00 |