经典智能算法:烟花算法,原理公式详解,附matlab代码

烟花优化算法(Firework Algorithm,FWA)是一种新型群智能优化算法,是受烟花爆炸产生火星,并继续分裂爆炸这一过程启发而得出的算法,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2010年发表在知名SCI期刊Advances in Swarm Intelligence上,目前在谷歌学术上被引率高达1214次。

21af5190786622c201362f9146ab27f2.png

FWA受烟花群体涌现行为的启发,实现了对烟花爆炸过程的模拟。当烟花制造得很好时,会产生许多火花,火花集中在爆炸中心。在这种情况下,我们享受壮观的烟花表演。然而,对于一个糟糕的烟花爆炸,产生的火花相当少,并且火花在空间中散布。从搜索算法的角度来看,好的烟花表示烟花位于可能接近最佳位置的有希望的区域中。因此,利用更多的火花来搜索烟花周围的局部区域是合适的。相反,一个糟糕的烟花意味着最佳位置可能远离烟花所在的地方。在FWA中,采用了两个爆炸(搜索)过程,并保持火花的多样性机制也很好地设计。

算法原理

(1)火花的数量

假设FWA是为一般优化问题设计的:

其中x=x1x2...xd表示潜在空间中的位置,f(x)是目标函数,xminxmax表示潜在空间的边界。

然后,每个烟花产生的火花数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘个代码_

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值