萤火虫之间通过闪光来进行信息的交互,同时也能起到危险预警的作用。我们知道从光源到特定距离r处的光强服从平方反比定律,也就是说光强I随着距离 r 的增加会逐渐降低,此外空气也会吸收部分光线,导致光线随着距离的增加而变得越来越弱。这两个因素同时起作用,因而大多数萤火虫只能在有限的距离内被其他萤火虫发现。
萤火虫算法就是通过模拟萤火虫的发光行为而提出的,所以实际上其原理很简单。为了方便算法的描述,作者给出了三个理想化的假设:
所有萤火虫雌雄同体,以保证不管萤火虫性别如何,都能被其他萤火虫所吸引(每只萤火虫代表一个解,在实际问题中这和性别是没关系的,因此不必建模);
吸引度与它们的亮度成正比,因此,对于任何两只闪烁的萤火虫,较暗的那只会朝着较亮的那只移动。吸引力与亮度程度会随着距离的增加而减小。最亮的萤火虫会随机选择方向进行移动(规定了解的更新方式,较暗移向较亮的可以认为是全局搜索,而最亮的进行随机移动属于局部搜索);
萤火虫的亮度可受目标函数影响或决定,对于最大化问题,亮度可以简单地与目标函数值成正比(建立了算法与领域问题的关系,规定了如何将目标值表示亮度)。
%==========================================================================% 算法说明:荧火虫算法(GSO:Glowworm swarm optimisation:a new method for optimising mutlti-modal functions)% =========================================================================clcclear;%清除变量close all;% ================================初始化开始================================domx=[-3,3;-3,3];%定义域%domx=[-2.048,2.048;-2.048,2.048];rho =0.4; %荧光素挥发因子gamma =0.6; %适应度提取比例beta =0.08;%邻域变化率nt =5; %邻域阀值(邻域荧火虫数)s =0.01;%步长iot0 =5; %荧光素浓度rs =3; %3;%感知半径r0 =1.5; %3;%决策半径% ================================初始化结束================================% ===============================分配空间开始===============================m =size(domx,1); %函数空间维数n =50; %萤火虫个数gaddress =zeros(n,m);%分配荧火虫地址空间ioti =zeros(n,1); %分配荧光素存放空间rdi =zeros(n,1); %分配荧火虫决策半径存放空间% ===============================分配空间结束===============================figure(1);sign_first = 1;step_track = 0;x = -3:0.1:3;y = -3:0.1:3;[xx,yy] = meshgrid(x,y);j1=3*(1-xx).^2.*exp(-(xx.^2+(yy+1).^2));j2=10*(xx./5-xx.^3-yy.^5).*exp(-(xx.^2+yy.^2));j3=(1/3)*exp(-((xx+1).^2+yy));zz=j1-j2-j3;figure(1);surf(xx,yy,zz);hold on% ===========================荧火虫常量初始化开始============================%1.初始化地址for i=1:mgaddress(:,i)=domx(i,1)+(domx(i,2)-domx(i,1))*rand(n,1);endgvalue = maxfun(gaddress);gbest_old = max(gvalue);%%可视化plot3(gaddress(:,1),gaddress(:,2),gvalue(:),'b*');drawnow;pause(1);%%2.初始化荧光素ioti(:,1)=iot0;%3.初始化决策半径rdi(:,1)=r0;iter_max=500;%最大迭代次数t=1;%迭代累计unchange = 0;% ===========================荧火虫常量初始化结束============================% =============================iter_max迭代开始=============================while(t<=iter_max) && (unchange<60)%1.更新荧光素ioti=max(0,(1-rho)*ioti+gamma*maxfun(gaddress));%2.各荧火虫移动过程开始for i=1:n%2.1 决策半径内找更优点Nit=[];%存放荧火虫序号for j=1:nif (norm(gaddress(j,:)-gaddress(i,:))<rdi(i))&&(ioti(i,1)<ioti(j,1))Nit(numel(Nit)+1)=j;endend%2.2 找下一步移动的点开始if length(Nit)>0 %先判断Nit个数不为0Nitioti=ioti(Nit,1);%选出Nit荧光素SumNitioti=sum(Nitioti);%Nit荧光素和Molecular=Nitioti-ioti(i,1);%分子Denominator=SumNitioti-ioti(i,1);%分母Pij=Molecular./Denominator;%计算Nit各元素被选择概率Pij=cumsum(Pij);%累计Pij=Pij./Pij(end);%归一化Pos=find(rand<Pij);%确定位置j=Nit(Pos(1));%确定j的位置%荧火虫i向j移动一小步gaddress(i,:)=gaddress(i,:)+s*(gaddress(j,:)-gaddress(i,:))/norm(gaddress(j,:)-gaddress(i,:));gaddress(i,:)=range(gaddress(i,:),domx);%限制范围%%更新决策半径rdi(i)=rdi(i)+beta*(nt-length(Nit));if rdi(i,1)<0rdi(i,1)=0;endif rdi(i,1)>rsrdi(i,1)=rs;endend%2.2 找下一步移动的点结束end%%可视化gvalue = maxfun(gaddress);gbest_new = max(gvalue);if gbest_new > gbest_oldunchange = 0;gbest_old = gbest_new;elseunchange = unchange + 1;end%plot(gaddress(:,1),gaddress(:,2),'b.','markersize',6);hold on;if mod(t,20)plot3(gaddress(:,1),gaddress(:,2),gvalue(:),'b*');drawnow;pause(0.01);end%2.各荧火虫移动过程结束%保存动态图giff=getframe(gcf);imind=frame2im(f);[imind,cm] = rgb2ind(imind,256);if(sign_first==1)sign_first=0;imwrite(imind,cm,'track.gif','gif', 'Loopcount',inf,'DelayTime',0.02);elseimwrite(imind,cm,'track.gif','gif','WriteMode','append','DelayTime',0.02);end%保存动态图gift=t+1;end% =============================iter_max迭代结束=============================% =============================输出最优结果开始=============================gvalue=maxfun(gaddress);%求各个荧火虫的值disp('最大值为:')num=find(gvalue==max(gvalue));%最大值序号MaxValue=-max(gvalue)disp('最优解为:')BestAddress=gaddress(num,:);% =============================输出最优结果结束=============================
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.
- 1.

611

被折叠的 条评论
为什么被折叠?



