改进的白骨顶鸡优化算法(Improved Coot Optimization Algorithm,ICOOT)(原文作者)
一、算法灵感
白骨顶鸡优化算法(Coot Optimization Algorithm, COOT)是2021年提出的一种元启发式优化算法,灵感来源于白骨顶鸡的移动习性。算法对白骨顶鸡种群进行了层级划分,适应度值高者为种群领导者,其余为跟随者。跟随者具有两种位置更新方式,分别为主动更新和被动更新。主动更新过程中,跟随者根据链式运动或随机运动更新位置,并不依赖领导者;在被动更新过程中,跟随者需要向领导者方向发生靠拢。种群需要朝着最佳区域前进,因此在跟随者向领导者靠拢的同时,领导者也要同时不断调整自身位置向最优区域靠近。图1展示了白骨顶鸡的具体移动过程。
二、算法介绍
2.1 初始化
在COOT中,初始化白骨顶鸡种群位置的计算公式如下:
C
o
o
t
P
o
s
(
i
)
=
r
a
n
d
(
1
,
dim
)
.
∗
(
u
b
−
l
b
)
+
l
b
(1)
CootPos{{(}}i{{)}} = {{rand(}}1,\dim{{)}}.*{{(}}ub - lb{{)}} + lb \tag{1}
CootPos(i)=rand(1,dim).∗(ub−lb)+lb(1)其中,
C
o
o
t
P
o
s
(
i
)
CootPos(i)
CootPos(i) 表示第i只白骨顶鸡的位置,
u
b
ub
ub 和
l
b
lb
lb 分别表示搜索空间的上界和下界,
r
a
n
d
rand
rand 为
0
0
0 到
1
1
1 之间的随机数,
d
i
m
dim
dim 表示维度。
从白骨顶鸡种群中随机选取
N
L
NL
NL 只白骨顶鸡作为领导者,记为
L
e
a
d
e
r
P
o
s
LeaderPos
LeaderPos,剩余的
N
c
o
o
t
Ncoot
Ncoot 只白骨顶鸡为跟随者,记为
F
o
l
l
o
w
P
o
s
FollowPos
FollowPos,
N
L
NL
NL 和
N
c
o
o
t
Ncoot
Ncoot 的计算公式如下:
N
L
=
N
p
o
p
×
P
(2)
NL = Npop \times P \tag{2}
NL=Npop×P(2)
N
c
o
o
t
=
N
p
o
p
−
N
L
(3)
Ncoot = Npop - NL \tag{3}
Ncoot=Npop−NL(3)其中,
N
p
o
p
Npop
Npop 为种群数量,
P
P
P 为参数
0.1
0.1
0.1。
2.2 跟随者位置更新(探索阶段)
2.2.1 主动更新
当一个取值范围为 [ 0 , 1 ] [0,1] [0,1] 的随机数 r a n d 1 > 0.5 rand_1>0.5 rand1>0.5 时,白骨顶鸡跟随者将选择主动更新策略,主动更新策略包括两种运动方式,通过一个取值范围为 [ 0 , 1 ] [0,1] [0,1] 的随机数 r a n d 2 rand_2 rand2 来决定选择哪一种运动方式。
2.2.1.1 随机运动
当
r
a
n
d
2
<
0.5
rand_2<0.5
rand2<0.5 时白骨顶鸡跟随者进行随机运动,为了体现运动的随机性,首先在位置空间内生成一个随机位置
Q
Q
Q。其数学公式如下:
Q
=
r
a
n
d
(
1
,
d
)
.
∗
(
u
b
−
l
b
)
+
l
b
(4)
Q = {{rand(}}1,d{{)}}.*{{(}}ub - lb{{)}} + lb \tag{4}
Q=rand(1,d).∗(ub−lb)+lb(4) 然后白骨顶鸡个体会向移动到随机生成的位置,其数学公式如下:
F
o
l
l
o
w
P
o
s
(
i
)
=
F
o
l
l
o
w
P
o
s
(
i
)
+
A
×
R
1
×
(
Q
−
F
o
l
l
o
w
P
o
s
(
i
)
)
(5)
FollowPos{{(}}i{{)}} = FollowPos{{(}}i{{)}} + A \times {R_1} \times {{(}}Q - FollowPos{{(}}i{{))}} \tag{5}
FollowPos(i)=FollowPos(i)+A×R1×(Q−FollowPos(i))(5)其中,
F
o
l
l
o
w
e
r
P
o
s
(
i
)
FollowerPos(i)
FollowerPos(i) 表示第i个跟随者的位置,
R
1
R_1
R1 是区间
[
0
,
1
]
[0,1]
[0,1] 中的随机数,参数
A
A
A 为在
[
0
,
1
]
[0,1]
[0,1] 中线性递减的因子。其计算公式如下:
A
=
1
−
t
×
(
1
/
M
a
x
I
t
e
r
)
(6)
A = 1 - t \times {{(}}1/MaxIter{{)}} \tag{6}
A=1−t×(1/MaxIter)(6)其中,
t
t
t 是当前迭代次数,
M
a
x
I
t
e
r
MaxIter
MaxIter 是最大迭代次数。
2.2.1.2 链式运动
当
r
a
n
d
2
>
0.5
rand_2>0.5
rand2>0.5 时,执行链式运动,算法将相邻两只白骨顶鸡的中间位置用于实现链式运动。其数学公式如下:
F
o
l
l
o
w
P
o
s
(
i
)
=
0.5
×
(
F
o
l
l
o
w
P
o
s
(
i
−
1
)
+
F
o
l
l
o
w
P
o
s
(
i
)
)
(7)
FollowPos{{(}}i{{)}} = 0.5 \times {{(}}FollowPos{{(}}i - 1{{)}} + FollowPos{{(}}i{{))}} \tag{7}
FollowPos(i)=0.5×(FollowPos(i−1)+FollowPos(i))(7)其中,
F
o
l
l
o
w
P
o
s
(
i
−
1
)
FollowPos(i-1)
FollowPos(i−1) 是上一只白骨顶鸡跟随者的位置。
2.2.2 被动更新
当
r
a
n
d
1
<
0.5
rand_1<0.5
rand1<0.5 时,白骨顶鸡跟随者选择领导者引导更新位置。通常情况下,种群由前面的几只白骨顶鸡领导,其他个体必须根据领导者调整自己的位置,并向它们移动。为了实现这一运动利用式(8)的机制选择领导者。
k
=
1
+
(
i
)
m
o
d
(
N
L
)
(8)
k = 1 + (i){{mod(}}NL) \tag{8}
k=1+(i)mod(NL)(8)其中,
i
i
i 是跟随者的索引数,
k
k
k 是领导者的索引数,
m
o
d
mod
mod 为取余函数。跟随者随领导者的位置更新公式如下:
F
o
l
l
o
w
P
o
s
(
i
)
=
L
e
a
d
P
o
s
(
k
)
+
2
×
R
2
×
cos
(
2
R
π
)
×
(
L
e
a
d
e
r
P
o
s
(
k
)
−
F
o
l
l
o
w
P
o
s
(
i
)
)
(9)
FollowPos(i) = LeadPos(k) + 2 \times {R_2} \times \cos (2R\pi ) \times (LeaderPos(k) - FollowPos(i)) \tag{9}
FollowPos(i)=LeadPos(k)+2×R2×cos(2Rπ)×(LeaderPos(k)−FollowPos(i))(9)其中,
L
e
a
d
e
r
P
o
s
(
k
)
LeaderPos(k)
LeaderPos(k) 为第
k
k
k 个领导者的位置,
R
R
R 和
R
2
R_2
R2 为区间
[
0
,
1
]
[0,1]
[0,1] 中的随机数,
π
π
π 为圆周率的值。
2.3 领导者位置更新(开发阶段)
L
e
a
d
e
r
P
o
s
(
i
)
=
{
B
×
R
3
×
cos
(
2
R
π
)
×
(
g
B
e
s
t
−
L
e
a
d
e
r
P
o
s
(
i
)
)
+
g
B
e
s
t
R
4
<
0.5
B
×
R
3
×
cos
(
2
R
π
)
×
(
g
B
e
s
t
−
L
e
a
d
e
r
P
o
s
(
i
)
)
−
g
B
e
s
t
R
4
≥
0.5
(10)
LeaderPos(i) = \left\{ \begin{aligned} {B \times {R_3} \times \cos (2R\pi ) \times (gBest - LeaderPos(i)) + gBest\qquad{R_4} < 0.5} \cr {B \times {R_3} \times \cos (2R\pi ) \times (gBest - LeaderPos(i)) - gBest\qquad{R_4} \ge 0.5} \cr \end{aligned}\right. \tag{10}
LeaderPos(i)={B×R3×cos(2Rπ)×(gBest−LeaderPos(i))+gBestR4<0.5B×R3×cos(2Rπ)×(gBest−LeaderPos(i))−gBestR4≥0.5(10)其中,
L
e
a
d
e
r
P
o
s
(
i
)
LeaderPos(i)
LeaderPos(i) 为第
i
i
i 个领导者的位置,
g
B
e
s
t
gBest
gBest 是种群最优位置,
R
3
R_3
R3 和
R
4
R_4
R4 是区间
[
0
,
1
]
[0, 1]
[0,1] 中的随机数,参数
B
B
B 为在
[
0
,
2
]
[0, 2]
[0,2] 中线性递减的因子,
B
B
B 根据公式(11)计算:
B
=
2
−
t
×
(
1
/
M
a
x
I
t
e
r
)
(11)
B = 2 - t \times {{ (}}1/MaxIter) \tag{11}
B=2−t×(1/MaxIter)(11)
三、改进的白骨顶鸡优化算法
3.1 随机反向学习策略
反向学习策略(opposition-based learning,OBL)是Tizhoosh于2005年提出的群智能领域中的一种改进策略,通过产生一个反向解,比较当前解与反向解的适应度值,择优进入下一次迭代。数学表达式如下:
X
′
=
l
b
+
u
b
−
L
e
a
d
e
r
P
o
s
(12)
X' = lb + ub - LeaderPos \tag{12}
X′=lb+ub−LeaderPos(12) 由于反向学习策略生成的反向解缺乏随机性,Long等人提出了一种改进的反向学习策略(Random Opposition-based Learning, ROBL),引入随机值
r
a
n
d
rand
rand 进一步加强了种群多样性,提高了种群跳出局部最优的能力。其数学公式如下:
X
r
a
n
d
=
l
b
+
u
b
−
r
×
L
e
a
d
e
r
P
o
s
(13)
{X_{rand}} = lb + ub - r \times LeaderPos \tag{13}
Xrand=lb+ub−r×LeaderPos(13)其中,
X
r
a
n
d
X_{rand}
Xrand 表示随机反向解,
r
r
r 表示
0
0
0 到
1
1
1 之间的随机数。
3.2 复合突变策略
引入复合突变策略来改进COOT。首先该策略在进行位置更新时会产生三个新的白骨顶鸡个体分别为
V
i
1
V_{i1}
Vi1、
V
i
2
V_{i2}
Vi2、
V
i
3
V_{i3}
Vi3,计算公式如下:
V
i
1
,
j
=
{
F
o
l
l
o
w
P
o
s
r
1
,
j
+
F
1
×
(
F
o
l
l
o
w
P
o
s
r
2
,
j
−
F
o
l
l
o
w
P
o
s
r
3
,
j
)
,
i
f
r
a
n
d
<
C
1
o
r
j
=
j
r
a
n
d
F
o
l
l
o
w
P
o
s
i
,
j
,
o
t
h
e
r
w
i
s
e
(14)
{V_{i1,j}} = \left\{ \begin{aligned} &{FollowPo{s_{r1,j}} + {F_1} \times (FollowPo{s_{r2,j}} - FollowPo{s_{r3,j}})\ ,{{ if\ }}rand{{ < }}{C_1}{{\ or\ }}j{{ = }}{j_{rand}}} \cr &{FollowPo{s_{i,j}}\ ,{{otherwise}}} \cr \end{aligned}\right. \tag{14}
Vi1,j={FollowPosr1,j+F1×(FollowPosr2,j−FollowPosr3,j) ,if rand<C1 or j=jrandFollowPosi,j ,otherwise(14)
V
i
2
,
j
=
{
F
o
l
l
o
w
P
o
s
r
4
,
j
+
F
2
×
(
F
o
l
l
o
w
P
o
s
r
5
,
j
−
F
o
l
l
o
w
P
o
s
r
6
,
j
)
+
F
2
×
(
F
o
l
l
o
w
P
o
s
r
7
,
j
−
F
o
l
l
o
w
P
o
s
r
8
,
j
)
,
i
f
r
a
n
d
<
C
2
o
r
j
=
j
r
a
n
d
F
o
l
l
o
w
P
o
s
i
,
j
,
o
t
h
e
r
w
i
s
e
(15)
{V_{i2,j}} = \left\{ \begin{aligned} &{FollowPo{s_{r4,j}} + {F_2} \times {{(}}FollowPo{s_{r5,j}} - FollowPo{s_{r6,j}}{{) + }}{F_2} \times (FollowPo{s_{r7,j}} - FollowPo{s_{r8,j}})\ ,{{if\ }}rand{{ < }}{C_2}{{\ or\ }}j{{ = }}{j_{rand}}} \cr &{FollowPo{s_{i,j}}\ ,{{otherwise}}} \cr \end{aligned} \right. \tag{15}
Vi2,j={FollowPosr4,j+F2×(FollowPosr5,j−FollowPosr6,j)+F2×(FollowPosr7,j−FollowPosr8,j) ,if rand<C2 or j=jrandFollowPosi,j ,otherwise(15)
V
i
3
,
j
=
{
F
o
l
l
o
w
P
o
s
i
,
j
+
r
a
n
d
×
(
F
o
l
l
o
w
P
o
s
r
9
,
j
−
F
o
l
l
o
w
P
o
s
x
,
j
)
+
F
3
×
(
F
o
l
l
o
w
P
o
s
r
10
,
j
−
F
o
l
l
o
w
P
o
s
r
11
,
j
)
,
i
f
r
a
n
d
<
C
3
o
r
j
=
j
r
a
n
d
X
i
,
j
,
o
t
h
e
r
w
i
s
e
(16)
{V_{i3,j}} = \left\{ \begin{aligned} &{FollowPo{s_{i,j}} + {{rand}} \times (FollowPo{s_{r9,j}} - FollowPo{s_{x,j}}) + {F_3} \times (FollowPo{s_{r10,j}} - FollowPo{s_{r11,j}})\ ,{{if\ }}rand{{ < }}{C_3}{{\ or\ }}j{{ = }}{j_{rand}}} \cr &{{X_{i,j}}\ ,{{otherwise}}} \cr \end{aligned} \right. \tag{16}
Vi3,j={FollowPosi,j+rand×(FollowPosr9,j−FollowPosx,j)+F3×(FollowPosr10,j−FollowPosr11,j) ,if rand<C3 or j=jrandXi,j ,otherwise(16)其中
r
1
,
r
2
,
⋅
⋅
⋅
,
r
11
r1,r2,···,r11
r1,r2,⋅⋅⋅,r11 是
[
1
,
N
p
o
p
]
[1,Npop]
[1,Npop] 间不同的整数,
F
o
l
l
o
w
P
o
s
i
,
j
FollowPos_{i,j}
FollowPosi,j 表示
i
i
i 个体在
j
j
j 维度的位置,
j
r
a
n
d
j_{rand}
jrand表示区间
[
1
,
d
i
m
]
[1,dim]
[1,dim] 中的整数。
C
1
,
C
2
,
C
3
C_1,C_2,C_3
C1,C2,C3 为交叉率值分别为
0.1
0.1
0.1、
0.2
0.2
0.2、
0.9
0.9
0.9。
F
1
F_1
F1,
F
2
F_2
F2,
F
3
F_3
F3 表示尺度系数分别为
1
1
1、
0.8
0.8
0.8、
1
1
1。
从
V
i
1
V_{i1}
Vi1、
V
i
2
V_{i2}
Vi2、
V
i
3
V_{i3}
Vi3 中找出最佳候选解,与当前解比较,选择更优的解,其计算公式如下:
F
o
l
l
o
w
P
o
s
(
i
)
=
{
V
i
,
i
f
f
(
V
i
)
<
f
(
F
o
l
l
o
w
P
o
s
(
i
)
)
F
o
l
l
o
w
P
o
s
(
i
)
,
o
t
h
e
r
w
i
s
e
(17)
FollowPos(i) = \left\{ \begin{aligned} &{{V_i}\ ,{{if\ }}f({V_i}){{ }} < {{ }}f(FollowPos(i))} \cr &{FollowPos(i){{\ ,otherwise}}} \cr \end{aligned}\right. \tag{17}
FollowPos(i)={Vi ,if f(Vi)<f(FollowPos(i))FollowPos(i) ,otherwise(17)其中,
V
i
V_i
Vi 为最佳候选解。
3.3 ICOOT算法的伪代码
- 初始化白骨顶鸡数量 N N N 和最大迭代次数 M a x I t e r MaxIter MaxIter 等
- 根据(2)、(3)式对种群进行层级划分,并对种群进行初始化: C o o t P o s i ( i = 1 , 2 , . . . , N ) CootPos_i (i=1,2,...,N) CootPosi(i=1,2,...,N)
- while t < M a x I t e r t < MaxIter t<MaxIter do
- 分别计算跟随者和领导者的适应度值,并找到适应度值最佳的白骨顶鸡 g B e s t gBest gBest
- For i = 1 i = 1 i=1 to N c o o t Ncoot Ncoot do
- If r a n d 1 > 0.5 rand_1>0.5 rand1>0.5 then
- If r a n d 2 < 0.5 rand_2<0.5 rand2<0.5 then
- 根据公式(5)更新跟随者位置
- Else
- 根据公式(7)更新跟随者位置
- End If
- Else
- 根据公式(9)更新跟随者位置
- End If
- 根据公式(14)、(15)、(16)产生三个新个体,并择优对原个体进行替换
- End For
- For i = 1 i = 1 i=1 to N P NP NP do
- 根据(10)式更新领导者位置
- 使用公式(13)根据每个领导者产生一个随机反向解,比较当前解与随机反向解的适应度值,并择优
- End For
- End While
- 返回吃的最饱的白骨顶鸡(最优解) g B e s t gBest gBest
四、实验结果
ICOOT和COOT在23个经典测试函数(设置维度 d i m = 30 dim=30 dim=30)的F4、F6、F12中的收敛曲线,测试函数公式如下:
函数 | 公式 | 理论值 |
---|---|---|
F4 | F 4 ( x ) = max { ∣ x i ∣ , 1 ≤ i ≤ n } {F_4}(x) = \max \{ \left| {{x_i}} \right|,1 \le i \le n\} F4(x)=max{∣xi∣,1≤i≤n} | 0.00 0.00 0.00 |
F6 | F 6 ( x ) = ∑ i = 1 n ( x i + 5 ) 2 {F_6}(x) = {\sum\nolimits_{i = 1}^n {({x_i} + 5)} ^2} F6(x)=∑i=1n(xi+5)2 | 0.00 0.00 0.00 |
F12 | F 12 ( x ) = π n { 10 sin ( π y 1 ) + ∑ i = 1 n − 1 ( y i − 1 ) 2 [ 1 + 10 sin 2 ( π y i + 1 ) ] + ( y n − 1 ) 2 } + ∑ i = 1 n u ( x i , 10 , 100 , 4 ) , w h e r e y i = 1 + x i + 1 4 {F_{12}}(x) = {\pi \over n}\{ 10\sin (\pi {y_1}) + \sum\nolimits_{i = 1}^{n - 1} {{{({y_i} - 1)}^2}[1 + 10{{\sin }^2}(\pi {y_{i + 1}})] + {{({y_n} - 1)}^2}} \} + \sum\nolimits_{i = 1}^n {u({x_i},10,100,4),{{where\ }}{y_i} = 1 + {{{x_i} + 1} \over 4}} F12(x)=nπ{10sin(πy1)+∑i=1n−1(yi−1)2[1+10sin2(πyi+1)]+(yn−1)2}+∑i=1nu(xi,10,100,4),where yi=1+4xi+1 | 0.00 0.00 0.00 |
其中: u ( x i , a , k , m ) = { k ( x i − a ) m , x i > a 0 , − a < x i < a k ( − x i − a ) m , x i < − a u({x_i},a,k,m) = \left\{ \begin{aligned} &k{({x_i} - a)^m}\ \ \ \ ,{x_i} > a \cr &0\qquad\qquad \ \ \ \ ,- a < {x_i} < a \cr &k{( - {x_i} - a)^m}\ ,{x_i} < - a \cr \end{aligned} \right. u(xi,a,k,m)=⎩ ⎨ ⎧k(xi−a)m ,xi>a0 ,−a<xi<ak(−xi−a)m ,xi<−a
4.1 F4收敛曲线
4.2 F5收敛曲线
4.3 F8收敛曲线
五、参考文献
[1] 贾鹤鸣, 智能优化算法及 MATLAB 实现[M], 清华大学出版社, 2024。
[2] 贾鹤鸣, 李玉海, 文昌盛, 孟彬, 饶洪华, 李政邦. 改进白骨顶鸡优化算法的 WSN 网络覆盖[J]. 福建工程学院学报, 2022, 20(6), 561-566.