%% 算法说明:荧火虫算法(GSO:Glowworm swarm optimisation:a new method for optimising mutlti-modal functions)
%% 算法特征:只适用于求极大值(极小值可转化为求极大值)
%% ===============================================================
clc;%清屏
clear all;%清除变量
format long;%确定精度
% ================================初始化开始================================
%domx=[-3,3;-3,3];%定义域
domx=[-5.12,5.12;-5.12,5.12];
rho=0.4;%荧光素挥发因子,也就是荧光素值挥发系数
gamma=0.6;%适应度提取比例,也就是荧光素值增强系数
%个体i在第i+1次迭代时荧光素值大小 li(t+1) =(1-rho)* li(t) + gamma * 个体i在第t+1次迭代时的适应度函数值大小
beta=0.08;%邻域变化率,也就是感知半径变化系数
nt=5;%邻域阀值(邻域荧火虫数),表示感知范围内限定的优秀个体数,当感知范围内的较优个体数大于nt时,个体的领域半径减小,反之增大。
s=0.3;%步长,即每次移动的距离
iot0=5;%荧光素浓度
rs=2.048;%3;%感知半径 个体最大感知半径 萤火虫个体在自己的感知范围内寻找比自己荧光素值大的多有个体组成领域集合
r0=2.048;%3;%决策半径
% ================================初始化结束================================
% ===============================分配空间开始===============================
m=size(domx,1);%函数空间维数,即domx矩阵的行数
n=100;%群规模
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; %ioti矩阵第一列所有的行值分别赋值iot0
%3.初始化决策半径
rdi(:,1)=r0;
iter_max=200;%最大迭代次数
t=1;%迭代累计
% ===========================荧火虫常量初始化结束============================
% =============================iter_max迭代开始=============================
figure(1);
while(t<=iter_max)
%1.更新荧光素
ioti=(1-rho)*ioti+gamma*f1(gaddress);
%2.各荧火虫移动过程开始
for i=1:n
%2.1 决策半径内找更优点
Nit=[];%存放荧火虫序号
for j=1:n
if (norm(gaddress(j,:)-gaddress(i,:))<rdi(i))&&(ioti(i,1)<ioti(j,1))%norm求范数,也就是每个元素平方和之后再开方。设X = rand(10,1); 则norm(X) == sqrt(sum(X.^2));
Nit(numel(Nit)+1)=j; %numel用于计算数组中元素个数
end
end
%2.2 找下一步移动的点开始
if length(Nit)>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<Pij);%确定位置
j=Nit(Pos(1));%确定j的位置
%荧火虫i向j移动一小步
gaddress(i,:)=gaddress(i,:)+s*(gaddress(j,:)-gaddress(i,:))/norm(gaddress(j,:)-gaddress(i,:));
gaddress(i,:)=f2(gaddress(i,:),domx);%限制范围
%更新决策半径
rdi(i)=rdi(i)+beta*(nt-length(Nit));
if rdi(i,1)<0
rdi(i,1)=0;
end
if rdi(i,1)>rs
rdi(i,1)=rs;
end
end
pause(0.01);
% plot(gaddress,ioti,'r*');
plot(gaddress(:,1),gaddress(:,2),'*');%与上面的差别在于,萤火虫的定位只需要萤火虫的位置,而gaddress第一列表示的是萤火虫的水平坐标,第二列表示的萤火虫的垂直坐标,
%2.2 找下一步移动的点结束
end
%2.各荧火虫移动过程结束
t=t+1;
end
% =============================iter_max迭代结束=============================
% =============================输出最优结果开始=============================
gvalue=f1(gaddress);%求各个荧火虫的值
disp('最大值为:')
num=find(gvalue==max(gvalue));%最大值序号
MaxValue=max(gvalue)
disp('最优解为:')
BestAddress=gaddress(num,:)
% =============================输出最优结果结束=============================

寒泊
- 粉丝: 106
最新资源
- 基于Matpower的储能选址定容多目标优化及熵权TOPSIS决策方法 - NSGA2
- 本文将介绍如何使用yolov5和deepsort进行目标检测和跟踪,并增加轨迹线的显示 本文的改进包括轨迹线颜色与目标框匹配、优化轨迹线只显示一段,并且当目标消失时不显示轨迹线
- 基于分解的多目标进化算法在双目标模糊柔性作业车间调度中的实践与应用
- 基于模糊控制的复合电源超级电容能量管理策略在电动汽车中的应用
- java Smart系统-题库及试卷管理模块的设计与开发(源代码+论文)
- 安全帽佩戴检测功能测试演示系统
- 本文将介绍如何使用yolov5和deepsort进行目标检测和跟踪,并增加轨迹线的显示 本文的改进包括轨迹线颜色与目标框匹配、优化轨迹线只显示一段,并且当目标消失时不显示轨迹线
- MATLAB仿真:TDOA与FDOA定位技术中TSWLS与ICWLS方法的性能对比及应用
- 一些目标检测任务需要用到的数据转换以及常见数据处理函数
- 基于SSA优化LSSVM的回归预测模型,提高预测精度超越传统LSSVM技术 - 时间序列预测 宝典
- WINCC报表功能及画面轮播解析:基于7.0至7.5版本的Web发布与CS架构访问权限控制
- LabVIEW与以太网S7协议:实现西门子PLC系列上位机程序读写的工业自动化解决方案
- 基于模糊模拟的混合NSGA-II算法优化农村电商物流配送路径规划 多目标优化
- 利用AI+deepseek求解一阶变系数线性微分方程组
- 基于C#和Halcon的PCB基板瑕疵检测系统:多维度缺陷识别与流程化管控
- 永磁同步电机无感FOC控制中负载转矩前馈补偿算法与仿真模型研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论0