萤火虫算法
1. 简介
萤火虫算法是一种群体智能、启发式算法,它是来自于萤火虫闪烁亮度的行为所提出来。2005年,印度学者K.N.Krishnanand和D.Ghose在IEEE群体智能会议上提出了一种新的群智能优化算法,人工萤火虫群优化(Glowworm Swarm Optimization, GSO)算法。2008年Yang提出萤火虫算法(Firefly Algorithm),该算法调整的参数较少,收敛速度较快。
2. 数学描述
2.1 FA算法
首先,FA算法有一些基本假设。其基本的假设为:萤火虫是发光亮度跟当前的位置有关系,位置越好,发光的亮度就越高。萤火虫互相之间会吸引到所有其他的有亮度的萤火虫,从而能够吸引其范围内亮度弱的其他萤火虫向其靠近,并且它们之间的相对亮度与吸引度和距离成反比。发光强的萤火虫会做随机运动。所以在算法中,利用问题的目标值来衡量萤火虫位置的好坏,而用迭代表达式模拟萤火虫的搜索飞行移动,通过这样的假设来构造算法,并逐渐靠向问题的最优解。
搜索过程中,萤火虫算法中有两个重要的参数有关系:萤火虫的发光亮度和相互吸引度。如果两个萤火虫发光亮度一致,那么萤火虫会做随机运动,这两个重要的参数都与距离成反比,距离越大则吸引度越小。
萤火虫的相对荧光度 设求解数学问题的目标函数为
f
(
x
)
f(x)
f(x)。一般情况下,萤火虫的相对荧光亮度为:
I
i
j
=
I
0
e
−
γ
r
i
j
2
I_{ij}=I_{0}e^{-\gamma r_{ij}^{2}}
Iij=I0e−γrij2
其中,
I
0
I_{0}
I0表示最亮萤火虫的亮度或者被称作是绝对亮度信息,即自身
r
=
0
r=0
r=0处的亮度,这个值是与目标函数值有关系的,目标函数的值越优,那么自身的亮度也就越高;
γ
\gamma
γ为光的吸收系数;
r
i
j
r_{ij}
rij为萤火虫
i
i
i和萤火虫
j
j
j之间的距离:
r
i
j
=
∣
∣
x
i
−
x
j
∣
∣
=
∑
k
=
1
d
(
x
i
k
−
x
j
k
)
2
r_{ij}=||x_{i}-x_{j}||=\sqrt{\sum\limits_{k=1}^{d}(x_{ik}-x_{jk})^{2}}
rij=∣∣xi−xj∣∣=k=1∑d(xik−xjk)2
萤火虫相互吸引度 如若萤火虫
i
i
i的绝对亮度大于萤火虫
j
j
j的绝对亮度,那么萤火虫
j
j
j被萤火虫
i
i
i所吸引而向着萤火虫
i
i
i移动,设萤火虫
i
i
i对萤火虫
j
j
j的吸引力为
β
i
j
\beta_{ij}
βij,则有
β
i
j
=
β
0
e
−
γ
r
i
j
2
\beta_{ij}=\beta_{0}e^{-\gamma r_{ij}^{2}}
βij=β0e−γrij2
其中,
β
0
\beta_{0}
β0是最大吸引力,指的是
r
=
0
r=0
r=0处的吸引度,通常取
β
0
=
1.0
\beta_{0}=1.0
β0=1.0。
最优目标迭代公式萤火虫
j
j
j被萤火虫
i
i
i吸引而向着
i
i
i移动,则萤火虫
j
j
j的位置更新公式为:
x
j
(
t
+
1
)
=
x
j
(
t
)
+
β
i
j
(
x
i
(
t
)
−
x
j
(
t
)
)
+
α
ϵ
j
x_{j}(t+1)=x_{j}(t)+\beta_{ij}(x_{i}(t)-x_{j}(t))+\alpha\epsilon_{j}
xj(t+1)=xj(t)+βij(xi(t)−xj(t))+αϵj
其中
α
\alpha
α为常数,
t
t
t是迭代次数,
ϵ
j
\epsilon_{j}
ϵj是均匀分布、高斯分布等等随机数。当然,在特定的情况下可以改进吸引度
β
\beta
β和步长
α
\alpha
α:
β
i
j
(
t
)
=
β
min
+
(
β
max
−
β
min
)
e
−
γ
r
i
j
2
\beta_{ij}(t)=\beta_{\text{min}}+(\beta_{\text{max}}-\beta_{\text{min}})e^{-\gamma r_{ij}^{2}}
βij(t)=βmin+(βmax−βmin)e−γrij2
α = α t \alpha=\alpha^{t} α=αt
等等类似的改进方法。
2.2 GSO算法
GSO算法和FA算法是有很大的不同的,每一只人工萤火虫散步在求解的空间中,萤火虫带着荧光,并且拥有各自的视线范围,称为决策区域,并且亮度与自己所在的目标值有关系,越量的萤火虫表示它所在的位置越好,即有着较为优良的目标函数值。萤火虫在决策范围区域内寻找邻居集合,在集合中,越亮的邻居拥有越高的吸引力吸引萤火虫往这个方向进行移动,每一次飞行的方向会随着挑选的邻居不同而改变。另外,决策范围的大小会受到邻居数量的影响,当邻居密度越低的时候,萤火虫的决策半径会加大以寻找更多的邻居;当邻居密度越高的时候,决策半径会缩小。最后大部分萤火虫会聚集在多个位置上,达到了极值点。所以GSO包括四个阶段:萤火虫的部署(初始化)、荧光素的更新、位置的更新和决策半径的更新。
初始化: 可行域内放置
n
n
n个个体萤火虫,并赋予每个萤火虫的荧光素为
l
0
l_{0}
l0,动态的决策区域为
r
0
r_{0}
r0,初始化步长
s
s
s,邻域的阈值
n
t
n_{t}
nt,荧光素消失率
ρ
\rho
ρ,荧光素更新率
γ
\gamma
γ,动态决策域更新率
β
\beta
β,萤火虫感知域
r
s
r_{s}
rs,迭代的次数
M
M
M。
荧光素的更新操作: 设对第
k
k
k只萤火虫进行荧光素更新的操作,则
l
k
(
t
)
=
(
1
−
ρ
)
l
k
(
t
−
1
)
+
γ
J
(
x
k
(
t
)
)
l_{k}(t)=(1-\rho)l_{k}(t-1)+\gamma J(x_{k}(t))
lk(t)=(1−ρ)lk(t−1)+γJ(xk(t))
其中
J
(
x
k
)
J(x_{k})
J(xk)表示萤火虫
k
k
k在
t
t
t时刻的目标函数值;
l
k
(
t
)
l_{k}(t)
lk(t)表示萤火虫
k
k
k在
t
t
t时刻荧光素的值。
寻找萤火虫
k
k
k的邻居:
N
k
(
t
)
=
{
j
:
∣
∣
x
j
(
t
)
−
x
k
(
t
)
∣
∣
<
r
d
k
(
t
)
;
l
k
(
t
)
<
l
j
(
t
)
}
N_{k}(t)=\{j:||x_{j}(t)-x_{k}(t)||<r_{d}^{k}(t);l_{k}(t)<l_{j}(t)\}
Nk(t)={j:∣∣xj(t)−xk(t)∣∣<rdk(t);lk(t)<lj(t)}
其中
N
k
(
t
)
N_{k}(t)
Nk(t)表示萤火虫
k
k
k在
t
t
t时刻的邻居集合;
r
d
k
(
t
)
r_{d}^{k}(t)
rdk(t)表示萤火虫
k
k
k在时刻
t
t
t动态决策域。
确定萤火虫的移动方向:
j
=
max
(
p
k
)
j=\max(p_{k})
j=max(pk)
其中
p
k
=
(
p
k
1
,
p
k
2
,
.
.
.
,
p
k
N
k
(
t
)
)
p_{k}=(p_{k1},p_{k2},...,p_{kN_{k}(t)})
pk=(pk1,pk2,...,pkNk(t))
每两个点之间的转移概率为:
p
k
j
=
l
j
(
t
)
−
l
k
(
t
)
∑
i
∈
N
k
(
t
)
(
l
i
(
t
)
−
l
k
(
t
)
)
p_{kj}=\frac{l_{j}(t)-l_{k}(t)}{\sum\limits_{i\in N_{k}(t)}(l_{i}(t)-l_{k}(t))}
pkj=i∈Nk(t)∑(li(t)−lk(t))lj(t)−lk(t)
更新萤火虫
k
k
k的位置:
X
k
(
t
+
1
)
=
X
k
(
t
)
+
s
X
j
(
t
)
−
X
k
(
t
)
∣
∣
X
j
(
t
)
−
X
k
(
t
)
∣
∣
X_{k}(t+1)=X_{k}(t)+s{\frac{X_{j}(t)-X_{k}(t)}{||X_{j}(t)-X_{k}(t)||}}
Xk(t+1)=Xk(t)+s∣∣Xj(t)−Xk(t)∣∣Xj(t)−Xk(t)
更新动态决策区域:
r
d
k
(
t
+
1
)
=
min
(
r
s
,
max
(
0
,
r
d
k
(
t
)
,
β
(
n
t
−
∣
N
k
(
t
)
∣
)
)
)
r_{d}^{k}(t+1)=\min(r_{s},\max(0,r_{d}^{k}(t),\beta(n_{t}-|N_{k}(t)|)))
rdk(t+1)=min(rs,max(0,rdk(t),β(nt−∣Nk(t)∣)))
3. 算法基本流程
3.1 FA算法
步骤一:初始化算法的基本参数信息。设置萤火虫的数目
n
n
n,最大吸引度
β
0
\beta_{0}
β0,光强度吸收系数
γ
\gamma
γ,步长因子
α
\alpha
α,最大迭代次数;
步骤二:随机初始化萤火虫的位置,计算萤火虫的目标函数值作为各自最大荧光亮度
I
0
I_{0}
I0;
步骤三:计算群体中萤火虫的相对亮度
I
I
I和吸引度
β
\beta
β,根据相对亮度决定萤火虫的移动方向;
步骤四:更新萤火虫的空间位置信息,由于萤火虫会向着绝对亮度比本身大而且个体间距较小的萤火虫移动,通过轮盘赌的方法进行位置选择,对在最好位置处的萤火虫进行随机移动。
步骤五:更新萤火虫的位置,并重新计算萤火虫的亮度信息;
步骤六:当满足搜索最大次数的时候则结束算法,否则转到第三步骤,进行下一次的更新操作。
3.2 GSO算法
步骤一:初始化各个参数信息;
步骤二:随机初始化第
k
k
k个萤火虫在目标函数搜索范围内的位置信息;
步骤三:计算萤火虫
k
k
k在
t
t
t时刻的荧光素值
l
k
(
t
)
l_{k}(t)
lk(t);
步骤四:每只萤火虫在其动态决策区域半径
r
d
k
(
t
+
1
)
r_{d}^{k}(t+1)
rdk(t+1),选择荧光素的值比自己高的个体组成其领域集合
N
k
(
t
)
N_{k}(t)
Nk(t),其中
0
<
r
d
k
(
t
)
<
r
s
0<r_{d}^{k}(t)<r_{s}
0<rdk(t)<rs。其中
r
s
r_{s}
rs为萤火虫个体感知半径。
步骤五:计算萤火虫
k
k
k向相邻区域集合内个体
j
j
j的移动概率;
步骤六:使用轮盘赌的方法计算个体
j
j
j,然后移动,更新位置信息;
步骤七:更新萤火虫动态决策区域半径的值;
步骤八:是否达到最大的迭代次数,若是则结束算法,若否则转向步骤三。
4. 实际应用
4.1 简单的例子
4.2 用于求解TSP问题
在TSP问题中,最优值的求解主要是通过对个体路径的距离信息作为评判的标准。设萤火虫
k
k
k的路径信息为
path
k
=
{
p
k
1
,
p
k
2
,
.
.
.
,
p
k
N
}
\text{path}_{k}=\{p_{k1},p_{k2},...,p_{kN}\}
pathk={pk1,pk2,...,pkN},那么在FA算法中,通常使用如下的值作为更新的
I
0
I_{0}
I0值:
I
0
=
1
∑
j
=
1
N
−
1
d
(
path
k
(
j
)
,
path
k
(
j
+
1
)
)
+
d
(
path
k
(
N
)
,
path
k
(
0
)
)
I_{0}=\frac{1}{\sum\limits_{j=1}^{N-1}d(\text{path}_{k}(j),\text{path}_{k}(j+1))+d(\text{path}_{k}(N),\text{path}_{k}(0))}
I0=j=1∑N−1d(pathk(j),pathk(j+1))+d(pathk(N),pathk(0))1
表明,路径越小,则发光强度信息 I 0 I_{0} I0就会越大。
这里的路径信息需要重新定义,每个个体信息为TSP问题中的路径序列值,那么,对于萤火虫
k
k
k和萤火虫
i
i
i之间的距离为:
r
k
i
=
∑
m
=
1
N
(
p
k
m
−
p
i
m
)
2
r_{ki}=\sum\limits_{m=1}^{N}(p_{km}-p_{im})^{2}
rki=m=1∑N(pkm−pim)2
5. 参数的选取原则
小结
参考文献
[1] 基于改进萤火虫算法的TSP问题
[2] 萤火虫算法详解