标准萤火虫算法源码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档