萤火虫算法-matlab代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%% 算法说明:荧火虫算法
clc; %清屏
clear all; %清除变量
format long; %确定精度
%% 各参数初始化开始
domx=[-5.12,5.12;-5.12,5.12];
% domx=[-2.048,2.048;-2.048,2.048]; %解空间rho=0.4; %荧光素挥发因子gamma=0.6; %适应度提取比例beta=0.08; %邻域变化率
nt=5; %邻域阀值(邻域荧火虫数) s=0.03; %步长
lo=5; %荧光素浓度
rs=5.12; %感知半径
r0=5.12;
% rs=2.048; %感知半径
% r0=2.048; %决策半径
%各参数初始化结束
iter_max=200; %最大迭代次数
%% 分配空间开始
m=size(domx,1); %函数空间维数
global n;
n=50; %种群规模
address=zeros(n,m); %分配荧火虫地址空间
value=zeros(n,1); %分配适应度存放空间
li=zeros(n,1); %分配荧光素存放空间
rdi=zeros(n,1); %分配荧火虫决策半径存放空间
uu=zeros(1,iter_max);
%% 荧火虫常量初始化开始
for i=1:m
address(:,i)=(domx(i,1)+(domx(i,2)-domx(i,1))*rand(n,1)); %初始化地址% address(i,:)=5*rands(n,1); %随机产生初萤火虫所在位置
end
f=fun(address);
x=-5.12:.1:5.12;
% x=-2.048:.05:2.048;
[x,y] = meshgrid(x);
figure(1);
plot3(address(:,1),address(:,2),f,'k*')
hold on;
grid on;
z=-(x.^2-10*cos(2*pi.*x)+10+y.^2-10*cos(2*pi.*y)+10); %Rastrigin'函数
% z=-(x.^2+y.^2); %目标函数J2
% z=-(20+x.^2-10*cos(2*pi.*x)+y.^2-10*cos(2*pi.*y)); %目标函数J1
%
z=-(-20*exp(-0.2*sqrt((x.^2+y.^2)/2))-exp((cos(2*pi*x)+cos(2*pi*y))/2)+20+exp(1)) ; %%目标函数
% z=-(0.5+sin(sqrt(x.^2 + y.^2).^2-0.5)./(1+0.001*(x.^2 + y.^2)).^2);%目标函数J3 mesh(x,y,z)
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
title('萤火虫初始分布图');
li(:,1)=lo; %荧光素初始值
rdi(:,1)=r0; %决策半径初始值
t=1; %迭代累计量
%荧火虫常量初始化结束
%% 迭代开始
while(t<=iter_max)
li=(1-rho)*li+ gamma * fun(address); %.更新荧光素值li
%各荧火虫移动过程开始
for i=1:n
Ord_number=[]; %存放荧火虫序号
for j=1:n
if (norm(address(j,:)-address(i,:)) Ord_number(numel(Ord_number)+1)=j; end end %计算Ord_number各元素被选择概率,确定j位置 if ~isempty(Ord_number) %先判断Ord_number个数不为空Ord_num_li=li(Ord_number,1); %选出Ord_number荧光素 Sum_Ord_li=sum(Ord_num_li); %Ord_number荧光素和 Mol=Ord_num_li-li(i,1); %分子(lj-li) Den=Sum_Ord_li-li(i,1); %分母 Pij=Mol./Den; %计算各元素被选择概率 Pij=cumsum(Pij); %累计 Pij=Pij./Pij(end); %归一化 Pos=find(rand j=Ord_number(Pos(1)); %确定j 的位置 %荧火虫i向位置j移动 address(i,:)=address(i,:)+ s*(address(j,:)-address(i,:))/norm(address(j,:)-address(i,:)); address(i,:)=range1(address(i,:),domx);%限制范围 end %更新决策半径 rdi(i)=rdi(i)+beta*(nt-length(Ord_number)); rdi(i)=min(rs,max(0,rdi(i))); uu(t)=-max(fun(address)); end t=t+1; % iter_max迭代结束 g=[]; g=fun(address); x=-5.12:.1:5.12; % x=-2.048:.05:2.048; [x,y] = meshgrid(x); figure(2);