算法PPT另附
天然萤火虫在寻找猎物、吸引配偶和保护领地时表现出惊人的闪光行为。萤火虫的吸引力取决于它的光照强度,对于任何一对萤火虫来说,较亮的萤火虫会吸引另一只萤火虫。所以,亮度较低的个体移向较亮的个体,同时光的亮度随着距离的增加而降低。
有些萤火虫在一大群萤火虫中表现出同步闪光的行为来吸引猎物,雌萤火虫从静止的位置观察雄萤火虫发出的闪光,在发现一个感兴趣的闪光后,雌性萤火虫会做出反应,发出闪光,求偶仪式就这样开始了。一些雌性萤火虫会产生其他种类萤火虫的闪光模式,来诱捕雄性萤火虫并吃掉它们。
根据以上天然萤火虫的行为,我们不难得出以下几个算法原则。
无论是求偶还是捕食,都依赖于萤火虫自身通过发光实现吸引的目的。无性别即要求将所有的萤火虫视作无性别,且可吸引别的萤火虫。
萤火虫的亮度由它周围的环境所决定。对于最优解问题,亮度可以简单地被看做最优解的值。当它处在一个最合适的位置上时,亮度最亮,可视为找到了最优解。
亮度高的萤火虫会吸引亮度低的萤火虫。吸引力与亮度成正比,同时会随着两者距离的增加而减少。如果一只萤火虫发现没有比它更亮的萤火虫,那么它将会随机移动。
由于空气的吸收,光的强度I随着与光源距离r的增加而减小
在看公式的推导之前,知道了前面的算法原则之后,我们可以先来看一下萤火虫算法的流程走向。
Begin
初始化算法基本参数:设置萤火虫数目n,最大吸引度β0,光强吸收系数γ,步长因子α,最大迭代次数MaxGeneration或搜索精度ε;
初始化:随机初始化萤火虫的位置,计算萤火虫的目标函数值作为各自最大荧光亮度I0;
t=1
while(t<=MaxGeneration || 精度>ε)
计算群体中萤火虫的相对亮度I和吸引度β,根据相对亮度决定萤火虫的移动方向;
更新萤火虫的空间位置,对处在最佳位置的萤火虫进行随机移动;
根据更新后萤火虫的位置,重新计算萤火虫的亮度I0;
t=t+1
end while
输出全局极值点和最优个体值。
end
光强(I)与光源距离(r)服从平方反比定律,因此由于空气的吸收,光的强度(I)随着与光源距离的增加而减小,这种现象将萤火虫的可见性限定在了非常有限的半径内:
I ∝ 1 r 2 I ∝\frac{1}{r^2} I∝r21
这里查了一下为什么光强是跟距离的平方成反比而不是普通的距离反比。
光强和光亮度成正比,光亮度是发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比,所以这里写是跟r²成反比。
论文中给出了两个计算光强的公式
I ( r ) = I s r 2 (1) I(r) =\frac{ I_s}{r^2} \tag{1} I(r)=r2Is(1)
I = I 0 e ( − γ r ) (2) I = I_0e^{(-γr)}\tag{2} I=I0e(−γr)(2)
由于当r=0 时,公式(1)数值上极大,与实际不符,故而综合(1)(2)得出公式(3)
I = I 0 e ( − γ r 2 ) (3) I = I_0e^{(-γr^2)} \tag{3} I=I0e(−γr2)(3)
其中I0为距离r=0时的光强(最亮),即自身亮度,与目标函数值有关,目标值越优,亮度越亮;γ为吸收系数,因为荧光会随着距离的增加和传播媒介的吸收逐渐减弱,所以设置光强吸收系数以体现此特性,可设置为常数;r表示两个萤火虫之间的距离。
请注意,这里的距离不一定是欧氏距离,可以根据实际情况选用任何距离算法.
有时我们想选用别的递减速度没有那么快的函数去替代公式(3)
I = I 0 1 + γ r 2 (4) I = \frac{ I_0}{1+γr^2}\tag{4} I=1+γr2I0(4)
让我们来看一下(3)(4)的函数走向
可知(4)确实比(3)递减的更慢一些。
那么为什么可以用(4)去替代(3)呢?
这两个公式展开后长这样↓
可以看出,在O(r³)级别以内二者是相等的,r→0,这两个公式近似相等。
第二步为种群初始化:
x t + 1 = x t + β 0 e − γ r 2 + α ε (5) x_{t+1} = x_t+β_0e^{−γr^2}+αε \tag {5} xt+1=xt+β0e−γr2+αε(5)
其中t表示代数,xt表示个体的当前位置, β 0 e − γ r 2 β_0e^{-γr2} β0e−γr2是吸引度,αε是随机项。
因为吸引度与亮度成正比,亮度和光强成正比,那么计算萤火虫之间的吸引度:
β = β 0 e − γ r 2 (6) β=β_0e^{−γr^2} \tag 6 β=β0e−γr2(6)
其中 β 0 β_0 β0表示r=0时的最大吸引度。
理论上,γ∈[0,∞)
实际上,γ是由实际的特征长度决定的
因此,在大多数应用中,γ取[0.01,100]
下一步,低亮度萤火虫向较亮萤火虫运动:
x i t + 1 = x i t + β 0 e − γ r i j 2 ( x j t − x i t ) + α ε i t (6) x_i^{t+1} =x_i^t +β_0e^ {−γr_ {ij} ^2} (x_j^t −x_ i ^t )+αε _i ^t\tag6 xit+1=xit+β0e−γrij2(xjt−xit)+αεit(6)
一般而言, β 0 β_0 β0取1, α ∈ [ 0 , 1 ] \alpha∈[0,1] α∈[0,1],ε取N(0,1)或其他。若是每个维度的α相差较大,可另设 S k S_k Sk取代, k ∈ ( 1 , 2 , 3 … … ) k∈(1,2,3……) k∈(1,2,3……)
以下是个不成熟的小代码,理论上是这么写,实际上的参数并没有调好
clc,clear
% 构造目标函数
x = linspace(-5,5,10000);
y = 2*sin(3*x)+3*cos(x);
% 原始点位置-光强图
plot(x,y)
hold on;
n=3; % 种群个体数目
x_i = -5 + (5+5) * rand(n,1); % 随机产生n个个体
y_i = 2*sin(3*x_i)+3*cos(x_i);
plot(x_i,y_i,'o')
globe_ans = max(y); % 存储函数内最大光强
gama = 0.01; % 光强吸收系数
beta = 1; % 最大吸引度
alpha = 0.01; % 步长
maxGeneration = 1000000;% 迭代总次数
t = 1; % 目前的迭代次数
globe_I = max(y_i); % 初始种群的最大光强
temp_I = 0;
while (t<=maxGeneration)
for i = 1:n
for j = 1:i
% 若j位置的光强大于i位置的,则i位置向j位置发生移动
if y_i(j)>y_i(i)
if x_i(i)>5
x_i(i)=x_i(i)+beta*exp(-gama*(x_i(j)-x_i(i))^2)*(x_i(j)-x_i(i))-alpha* rand(1);
elseif x_i(i)<-5
x_i(i)=x_i(i)+beta*exp(-gama*(x_i(j)-x_i(i))^2)*(x_i(j)-x_i(i))+alpha* rand(1);
else
x_i(i)=x_i(i)+beta*exp(-gama*(x_i(j)-x_i(i))^2)*(x_i(j)-x_i(i))+alpha*(-1 + (1 +1 )) * rand(1);
end
end
end
% 若i位置的光强为最大光强,则进行随机移动。
if y_i(i) == max(y_i)
x_i(i)=x_i(i)+alpha*(-1 + (1 +1 )) * rand(1);
end
end
% 更新光强
y_i = 2*sin(3*x_i)+3*cos(x_i);
temp_I = max(y_i); % 最优个体值
% 如果个体最优值大于全局最优值,则进行更新。
if(temp_I>globe_I)
globe_I = temp_I;
x_i
end
t=t+1;
end
globe_I
globe_ans
最后全局最优解和理论上的最优解数值相同,意味着找到了光强最亮的那个点
1、X.-S. Yang, “Firefly algorithms for multimodal optimization”, in: Stochastic Algorithms: Foundations and Applications, SAGA 2009,
Lecture Notes in Computer Sciences, Vol. 5792, pp. 169-178 (2009).
2、群体智能优化算法之萤火虫算法