一、简介
萤火虫算法(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);
三、运行结果
四、备注
版本:2014a
完整代码或代写加1564658423