小龙虾优化算法(Crayfish Optimization Algorithm,COA)
提示:本文使用的是迭代次数的代码,没有换成评价次数。
文章由本人与 贾鹤鸣教授合作完成,如有疑问,本人力所能及解答,感谢各位观看。
前言
小龙虾优化算法(Crayfish Optimization Algorithm,COA)是2023年9月提出的一种元启发式优化算法。COA的灵感来源于小龙虾的避暑、竞争和觅食行为。这三种行为对应算法的避暑阶段、竞争阶段和觅食阶段。其中,竞争阶段和觅食阶段为小龙虾优化算法的开发阶段,避暑阶段是小龙虾优化算法的探索阶段。COA具有较好的收敛效果,在CEC2020有着较好的优化效果。
一、小龙虾优化算法的实现
小龙虾优化算法的探索和开发受温度调节,温度是一个随机数。当温度过高时,小龙虾会选择洞穴进行避暑。如果没有其他的小龙虾竞争洞穴,小龙虾会直接进入洞穴,这是小龙虾优化算法的避暑阶段。如果有其他的小龙虾竞争洞穴,则小龙虾会相互竞争,这时小龙虾优化算法的竞争阶段。当温度适宜时,小龙虾优化算法进入觅食阶段。在觅食阶段,小龙虾会根据食物的大小选择直接吃食物或者先撕碎食物再吃食物。其中,小龙虾的进食与觅食量有关。通过温度平衡算法的探索和开发能力,使小龙虾优化算法具有更好的优化效果,能够更快的寻找到一个优异的适应度值。下面是小龙虾优化算法的具体介绍。
1.初始化阶段
在多维优化问题中,每只小龙虾表示一个1×
d
i
m
dim
dim的矩阵,每列矩阵为一个问题的解决方案。COA的初始化是在上下界之间随机生成
N
N
N组候选解
X
X
X。
N
N
N是种群大小、
d
i
m
dim
dim是种群维数。COA初始化如下:
X
=
[
X
1
,
X
2
,
⋯
,
X
N
]
(1)
X = [{X_1},{X_2}, \cdots ,{X_N}]\tag{1}
X=[X1,X2,⋯,XN](1)
X
i
,
j
=
l
b
j
+
(
u
b
j
−
l
b
j
)
×
r
a
n
d
(2)
{X_{i,j}} = l{b_j} + (u{b_j} - l{b_j}) \times rand \tag{2}
Xi,j=lbj+(ubj−lbj)×rand(2)
其中
l
b
j
lb_j
lbj表示第j维的下界,
u
b
j
ub_j
ubj表示第j维的上界,
r
a
n
d
rand
rand是[0,1]的随机数。
2.定义温度和小龙虾的觅食量
温度的改变会影响小龙虾的行为,使小龙虾进行不同的阶段温度的定义如等式3所示。当温度超过30℃时,小龙虾会选择一个凉爽的地方避暑。在适当的温度下,小龙虾就会进行觅食行为。小龙虾的取食量受温度的影响。小龙虾的取食范围在15~30℃之间,25℃为最好。因此,小龙虾的摄食量可以近似于正态分布,从而使摄食量受到温度的影响。小龙虾摄食量的数学模型和不同温度对应的摄食量如下图所示。
t
e
m
p
=
r
a
n
d
×
15
+
20
(3)
temp = rand \times 15 + 20\tag{3}
temp=rand×15+20(3)
其中,
t
e
m
p
temp
temp表示小龙虾所在环境的温度。
p
=
C
1
×
(
1
2
×
π
×
σ
)
×
exp
(
−
(
t
e
m
p
−
μ
)
2
2
σ
2
)
(4)
p = {C_1} \times ({1 \over {\sqrt {2 \times \pi } \times \sigma )}} \times \exp ( - {{{{(temp - \mu )}^2}} \over {2{\sigma ^2}}})\tag{4}
p=C1×(2×π×σ)1×exp(−2σ2(temp−μ)2)(4)
其中,
µ
µ
µ是指最适合小龙虾的温度,分别用
σ
σ
σ和
C
1
C_1
C1来控制不同温度下小龙虾的摄入量.
3.避暑阶段(探索阶段)
当温度大于30度,表示温度过高。此时,小龙虾会进入洞穴避暑。洞穴的定义如下所示:
X
s
h
a
d
e
=
(
X
G
+
X
L
)
/
2
(5)
{X_{shade}} = ({X_G} + {X_L})/2\tag{5}
Xshade=(XG+XL)/2(5)
其中
X
G
X_G
XG表示通过迭代次数所得到的最优位置,XL表示上一代种群更新后获得的最优位置。
小龙虾争夺洞穴是一个随机事件。在COA中,当
r
a
n
d
rand
rand<0.5,这意味着没有其他的小龙虾争夺洞穴,则小龙虾直接进入洞穴避暑,如下图所示。小龙虾进入洞穴避暑如公式所示:
X
i
,
j
t
+
1
=
X
i
,
j
t
+
C
2
×
r
a
n
d
×
(
X
s
h
a
d
e
−
X
i
,
j
t
)
(6)
X_{i,j}^{t + 1} = X_{i,j}^t + {C_2} \times rand \times ({X_{shade}} - X_{i,j}^t)\tag{6}
Xi,jt+1=Xi,jt+C2×rand×(Xshade−Xi,jt)(6)
其中
t
t
t表示当前迭代次数,
t
+
1
t+1
t+1表示下一代迭代次数,
C
2
C_2
C2为递减曲线。
C
2
=
2
−
(
t
/
T
)
(7)
{C_2} = 2 - (t/T)\tag{7}
C2=2−(t/T)(7)
其中,
T
T
T表示最大迭代次数。
4.竞争阶段(开发阶段)
当温度大于30度,
r
a
n
d
rand
rand≥0.5。这意味着其他的小龙虾也选择了这个洞穴。这时,它们会竞争这个洞穴,如下图所示。它们通过以下公式争夺洞穴。
X
i
,
j
t
+
1
=
X
i
,
j
t
−
X
z
,
j
t
+
X
s
h
a
d
e
(8)
X_{i,j}^{t + 1} = X_{i,j}^t - X_{z,j}^t + {X_{shade}}\tag{8}
Xi,jt+1=Xi,jt−Xz,jt+Xshade(8)
z
=
r
o
u
n
d
(
r
a
n
d
×
(
N
−
1
)
)
+
1
(9)
z = round(rand \times (N - 1)) + 1\tag{9}
z=round(rand×(N−1))+1(9)
其中,
z
z
z表示小龙虾的随机个体。
5.觅食阶段(开发阶段)
当温度小于等于30时,该温度适合小龙虾进食。这时,小龙虾会去寻找食物觅食。在进食的时候,小龙虾会根据食物的大小选择是否撕碎食物。如果食物大小合适,小龙虾会使用直接摄取食物。如果食物太大,小龙虾会使用鳌足撕碎食物再使用第二第三步行足交替夹取食物摄取。食物的定义为:
X
f
o
o
d
=
X
G
(10)
{X_{food}} = {X_G}\tag{10}
Xfood=XG(10)
食物大小的定义为:
Q
=
C
3
×
r
a
n
d
×
(
f
i
t
n
e
s
s
i
/
f
i
t
n
e
s
s
f
o
o
d
)
(11)
Q = {C_3} \times rand \times (fitnes{s_i}/fitnes{s_{food}})\tag{11}
Q=C3×rand×(fitnessi/fitnessfood)(11)
其中
C
3
C_3
C3为食物因子,代表最大的食物,值为常数3。
f
i
t
n
e
s
s
i
fitness_i
fitnessi代表第i只小龙虾的适应度值,
f
i
t
n
e
s
s
f
o
o
d
fitness_{food}
fitnessfood代表食物所在位置的适应度值。
当
Q
>
(
C
3
+
1
)
/
2
Q>(C3+1)/2
Q>(C3+1)/2,表示食物太大。这时,小龙虾会通过下面公式撕碎食物。
X
f
o
o
d
=
exp
(
−
1
Q
)
×
X
f
o
o
d
(12)
{X_{food}} = \exp ( - {1 \over Q}) \times {X_{food}}\tag{12}
Xfood=exp(−Q1)×Xfood(12)
撕碎食物后,小龙虾会使用第二第三步行足交替夹取食物摄取。为了模拟交替摄食行为,在等式中采用正弦函数和余弦函数的组合来模拟交替过程,如图所示。不仅如此,小龙虾获得的食物也与食物摄入量有关。摄食的等式如下所示:
X
i
,
j
t
+
1
=
X
i
,
j
t
+
X
f
o
o
d
×
p
×
(
cos
(
2
×
π
×
r
a
n
d
)
−
sin
(
2
×
π
×
r
a
n
d
)
)
(13)
X_{i,j}^{t + 1} = X_{_{i,j}}^t + {X_{food}} \times p \times (\cos (2 \times \pi \times rand) - \sin (2 \times \pi \times rand))\tag{13}
Xi,jt+1=Xi,jt+Xfood×p×(cos(2×π×rand)−sin(2×π×rand))(13)
当
Q
≤
(
C
3
+
1
)
/
2
Q≤(C3+1)/2
Q≤(C3+1)/2,小龙虾会直接向食物移动并进食。等式如下:
X
i
,
j
t
+
1
=
(
X
i
,
j
t
−
X
f
o
o
d
)
×
p
+
p
×
r
a
n
d
×
X
i
,
j
t
(14)
X_{i,j}^{t + 1} = (X_{i,j}^t - {X_{food}}) \times p + p \times rand \times X_{i,j}^t\tag{14}
Xi,jt+1=(Xi,jt−Xfood)×p+p×rand×Xi,jt(14)
二、小龙虾优化算法的流程
步骤1.初始化种群,计算种群的适应度值并获得
X
G
X_G
XG和
X
L
X_L
XL。
步骤2.根据等式3定义小龙虾的生存环境.
步骤3.当温度大于30度且
r
a
n
d
rand
rand<0.5,COA根据等式6获得新的位置并进入步骤8。
步骤4.当温度大于30度且
r
a
n
d
rand
rand≥0.5,COA根据等式8获得新的位置并进入步骤8。
步骤5.当温度小于等于30时,COA进入觅食阶段,根据等式4和等式11定义摄食量
p
p
p和食物大小
Q
Q
Q。
步骤6.如果Q>(
C
3
C_3
C3+1)/2,根据等式12撕碎食物。之后通过等式13摄食获得新位置并进入步骤8。。
步骤7.如果Q≤(
C
3
C_3
C3+1)/2,通过等式14摄食获得新位置并进入步骤8。。
步骤8.评估种群是否退出循环。如果没有返回步骤2。
步骤9.输出最佳位置的个体。
三、小龙虾优化算法的在CEC2020测试结果。
3.1 CEC2020部分测试函数描述
名称 | 公式 | 维度 | 变量范围 | 理论最优 |
---|---|---|---|---|
F1 | F 1 ( x ) = f 1 ( M ( x − o 1 ) ) + F 1 ∗ {F_1}(x) = {f_1}(M(x - {o_1})) + {F_1}* F1(x)=f1(M(x−o1))+F1∗ | 30 | [-100,100] | 100 |
F2 | F 2 ( x ) = f 11 ( M ( 1000 ( x − o 11 ) 100 ) ) + F 2 ∗ {F_2}(x) = {f_{11}}({\rm{M}}({{1000(x - {o_{11}})} \over {100}})) + {F_2} * F2(x)=f11(M(1001000(x−o11)))+F2∗ | 30 | [-100,100] | 100 |
F3 | F 3 ( x ) = f 10 ( M ( 600 ( x − o 7 ) 100 ) ) + F 3 ∗ {F_3}(x) = {f_{10}}(M({{600(x - {o_7})} \over {100}})) + {F_3}* F3(x)=f10(M(100600(x−o7)))+F3∗ | 30 | [-100,100] | 100 |
3.2 CEC2020部分测试函数三维图像显示
3.3 COA在CEC2020的测试效果
四、matlab代码
COA的代码已公布,可自行下载,也欢迎大家进行修改Crayfish Optimization Algorithm
五、参考文献
[1] 贾鹤鸣, 智能优化算法及 MATLAB 实现[M], 清华大学出版社, 2024.
[2] Jia, Heming, Honghua Rao, Changsheng Wen, and Seyedali Mirjalili. Crayfish optimization algorithm[J]. Artificial Intelligence Review. 56(Suppl 2), pp.1919-1979.