一、理论基础
2005年,印度学者K.N.Krishnanand和D.Ghose在IEEE群体智能会议上提出了一种新的群智能优化算法,人工萤火虫群优化(Glowworm Swarm Optimization, GSO)算法。2009年,剑桥学者Xin-She Yang根据自然界中萤火虫的发光行为提出萤火虫算法(Firefly Algorithm, FA)。自这两种萤火虫算法提出以来,各国学者对这两种算法进行了研究、改进和应用。经过几年的发展,在连续空间的寻优过程和一些生产调度方面萤火虫算法具有良好的应用前景。
GSO和FA有相似的方面,但在具体实现方面有一定差异。本文具体介绍FA算法。
二、FA算法
1、算法假设
作者为了简单地描述FA算法,使用以下三个理想化的规则:
(1)所有的萤火虫都是中性的,这样不管它们的性别,一只萤火虫都会被其他萤火虫吸引;
(2)吸引力与它们的亮度成正比,因此对于任何两只闪光的萤火虫,越不明亮的一只会移动到最亮的一个。吸引力与亮度成正比,并且随着距离的增加,两者都会降低。如果没有比特定萤火虫更亮的萤火虫,它会随机移动;
(3)萤火虫的亮度受目标函数的景观影响或决定。对于最大化问题,亮度可以简单地与目标函数的值成比例。其他形式的亮度可以用类似于遗传算法中的适应度函数的方式来定义。
2、算法描述
FA算法的伪代码可以概括为:
3、算法原理
如上所述,萤火虫算法包含两个要素,即亮度和吸引度。亮度体现了萤火虫所处位置的优劣并决定其移动方向,吸引度决定了萤火虫移动的距离,通过亮度和吸引度的不断更新, 从而实现优化。
(1)亮度
萤火虫的相对荧光亮度为: I = I 0 ⋅ e − γ r i , j (1) I=I_0\boldsymbol· \,e^{-\gamma r_{i,j}}\tag{1} I=I0⋅e−γri,j(1)其中, I 0 I_0 I0为萤火虫的最大萤光亮度,与目标函数值相关,目标函数值越优自身亮度越高; γ \gamma γ为光强吸收系数,荧光会随着距离的增加和传播媒介的吸收逐渐减弱; r i , j r_{i,j} ri,j为萤火虫 i i i与 j j j之间的欧氏距离。
(2)吸引度
萤火虫的吸引度为: β = β 0 ⋅ e − γ r i , j 2 (2) \beta=\beta_0\boldsymbol ·\, e^{-\gamma r_{i,j}^2}\tag{2} β=β0⋅e−γri,j2(2)其中, β 0 \beta_0 β0为最大吸引度; γ \gamma γ为光强吸收系数; r i , j r_{i,j} ri,j为萤火虫 i i i与 j j j之间的欧氏距离。
(3)距离和移动
如果两个萤火虫
i
i
i和
j
j
j的空间位置分别是
x
i
\boldsymbol x_i
xi和
x
j
\boldsymbol x_j
xj,那么它们之间的距离为:
r
i
,
j
=
∣
∣
x
i
−
x
j
∣
∣
=
∑
k
=
1
d
(
x
i
,
k
−
x
j
,
k
)
2
(3)
r_{i,j}=||\boldsymbol x_i-\boldsymbol x_j||=\sum_{k=1}^d\sqrt{(x_{i,k}-x_{j,k})^2}\tag{3}
ri,j=∣∣xi−xj∣∣=k=1∑d(xi,k−xj,k)2(3)萤火虫
i
i
i被吸引向萤火虫
j
j
j移动的位置更新公式如式(4)所示:
x
i
=
x
i
+
β
(
x
j
−
x
i
)
+
α
(
r
a
n
d
−
1
2
)
(4)
\boldsymbol x_i=\boldsymbol x_i+\beta(\boldsymbol x_j-\boldsymbol x_i)+\alpha (rand-\frac{1}{2})\tag{4}
xi=xi+β(xj−xi)+α(rand−21)(4)其中,
x
i
\boldsymbol x_i
xi和
x
j
\boldsymbol x_j
xj为萤火虫
i
i
i和
j
j
j所处的空间位置;
α
∈
[
0
,
1
]
\alpha∈[0,1]
α∈[0,1]为步长因子;
r
a
n
d
rand
rand为
[
0
,
1
]
[0,1]
[0,1]上服从均匀分布的随机数。
三、MATLAB程序实现
1、问题描述
Ackley函数表达式如下:
f
(
x
)
=
20
(
1
−
e
x
p
(
−
0.2
1
d
∑
k
=
1
d
x
k
2
)
)
−
e
x
p
(
1
d
∑
i
=
1
d
c
o
s
(
2
π
x
i
)
)
+
e
x
p
(
1
)
(5)
f(\boldsymbol x)=20\left(1-exp\left(-0.2\sqrt{\frac{1}{d}\sum_{k=1}^dx_k^2}\right)\right)-exp\left(\frac1d\sum_{i=1}^dcos(2\pi x_i)\right)+exp(1) \tag{5}
f(x)=20⎝⎛1−exp⎝⎛−0.2d1k=1∑dxk2⎠⎞⎠⎞−exp(d1i=1∑dcos(2πxi))+exp(1)(5)其中,
d
d
d是自变量
x
\boldsymbol x
x的维数,
x
i
(
i
=
1
,
2
,
⋯
,
d
)
x_i(i=1,2,\cdots,d)
xi(i=1,2,⋯,d)为
x
\boldsymbol x
x的第
i
i
i个分量。
Ackley函数的三维立体图形如图2所示。
本案例设 d = 5 d=5 d=5。
2、程序实现
- Ackley函数的程序如下:
function z = Ackley(x)
z = 20*(1-exp(-0.2*sqrt(mean(x.^2))))+exp(1)-exp(mean(cos(2*pi*x)));
end
- 主函数程序如下:
%% 清空环境变量
clc;
clear;
close all;
%% 问题设定
CostFunction = @(x) Ackley(x); % 目标函数
nVar = 5; % 变量个数
VarSize = [1 nVar]; % 变量矩阵大小
VarMin = -10; % 变量下限
VarMax = 10; % 变量上限
%% FA参数
MaxIt = 1000; % 最大迭代次数
nPop = 25; % 萤火虫数量 (种群规模)
gamma = 1; % 光强吸收系数
beta0 = 1; % 初始吸引度
alpha = 0.2; % 步长因子
alpha_damp = 0.98; % 步长缩减系数
m = 2; % 距离指数因子
if isscalar(VarMin) && isscalar(VarMax)
dmax = (VarMax-VarMin)*sqrt(nVar);
else
dmax = norm(VarMax-VarMin);
end
%% 初始化
% 空的萤火虫结构体
firefly.Position = [];
firefly.Cost = [];
% 初始化种群数组
pop = repmat(firefly, nPop, 1);
% 初始化每代最优解矩阵
BestSol.Cost = inf;
% 产生初始种群
for i = 1:nPop
pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
pop(i).Cost = CostFunction(pop(i).Position);
if pop(i).Cost <= BestSol.Cost
BestSol = pop(i);
end
end
% 保存最优值的数组
BestCost = zeros(MaxIt, 1);
%% FA迭代优化
for it = 1:MaxIt
newpop = repmat(firefly, nPop, 1);
for i = 1:nPop
newpop(i).Cost = inf;
for j = 1:nPop
if pop(j).Cost < pop(i).Cost
rij = norm(pop(i).Position-pop(j).Position)/dmax;
beta = beta0*exp(-gamma*rij^m); % 吸引度
newsol.Position = pop(i).Position ...
+ beta*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
+ alpha*(rand(VarSize)-0.5);
newsol.Position = max(newsol.Position, VarMin);
newsol.Position = min(newsol.Position, VarMax);
newsol.Cost = CostFunction(newsol.Position);
if newsol.Cost <= newpop(i).Cost
newpop(i) = newsol;
if newpop(i).Cost <= BestSol.Cost
BestSol = newpop(i);
end
end
end
end
end
% 合并
pop = [pop
newpop]; %#ok
% 排序
[~, SortOrder] = sort([pop.Cost]);
pop = pop(SortOrder);
% 截断
pop = pop(1:nPop);
% 保存每代最优解
BestCost(it) = BestSol.Cost;
% 显示迭代信息
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
% 步长缩减
alpha = alpha*alpha_damp;
end
%% 结果
figure;
% plot(BestCost, 'r', 'LineWidth', 2);
semilogy(BestCost, 'r', 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
3、结果显示
FA算法迭代进化过程如图3所示。
四、参考文献
[1] Yang X. Firefly algorithms for multimodal optimization[C]. International Symposium on Stochastic Algorithms. Springer, Berlin, Heidelberg, 2009: 169-178.
[2] 智能算法研学社(Jack旭). 智能优化算法:萤火虫算法-附代码. CSDN博客.