萤火虫算法MATLAB代码

 

% X S Yang的萤火虫算法,用法 ffa (萤火虫数量 迭代次数),例如 12只萤火虫 迭代100次

function [best]=firefly_simple(instr)  %最后返回结果是best 输入的数据需要有instr

% n为萤火虫数量 MaxGeneration为迭代次数

if nargin<1, instr=[12 100];  %nargin用于判断输入变量个数,如果没有输入变量则执行语句输入

end

n=instr(1);   %例如12只萤火虫

MaxGeneration=instr(2);  %迭代100次

rand('state',0);  % 'state'用于保持相同的计算结果,后续每次的结果都跟第一次一样

str1='exp(-(x-4)^2-(y-4)^2)+exp(-(x+4)^2-(y-4)^2)';

str2='+2*exp(-x^2-(y+4)^2)+2*exp(-x^2-y^2)';  %方程太长 先拆分为两个字符串

funstr=stract(str1,str2);  stract连接两个字符串

f=vectorize(inline(funstr));  %vectorize将*转化为.乘 inline构造内联函数

%指定变量X的定义域

range=[-5 5 -5 5];   %abs x≤5

alpha=0.2;  %α步长因子取0.2(高度随机)

gamma=1.0;  % γ光吸收强度系数取1.0

%网格值仅用于显示

Ngrid=100; %设置网格有100格

dx=(range(2)-range(1))/Ngrid;  % x的定义域除以网格数,确定x的步长

dy=(range(4)-range(3))/Ngrid;  %同理取y的步长

[x,y]=meshgrid(range(1):dx:range(2),...

range(3):dy:range(4));  %网格化 x y是大小相等的矩阵

% ps : matlab中…表示下行语句与上面是连在一起的(可自己去掉)但是一行太长了所以分两行

z=f(x,y);  %将 x y 带入f(x)方程

%显示目标函数的形状

figure(1); %打开窗口figure(1)

surfc(x,y,z);  %作表面网格图

%生成 n 萤火虫的初始位置

[xn,yn,Lightn]=init_ffa(n,range);  %随机分布!初始化萤火虫的位置,调用函数

%在图中显示萤火虫的路径。

%要优化的函数的轮廓

figure(2);

%迭代或达到精度

for i=1:MaxGeneration, %开始迭代 最大迭代(循环)100次

%显示函数的轮廓

contour(x,y,z,15);   %根据xy绘制z,绘制等高线15条

hold on; %不消失

%评估新解决方案

zn=f(xn,yn);

%按萤火虫的光强度对萤火虫进行排名

[Lightn,Index]=sort(zn); %升序排列

xn=xn(Index);

yn=yn(Index); 

xo=xn;

yo=yn;

Lighto=Lightn;

%跟踪所有漫游萤火虫的路径

plot(xn,yn,'.','markersize',10,'markerfacecolor','g');

.画图实心点 标识符大小10 标识符内部填充颜色 绿色

%将所有萤火虫转移到更好的位置,调用函数(下三句)

[xn,yn]=ffa_move(xn,yn,Lightn,xo,yo,...

Lighto,alpha,gamma,range);

drawnow;

%使用"hold on"显示萤火虫的路径

hold off;

end %迭代结束

best(:,1)=xo';  %令第一列 = xo的转置!(行向量变成列向量)

best(:,2)=yo';  %第二列同上

best(:,3)=Lighto';  %第三列同上主程序结束

%此处列出了所有子功能 (子函数)

%函数:萤火虫的初始位置

function [xn,yn,Lightn]=init_ffa(n,range)

xrange=range(2)-range(1);

yrange=range(4)-range(3);

xn=rand(1,n)*xrange+range(1);  %随机分布

yn=rand(1,n)*yrange+range(3);

Lightn=zeros(size(yn));  %构建一个大小为yn的全零阶矩阵

%移动所有萤火虫走向更亮的萤火虫

function [xn,yn]=ffa_move(xn,yn,Lightn,xo,yo,...

Lighto,alpha,gamma,range)

ni=size(yn,2);  % size获取矩阵的行和列,若后面有1或者2则1表示返回行数2表示列数

nj=size(yo,2);   %获取列数

for i=1:ni,

%吸引力参数 β=β×e(-γ*r)

for j=1:nj,

r=sqrt((xn(i)-xo(j))^2+(yn(i)-yo(j))^2);  %计算i j之间的距离

if Lightn(i)<Lighto(j),  %移动到更明亮,更有吸引力的位置

beta0=1;  %最大吸引度β0 = 1

beta=beta0*exp(-gamma*r.^2);  %β=β×e(-γ*r)计算吸引度

xn(i)=xn(i).*(1-beta)+xo(j).*beta+alpha.*(rand-0.5); %更新i位置

yn(i)=yn(i).*(1-beta)+yo(j).*beta+alpha.*(rand-0.5); %更新j位置

end

end   % end for j

end   % end for i

[xn,yn]=findrange(xn,yn,range); %调用函数

%确保萤火虫在范围内

function [xn,yn]=findrange(xn,yn,range)

for i=1:length(yn),

if xn(i)<=range(1), xn(i)=range(1); end

if xn(i)>=range(2), xn(i)=range(2); end

if yn(i)<=range(3), yn(i)=range(3); end

if yn(i)>=range(4), yn(i)=range(4); end

end
版权声明:
作者:瑞羽云
链接:https://www.ruiyuyun.cn/archives/57.html
来源:瑞羽云
本站部分内容源于互联网,如果侵犯了您的权利,请发邮件告之,邮箱zcrvip@vip.qq.com
如果可以,希望您在分享的时候直接分享本网址,整理不易,谢谢配合!
THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录