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