标准萤火虫算法源码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function fa_ndim
para=[20 500 0.5 0.2 1];
help fa_dim.m
% 定义问题维度
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_eveluation=NumEval;
%目标函数
function z=cost(x)
%准确的结果应该是(1,1,1...1)
z=sum((x-1).^2);
%开始执行萤火虫算法
function[nbest,fbest,NumEval]=ffa_mincon(fhandle,u0,Lb,Ub,para) 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=para(1);
MaxGeneration=para(2);
alpha=para(3);
betamin=para(4);
gamma=para(5);
%函数运算次数
NumEval=n*MaxGeneration;
%检查是否越过上限
if length(Lb)~=length(Ub);
disp('Simple bounds/limits are improper! ');
return
end
%计算维度
d=length(u0);
%初始化向量
zn=ones(n,1)*10^100;
%生成萤火虫位置
[ns,Lightn]=init_ffa(n,d,Lb,Ub,u0);
for k=1:MaxGeneration, %开始迭代
alpha=alpha_new(alpha,MaxGeneration);
%评估新解
for i=1:n,
zn(i)=fhandle(ns(i,:));
Lightn(i)=zn(i);
end
%根据亮度强弱排列萤火虫
[Lightn,Index]=sort(zn);
ns_tmp=ns;
for i=1:n,
ns(i,:)=ns_tmp(Index(i),:);
end
%找到当前最优
nso=ns;
Lighto=Lightn;
nbest=ns(1,:);
Lightbest=Lightn(1);
fbest=Lightbest;
%所有的萤火虫飞向最亮的萤火虫
[ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,nbest,Lightbest,alpha,betamin,ga mma,Lb,Ub);
end%迭代结束
%*******子函数***************
%萤火虫位置初始化
function[ns,Lightn]=init_ffa(n,d,Lb,Ub,u0)
if length(Lb)>0,
for i=1:n,
ns(i,:)=Lb+(Ub-Lb).*rand(1,d);
end
else
for i=1:n,
ns(i,:)=u0+randn(1,d);
end
end
%初始化亮度
Lightn=ones(n,1)*10^100;
%所有的萤火虫飞向最亮的萤火虫
function[ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,nbest,Lightbest,alpha,be tamin,gamma,Lb,Ub)
scale=abs(Ub-Lb);
for i=1:n,
for j=1:n,
r=sqrt(sum((ns(i,:)-ns(j,:)).^2));
if Lightn(i)>Lighto(j), %Brighter and more attractive
beta0=1;
beta=(beta0-betamin)*exp(- gamma*r.^2)+betamin;
tmpf=alpha.*(rand(1,d)-0.5).*scale;
ns(i,:)=ns(i,:).*(1-beta)+nso(j,:).*beta+tmpf;
end
end
end
%检查更新的解是否在限制范围内
[ns]=findlimits(n,ns,Lb,Ub);
% This function is optional,as it is not in the original FA
% The idea to reduce randomness is to increase the convergence,
% however,if you reduce randomness too quickly,then premature
% convergence can occr.So use with care.
function alpha=alpha_new(alpha,NGen)