初
始
================================
%% 算法说明:荧火虫算法(GSO:Glowworm swarm optimisation:a new method for optimising
mutlti-modal functions)
%% 算法特征:只适用于求极大值(极小值可转化为求极大值)
%% ===============================================================
clc;%清屏
clear all;%清除变量
format long;%确定精度
%
================================
%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.03;%步长
iot0=5;%荧光素浓度
rs=2.048;%3;%感知半径
r0=2.048;%3;%决策半径
%
================================
================================
初
化
开
束
始
始
化
结
===============================
%
===============================
m=size(domx,1);%函数空间维数
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(randrs
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