烟花优化算法(Firework Algorithm,FWA)是一种新型群智能优化算法,是受烟花爆炸产生火星,并继续分裂爆炸这一过程启发而得出的算法,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2010年发表在知名SCI期刊Advances in Swarm Intelligence上,目前在谷歌学术上被引率高达1214次。
FWA受烟花群体涌现行为的启发,实现了对烟花爆炸过程的模拟。当烟花制造得很好时,会产生许多火花,火花集中在爆炸中心。在这种情况下,我们享受壮观的烟花表演。然而,对于一个糟糕的烟花爆炸,产生的火花相当少,并且火花在空间中散布。从搜索算法的角度来看,好的烟花表示烟花位于可能接近最佳位置的有希望的区域中。因此,利用更多的火花来搜索烟花周围的局部区域是合适的。相反,一个糟糕的烟花意味着最佳位置可能远离烟花所在的地方。在FWA中,采用了两个爆炸(搜索)过程,并保持火花的多样性机制也很好地设计。
算法原理
(1)火花的数量
假设FWA是为一般优化问题设计的:
其中x=x1,x2,...,xd表示潜在空间中的位置,f(x)是目标函数,xmin和xmax表示潜在空间的边界。
然后,每个烟花产生的火花数si定义如下:
其中m是控制由n个烟花产生的火花总数的参数,ymax=max{f(Xi)}(i=1,2,.,n)是n个烟花中目标函数的最大(最差)值,并且利用表示计算机中的最小常数的k来避免零分割误差。
为了避免灿烂的烟花的压倒性影响,定义了si的界限,如下式所示:
其中a和b是常量参数。
(2)爆炸幅度
与火花数的设计相比,好的烟花爆炸的振幅小于坏的烟花爆炸的振幅。每个烟花的爆炸幅度定义如下:
式中,A表示最大爆炸振幅,ymin=min{f(xi)}(i=1,2,.,n)是n个烟花中目标函数的最小(最佳)值。
(3)产生火花
在爆炸中,火花可能会受到随机z方向(维度)的爆炸影响。在FWA中,我们随机获得受影响方向的数量如下: 其中d是位置x的维数,rand(0,1)是[0,1]上的均匀分布。
(4)位置选择
在每个爆炸生成的开始,应为烟花爆炸选择n个位置。在FWA中,当前的最佳位置x,目标函数f(x)在当前位置中是最佳的,总是被保持用于下一个爆炸生成。之后,基于它们与其他位置的距离选择n-1个位置,以保持火花的多样性。位置xi和其他位置之间的一般距离定义如下: 其中K是烟花和火花的所有当前位置的集合。如下定义位置xi的选择概率
当烟花被点燃时,一簇火花将充满烟花周围的局部空间。在我们看来,烟花的爆炸过程可以被看作是通过爆炸中产生的火花在烟花燃放的特定点周围的局部空间中的搜索。
MATLAB核心代码
function [fitness_best_array_return, time_return] = opt_FWA(params)
tic
global total_fiteval_times;
global Coef_Explosion_Amplitude;
global Max_Sparks_Num;
global Min_Sparks_Num;
global Coef_Spark_Num;
total_fiteval_times = 0;
Coef_Explosion_Amplitude = 40;
Max_Sparks_Num = 40;
Min_Sparks_Num = 2;
Coef_Spark_Num = 50;
global evaTime;
evaTime = 0;
SeedsMatrix = zeros(params.seednum, params.dim); % locations after individual movement
fitness_best_array = zeros(1,params.maxEva); % store the best fitness
% initialization
for i = 1 : params.seednum
SeedsMatrix(i,:) = repmat(params.lowerInit, 1, params.dim) + rand(1, params.dim).* repmat(params.upperInit - params.lowerInit, 1, params.dim);
end
% computing the fitness of each seeds
SeedsFitness = zeros(1,params.seednum);
SeedsFitness(1)=feval(params.fun_name,SeedsMatrix(1,:));
evaTime = evaTime + 1;
fitness_best_array(evaTime) = SeedsFitness(1);
for i=2:params.seednum
SeedsFitness(i)=feval(params.fun_name,SeedsMatrix(i,:));
if(SeedsFitness(i)<fitness_best_array(evaTime))
fitness_best_array(evaTime+1) = SeedsFitness(i);
else
fitness_best_array(evaTime+1) = fitness_best_array(evaTime);
end
evaTime = evaTime + 1;
end
% iteration by iteration
while evaTime < params.maxEva
% calculate the number of sons that each seed should generate
sonsnum_array = sonsnum_cal(SeedsFitness,params);
% calculate the exploding scope of sons that each seed generate
scope_array = scope_cal(SeedsFitness,params);
% generate the sparks, based on the sparks number and explosion amplitude of each firework
[SonsMatrix,SonsFitness,fitness_best_array] = sons_generate(sonsnum_array,scope_array,SeedsMatrix,params,fitness_best_array);
% perform the gaussian mutation of seeds
[SeedsMatrixGauss,SeedsFitGaussMutation,fitness_best_array] = seedGaussMutation(SeedsMatrix, params,fitness_best_array);
% all the seeds
AllMatrix = [SeedsMatrix;SonsMatrix;SeedsMatrixGauss];
% attention SeedsFitness'
AllFitness = [SeedsFitness,SonsFitness,SeedsFitGaussMutation];
% select the next iteration
[SeedsMatrix,SeedsFitnessCurrentIte]=selectNextIterationOnEntropy(AllMatrix,AllFitness,params);
%把结果存到下一代中
SeedsFitness=SeedsFitnessCurrentIte;
end
time_return = toc;
fprintf(' \n Best fitness for FWA: %.6f ... runtime: %g', fitness_best_array(params.maxEva), time_return);
fitness_best_array_return = fitness_best_array(1,params.maxEva_mod100);
for i = 1 :params.maxEva_mod100
fitness_best_array_return(i) = fitness_best_array(i*params.modStep);
end
参考文献
[1]Tan Y, Zhu Y. Fireworks algorithm for optimization[C]//Advances in Swarm Intelligence: First International Conference, ICSI 2010, Beijing, China, June 12-15, 2010, Proceedings, Part I 1. Springer Berlin Heidelberg, 2010: 355-364.
完整代码获取方式:后台回复关键字:
TGDM100