萤火虫算法(Fire-fly algorithm,FA)由剑桥大学 Yang 于 2009 年提出 , 作为最新的群智能优化算法之一 , 该算法具有更好的收敛速度和收敛精度 , 且易于工程实现等优点。
1 算法原理
在FA 中 , 萤火虫发出光亮的主要目的是作为一个信号系统 , 以吸引其他的萤火虫个体 , 其假设为 : 1) 萤火虫不分性别 , 它将会被吸引到所有其他比它更亮的萤火虫那去 ; 2) 萤火虫的吸引力和亮度成正比 , 对于任何两只萤火虫 , 其中一只会向着比它更亮的另一只移动 , 然而 , 亮度是随着距离的增加而减少的 ;3) 如果没有找到一个比给定的萤火虫更亮 , 它会随机移动 。
如上所述 , 萤火虫算法包含两个要素 , 即亮度和吸引度 . 亮度体现了萤火虫所处位置的优劣并决定其移动方向 , 吸引度决定了萤火虫移动的距离 , 通过亮度和吸引度的不断更新 , 从而实现目标优化 . 从数学角度对萤火虫算法的主要参数进行如下描述 :
算法步骤如下:
(1) 初始化萤火虫算法参数.
(2) 计算各萤火虫的亮度并排序得到亮度最大的萤火虫位置.
(3)判断迭代是否结束:判断是否达到最大迭代次数 T ,达到则转(4),否则转(5).
(4) 输出亮度最大的萤火虫位置及其亮度.
(5) 更新萤火虫位置:根据式(3)更新萤火虫的位置,对处在最佳位置的萤火虫进行随机扰动,搜索次数增加1 ,转(2),进行下一次搜索.
% ===新兴元启发式优化算法==== % % ======================================================== % % -------------------------------------------------------- % function fa_ndim % parameters [n N_iteration alpha betamin gamma] para=[20 500 0.5 0.2 1]; % Simple bounds/limits disp('Solve the simple spring design problem ...'); % 定义问题维度 d=15; Lb=zeros(1,d); Ub=2*ones(1,d); u0=Lb+(Ub-Lb).*rand(1,d); [u,fval,NumEval]=ffa_mincon(@cost,u0,Lb,Ub,para); % Display results bestsolution=u bestojb=fval total_number_of_function_evaluations=NumEval %%% Put your own cost/objective function here --------%%% %% Cost or Objective function 代价函数或目标函数 function z=cost(x) %准确的结果应该是(1,1,1,1,1,...,1,1) z=sum((x-1).^2) % Start FA 开始执行萤火虫算法 function [nbest,fbest,NumEval]=ffa_mincon(fhandle,u0, Lb, Ub, para) % Check input parameters (otherwise set as default values) if nargin<5, para=[20 500 0.25 0.20 1]; end if nargin<4, Ub=[]; end if nargin<3, Lb=[]; end if nargin<2, disp('Usuage: FA_mincon(@cost,u0,Lb,Ub,para)'); end % n=number of fireflies % MaxGeneration=number of pseudo time steps % ------------------------------------------------ % alpha=0.25; % Randomness 0--1 (highly random) % betamn=0.20; % minimum value of beta % gamma=1; % Absorption coefficient % ------------------------------------------------ n=para(1); MaxGeneration=para(2); alpha=para(3); betamin=para(4); gamma=para(5);%beta0取1,alpha取[0,1],光吸收系数,取[0.01,100] % Total number of function evaluations 函数运算总次数 NumEval=n*MaxGeneration; % Check if the upper bound & lower bound are the same size 检查是否越过上下限 if length(Lb) ~=length(Ub),%~=为不等于 disp('Simple bounds/limits are improper!'); return end % Calcualte dimension 计算维度 d=length(u0); % Initial values of an array 初始化向量 zn=ones(n,1)*10^100; % ------------------------------------------------ % generating the initial locations of n fireflies 生成萤火虫位置 [ns,Lightn]=init_ffa(n,d,Lb,Ub,u0); % Iterations or pseudo time marching for k=1:MaxGeneration, %%%%% start iterations 开始迭代 % This line of reducing alpha is optional alpha=alpha_new(alpha,MaxGeneration); % Evaluate new solutions (for all n fireflies) 评估新解 for i=1:n, zn(i)=fhandle(ns(i,:)); Lightn(i)=zn(i); end % Ranking fireflies by their light intensity/objectives 根据亮度强弱排列萤火虫 [Lightn,Index]=sort(zn); ns_tmp=ns; for i=1:n, ns(i,:)=ns_tmp(Index(i),:); end %% Find the current best 找到当前最优 nso=ns; Lighto=Lightn; nbest=ns(1,:); Lightbest=Lightn(1); % For output only fbest=Lightbest; % Move all fireflies to the better locations 所有的萤火虫飞向亮度更高的萤火虫 [ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,nbest,Lightbest,alpha,betamin,gamma,Lb,Ub); end %%%%% end of iterations迭代结束 % ------------------------------------------------------- % ----- All the subfunctions are listed here ------------ 子函数 % The initial locations of n fireflies 萤火虫位置初始化 function [ns,Lightn]=init_ffa(n,d,Lb,Ub,u0) % if there are bounds/limits, if length(Lb)>0, for i=1:n, ns(i,:)=Lb+(Ub-Lb).*rand(1,d); end else % generate solutions around the random guess for i=1:n, ns(i,:)=u0+randn(1,d); end end % initial value before function evaluations 初始化亮度值 Lightn=ones(n,1)*10^100; % Move all fireflies toward brighter ones 所有的萤火虫飞向最亮的萤火虫 function [ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,nbest,Lightbest,alpha,betamin,gamma,Lb,Ub) % Scaling of the system测量系统 scale=abs(Ub-Lb);