(GSO:Glowworm swarm optimisation:a new method for optimising mutlti-
荧火虫算法 MATLAB 代码
modal functions)
% 算法特征:只适用于求极大值(极小值可转化为求极大值)
===============================================================
clc;
%清屏
clear all;
%清除变量
format long; %确定精度
=============初始化开始========================
domx=[-2.048,2.048;-2.048,2.048];
%domx=[-3,3;-3,3];定义域,解空间
rho=0.4;
%荧光素挥发因子
gamma=0.6;
%适应度提取比例
beta=0.08;
%邻域变化率
nt=5;
s=0.03;
iot0=5;
rs=2.048;
r0=2.048;
%邻域阀值(邻域荧火虫数)
%步长
%荧光素浓度
%感知半径
%决策半径
(各参数初始化结束)
==============================初始化结束=========
=======================分配空间开始===============================
m=size(domx,1);
%函数空间维数
global n;
n=50;
%群规模
gaddress=zeros(n,m);
%分配荧火虫地址空间
gvalue=zeros(n,1);
%分配适应度存放空间
ioti=zeros(n,1);
%分配荧光素存放空间
rdi=zeros(n,1);
%分配荧火虫决策半径存放空间
=========================分配空间结束==============================
======================荧火虫常量初始化开始============================
%1.初始化地址,随机产生初萤火虫位置
for i=1:m
gaddress(:,i)=domx(i,1)+(domx(i,2)-domx(i,1))*rand(n,1);
end
%2.初始化荧光素
ioti(:,1)=iot0;
%3.初始化决策半径
rdi(:,1)=r0;
iter_max=500;
%最大迭代次数
t=1;
%迭代累计
========================荧火虫常量初始化结束===========================
========================iter_max 迭代开始=============================
while(t<=iter_max)
%1.更新荧光素
ioti=(1-rho)*ioti+gamma*maxfun(gaddress);
%2.各荧火虫移动过程开始
for i=1:n
%2.1 决策半径内找更优点
Nit=[];
for j=1:n
%存放荧火虫序号
if
(norm(gaddress(j,:)-
gaddress(i,:))0
%先判断Nit个数不为0
Nitioti=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
rs
rdi(i,1)=rs;
end
end
%2.2 找下一步移动的点结束
end
%2.各荧火虫移动过程结束
t=t+1;
end
==========================iter_max 迭代结束=============================
===========================输出最优结果开始===========================
gvalue=maxfun(gaddress);
%求各个荧火虫的值
disp('最大值为:')
num=find(gvalue==max(gvalue)); %最大值序号
MaxValue=-max(gvalue)
disp('最优解为:')
BestAddress=gaddress(num,:)
==========================输出最优结果结束============================
function y=maxfun(x) %P104 函数 J1
% j1=3*(1-x(:,1)).^2.*exp(-(x(:,1).^2+(x(:,2)+1).^2));
% j2=10*(x(:,1)./5-x(:,1).^3-x(:,2).^5).*exp(-(x(:,1).^2+x(:,2).^2));
% j3=(1/3)*exp(-((x(:,1)+1).^2+x(:,2)));
% y=j1-j2-j3;
%=================
dom=[-2.048,2.048;-2.048,2.048];%定义域范围
z=100.*(x(:,1).^2-x(:,2)).^2+(1-x(:,1)).^2;%目标函数
y=-z;
function X=range(X,dom)%输入向量 X,定义域 dom
n=size(X,2);%求列数即 dom 的行数 n=size(dom,1)
for i=1:n
t=X(:,i);
t(tdom(i,2))=dom(i,2);%限定右边范围
X(:,i)=t;
End