萤火虫算法(Firefly Algorithm)
1. 概述
萤火虫算法(Firefly Algorithm)是一种启发式算法,灵感来自于萤火虫闪烁的行为。萤火虫的闪光,其主要目的是作为一个信号系统,以吸引其他的萤火虫。
其假设为:
萤火虫不分性别,这样一个萤火虫将会吸引到所有其他的萤火虫;吸引力与它们的亮度成正比,对于任何两个萤火虫,不那么明亮的萤火虫被吸引,因此移动到更亮的一个,然而,亮度又随着其距离的增加而减少;如果没有比一个给定的萤火虫更亮的萤火虫,它会随机移动。亮度应与目标函数联系起来。萤火虫算法是以自然为灵感的启发式优化算法。
2. 算法
在D维解空间内每个萤火虫的位置为:
X
=
(
x
1
,
x
2
,
…
,
x
D
)
X=\left(x_{1}, x_{2}, \ldots, x_{D}\right)
X=(x1,x2,…,xD)
萤火虫之间的相对吸引度由以下公式:
β
(
r
)
=
β
0
e
−
γ
r
2
(
1
)
\beta(r)=\beta_{0} e^{-\gamma r^{2}} (1)
β(r)=β0e−γr2(1)
式中$ \beta_{0} $为其初始吸引度,即两只萤火虫之间距离为0时的吸引度,r为两只萤火虫之间的距离。
算法运行过程中,每只萤火虫将会朝着所有亮度比自己高的所有萤火虫移动,其移动距离由以下公式(2)计算得出:
X
i
’
=
X
i
+
β
0
e
−
γ
r
2
(
X
i
−
X
j
)
+
α
rand
(
)
(
2
)
X_{i}’=X_{i}+\beta_{0} e^{-\gamma r^{2}}\left(X_{i}-X_{j}\right)+\alpha \operatorname{rand}() (2)
Xi’=Xi+β0e−γr2(Xi−Xj)+αrand()(2)
其中
X
i
X_i
Xi表示一个比第i个个体亮度更高的萤火虫的位置,r表示第i个萤火虫与第j个萤火虫之间的距离。rand()为一个随机扰动,
α
\alpha
α为扰动的步长因子。一般rand()取值为[-0.5,0.5]范围内的均匀分布或者U(0,1)的标准正态分布a取值为[0,1]之间。
基本流程如下:
(1)初始化,设定萤火虫的种群为N,介质对光的吸收系数为$ \gamma=1 $ ,初始步长 a=0.97 ,初始吸引度
β
0
=
1.0
\beta_{0}=1.0
β0=1.0,其中
β
max
=
1.0
,
β
min
=
0.2
\beta_{\max }=1.0, \beta_{\min }=0.2
βmax=1.0,βmin=0.2,其吸引度公式:
β
(
r
)
=
(
β
max
−
β
min
)
e
−
γ
r
2
+
β
min
(
3
)
\beta(r)=\left(\beta_{\max }-\beta_{\min }\right) e^{-\gamma r^{2}}+\beta_{\min } (3)
β(r)=(βmax−βmin)e−γr2+βmin(3)
公式保证任何两个萤火虫之间的最小吸引度为0.2,最大的吸引度为1.0。
(2)根据萤火虫的位置计算出每个萤火虫的适应度值,适应度值越优的萤火虫亮度越高。
(3)每个萤火虫将根据式(2)向所有比自己亮度高的萤火虫飞行其中第t代时萤火虫飞行的步长公式 :
α
(
t
)
=
α
t
(
4
)
\alpha(t)=\alpha^{t} (4)
α(t)=αt(4)
式(4)计算出的萤火虫飞行步长将随时间递减。
由于所有个体只会向比自己亮度高的个体飞行,那么群体中亮度最高的个体将不会更新其位置。本文中群体中亮度最大的个体将按照以下公式(5)来更新自己的位置。
X
i
′
=
X
i
+
α
rand Guass
(
)
(
5
)
X_{i}^{\prime}=X_{i}+\alpha \text { rand Guass }() (5)
Xi′=Xi+α rand Guass ()(5)
(4)计算在萤火虫向所有比自己亮度高的其它个体飞行后所到的新位置的适应度值,若该位置优于飞行之前的位置,则该萤火虫将飞行到新的位置,否则萤火虫将停留在原处。
(5)若算法到达最大迭代次数则将搜索到的最优的萤火虫的位置作为解输出,否则将跳到步骤(2)。
转载请注明:Daniel的博客