改进的䲟鱼优化算法(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 |