布谷鸟搜索算法
布谷鸟搜索算法(Cuckoo Search Optimization,CS)是一种模拟布谷鸟孵化行为的群智能优化算法,由Yang Xin She和Suash Deb于2009年提出。CS算法利用莱维飞行进行全局搜索,具有良好的全局寻优能力。
算法原理
布谷鸟算法以寄生巢位置表示问题的可行解,通过莱维飞行和随机选择两种寄生策略对寄生巢位置进行更新,改良种群,搜索问题的最优解。CS算法与优化问题的对应关系如下表所示。
CS | 优化问题 |
---|---|
鸟巢位置 | 可行解: X i = ( x i 1 , x i 2 , … , x i D ) X_i=(x_{i1},x_{i2},\dots,x_{iD}) Xi=(xi1,xi2,…,xiD) |
位置优劣 | 适应度 |
算法假设条件如下:
- 每只布谷鸟只产一次卵,并随机选择一个位置的鸟巢进行孵化。
- 在随机选择的鸟巢中,优质的鸟巢将会被保留到下一代。
- 可利用的鸟巢数量固定,鸟巢主人发现外来鸟蛋的概率为 p a ∈ [ 0 , 1 ] p_a \in [0,1] pa∈[0,1]。当鸟巢主人发现外来的布谷鸟蛋时,它会将布谷鸟蛋丢弃或者重新建立新的鸟巢。
算法超参数
- α \alpha α:步长因子,通常取值为1;
- p a p_a pa:布谷鸟蛋被宿主鸟发现的概率;
- NP:种群大小;
- Gmax:最大迭代数。
莱维飞行
莱维飞行是一种步长服从莱维分布的随机游走过程,由高频率的短距离飞行和低频率的长距离飞行组成。算法搜索前期,大步长有利于增加种群多样性,扩大搜索范围,增强算法的全局搜索能力,有利于搜索到全局最优;算法搜索后期,小步长缩小搜索范围,增强算法的局部开发能力,有利于算法收敛。
位置更新公式
X
i
t
+
1
=
X
i
t
+
α
×
L
(
s
,
λ
)
(1)
X_{i}^{t+1}=X_{i}^t + \alpha \times L(s,\lambda) \tag{1}
Xit+1=Xit+α×L(s,λ)(1)
其中莱维飞行步长公式为
L
(
s
,
λ
)
=
λ
Γ
(
λ
)
s
i
n
(
π
λ
/
2
)
π
1
s
1
+
λ
(2)
L(s,\lambda)=\frac{\lambda \Gamma(\lambda)sin(\pi\lambda/2)}{\pi}\frac{1}{s^{1+\lambda}} \tag{2}
L(s,λ)=πλΓ(λ)sin(πλ/2)s1+λ1(2)
莱维飞行代码
from math import gamma
beta = 1.5
n = 2
num = gamma(1+beta)*np.sin(np.pi*beta/2)
den = gamma((1+beta)/2)*beta*(2**((beta-1)/2))
sigmau = (num/den)**(1/beta)
sigmav = 1
u = np.random.normal(0, sigmau, n)
v = np.random.normal(0, sigmav, n)
S = u/(np.abs(v)**(1/beta))
初始化
初始解应当覆盖整个搜索空间,一般采用均匀分布随机生成初始解。
x
i
j
0
=
x
i
,
j
m
i
n
+
r
a
n
d
(
0
,
1
)
⋅
(
x
i
,
j
m
a
x
−
x
i
,
j
m
i
n
)
(3)
x_{ij}^0=x_{i,j}^{min}+rand(0,1) \cdot (x_{i,j}^{max} - x_{i,j}^{min}) \tag{3}
xij0=xi,jmin+rand(0,1)⋅(xi,jmax−xi,jmin)(3)
其中,rand(0,1)表示0-1之间的随机数,
x
i
j
m
a
x
x_{ij}^{max}
xijmax和
x
i
j
m
i
n
x_{ij}^{min}
xijmin分别表示该问题第j个维度变量的上下界。
伪代码
输入:超参数
(
α
,
p
a
,
N
P
,
G
m
a
x
)
(\alpha,p_a,NP,Gmax)
(α,pa,NP,Gmax)和搜索边界
X
m
i
n
X_{min}
Xmin,
X
m
a
x
X_{max}
Xmax
输出:最优解
1:初始化
2:根据式(3)初始化位置种群X
3:记录群体最优gbest
4:优化搜索
5:For G = 1:Gmax
6:
\qquad
按照式(1)更新鸟巢位置
7:
\qquad
生成随机数r与
p
a
p_a
pa比较,决定是否对鸟巢位置进行随机更新
8:
\qquad
新鸟巢位置与原鸟巢位置采取最优保留策略,以保持种群大小不变
9:
\qquad
更新群体最优
g
b
e
s
t
gbest
gbest
10:End
注:优化算法并不保证能够得到问题的最优解,因此,算法输出的最优解并非问题的整体最优解,而是搜索过程中最好的一个解。
实验
实验选取二维的平方和函数,函数的最小值在点(a,b)取得,最小值为0。
f
(
x
1
,
x
2
)
=
(
x
1
−
a
)
2
+
(
x
2
−
b
)
2
(4)
f(x_1,x_2) = (x_1 - a)^2 + (x_2-b)^2 \tag{4}
f(x1,x2)=(x1−a)2+(x2−b)2(4)
实验参数如下:
参数 | 值 |
---|---|
问题维度D | 2 |
种群数NP | 30 |
最大进化次数Gmax | 50 |
α \alpha α | 1 |
p a p_a pa | 0.25 |
取值范围 | (-100,100) |
相对而言,CS算法群体收敛较慢,一定程度上增大了种群的多样性。
最优值 | 最差值 | 平均值 | 标准差 |
---|---|---|---|
0.208e-2 | 7.658 | 0.423 | 1.402 |
代码获取
关注微信公众号数学模型与算法回复 CS算法
获取python代码
参考文献
[1] Yang X S, Deb S. Cuckoo search: recent advances and applications[J]. Neural Computing and applications, 2014, 24: 169-174.
[2] 张晓凤, 王秀英. 布谷鸟搜索算法综述[J]. 计算机工程与应用, 2018, 54(18): 8-16.