matlab新手快速上手5(蚁群算法)

        本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程,对matlab新手友好,源码在文末给出。

蚁群算法简介:

        蚁群算法是一种启发式优化算法,灵感来源于观察蚂蚁寻找食物的行为。在这个算法中,解决方案被看作是蚂蚁在搜索空间中移动的路径,而问题的最优解则对应于找到食物的最佳路径。

        蚁群算法的基本思想是通过模拟蚂蚁在环境中释放信息素、沿着信息素浓度高的路径移动、并在路径上留下信息素的行为来搜索最优解。具体来说,蚁群算法包括以下几个重要的步骤:

  1. 初始化:在搜索空间中随机放置一定数量的“蚂蚁”,每只蚂蚁随机选择一个初始位置。
  2. 信息素更新:每只蚂蚁根据问题的特定要求,在搜索过程中释放信息素,并在路径上留下信息素。
  3. 路径选择:蚂蚁根据一定的概率选择下一步要移动的位置,通常受到信息素浓度和启发函数的影响。
  4. 解的更新:当所有蚂蚁完成一次搜索后,根据问题的特性更新最优解。
  5. 信息素更新:根据找到的最优解和路径,更新信息素的浓度,通常采用挥发和添加信息素的方式。

        通过不断地迭代搜索过程,蚁群算法能够逐步优化解决方案,找到问题的较优解。蚁群算法被广泛应用于解决组合优化、路径规划、任务调度等问题,在许多领域都取得了良好的效果。

定义参数与子函数:

% 普通 蚁群算法

function ACO
%----------- 定义全局变量  ----------%
global dimension_number   %子函数用
global NP                 %子函数用
%----------- 共性参数  ----------%
NP = 50;                 %种群规模
movep = 0.80;            %转移概率 ,区分两种选择方式
inforw = 0.8;            %信息素加权
watchw = 0.2;            %可见度加权
updatex = 0.8;           %更新系数
step = 10;               %迭代步长
alpha = 1.0e-003;        %控制参数
Max_N = 1500;             %限定代数
flagc = [0,Max_N];       %收敛标志
%----------- 数组部分  ----------%
D=30;MinX=-100;MaxX=100;Error=1.0e-10;
dimension_number=D;

%----------- 蚂蚁初始化  ----------%
X = MinX + (MaxX-MinX)*rand(NP,D);
F = fun1(X);
[bestF,bestlow] = min(F);
bestX = X(bestlow,:);
%----------- 信息素初始化  ----------%
information = 1./exp(alpha*F);
visibility = 1./exp(alpha*F);
%----------- 子函数1:越界修剪  ----------%
function X=simplebounds(X,MinX,MaxX)
global dimension_number    %定义全局变量
global NP                  %定义全局变量
Lb = MinX*ones(NP,dimension_number);
Ub = MaxX*ones(NP,dimension_number);
ns_tmp = X;
I=ns_tmp<Lb;
ns_tmp(I)=Lb(I);
J = ns_tmp>Ub;
ns_tmp(J) = Ub(J);
X = ns_tmp;
%----------- 子函数2:目标函数  ----------%
function f1=fun1(X)
for i=1:1:length(X(:,1))
	f1(i) =  sum(X(i,:).^2);
end

参数:

        首先是蚂蚁初始化,X很明显,表示NP行,D列,元素为(Minx, MaxX)之间的随机值的矩阵。其中,NP代表了多少个个体,D代表了每个个体的元素。

        F表示适应度,具体实现在子函数2中,也就是对一行中所有列元素进行平方求和。

        bestF是F中最小的值,bestlow是这个值的索引,bestX按照bestlow进行索引被赋值为X中的最优个体。

信息素初始化:

information = 1./exp(alpha*F);也就是对F中的每个元素乘以alpha再作为e的指数再取倒数,

对应公式为:information(i) = 1/e^{alpha\cdot F(i)}

对应也就是当F越小,适应度越大,信息素越强。

子函数1:

        子函数1为越界修剪函数,主要为了防止X超过上下限,超过上限将对应元素赋值为MaxX,超过下线将对应元素赋值为MinX

I=ns_tmp<Lb;

        这句代码是什么意思呢,这表示I为一个逻辑矩阵,,ns_tmp矩阵维度必须与Lb矩阵维度相等,I的维度与他俩都相等,I的元素为逻辑值0或1,也就是对应ns_tmp与Lb的元素的逻辑比较值。

子函数2:

        由fun1(X)函数可知,子函数,也就是目标函数为:f(x_1, x_2, \ldots, x_n) = \sum_{i=1}^{n}x_{i}^2,整个算法的目的就是优化f(x_1, x_2, \ldots, x_n)的值使它最小,显然最小值是x全为0时,f(x_1, x_2, \ldots, x_n)最小为0。

开始主程序:

%----------- 程序主循环开始  ----------%
for gen=1:1:Max_N
	time(gen) = gen;
	inforvisible = (information.^inforw).*(visibility.^watchw);
    cum = cumsum(inforvisible);
    
	%----------- 产生一个随机数 用来确定选择类型  ----------%
	rnd = rand;
	%----------- if rnd <= movep 执行最大值选择  ----------%
	if rnd <= movep
		[tmp,flag] = max(inforvisible);
    else
		rnd = rand;
		for i=1:1:NP
            if cum(i) > rnd*cum(NP)
			%if sum(inforvisible(1:i))>rnd*sum(inforvisible) 
                flag=i;
                break;
            end
		end
	end

	%----------- 蚂蚁移动过程 ----------%
	for i=1:1:NP
		X(i,:)=X(i,:)+sign(X(flag,:)-X(i,:))*step*(1-gen/Max_N)^5;
	end
	%----------- 计算函数值  ----------%
	X = simplebounds(X,MinX,MaxX);
	F = fun1(X);
	%----------- 信息素更新  ----------%
	information = (1-updatex)*information+updatex*1./exp(alpha*F);
	visibility = (1-updatex)*visibility+updatex*1./exp(alpha*F);
	%----------- 适应度统计  ----------%
	[bestF1,bestlow]=min(F);
	if bestF>bestF1
		bestX = X(bestlow,:);
		bestF = bestF1;
	else
		X(bestlow,:)=bestX;
		F(bestlow)=bestF;
	end
	%----------- 记录结果  ----------%
	result(gen) = bestF;
	if (bestF<Error) & (flagc(1)==0)
		flagc(1) = 1;
		flagc(2) = gen;
	end
	if mod(gen,10)==0
		disp(['代数:',num2str(gen),'----最优:',num2str(bestF)]);
	end

end
plot(time,result)
disp(bestX);

信息素处理与选择

        inforvisible表示对信息素继续进行加权处理,cum = cumsum(inforvisible);表示制作轮盘,不懂的可以看主页中遗传算法中的轮盘赌选择,介绍的很详细。

        if函数表示选择最大值的概率为0.8,选择轮盘赌方式为0.2

蚂蚁移动

X(i,:)=X(i,:)+sign(X(flag,:)-X(i,:))*step*(1-gen/Max_N)^5;

        这个函数实现了蚂蚁向浓度最高的信息素大致方向前进,并且迭代次数越大,前进幅度越小。具体如下:

sign(X(flag,:)-X(i,:))

        sign表示返回符号,也就是+1或者-1,因此:X(flag,:)-X(i,:)表示蚂蚁与选择的信息素的差值向量,那么sign()就表示蚂蚁与选择的信息素的差值向量的大致方向。

step*(1-gen/Max_N)^5

        表示向这个向量前进多少幅度,后面的(1-gen/Max_N)^5表示当迭代次数小的时候,前进的步数大,迭代范围大也就是搜索趋近于最优解时,前进步数小,这样实现了在迭代的早期,蚂蚁移动的幅度较大,有助于探索搜索空间,而在迭代的后期,蚂蚁移动的幅度逐渐减小,有助于精细调节蚂蚁的位置以找到最优解。

信息素更新:

        information = (1-updatex)*information+updatex*1./exp(alpha*F);这段代码模拟信息素更新时,上一次信息素消退的过程。从而更新当前信息素。 

        这里也可以将叠加当前信息素的updatex改为1,将当前信息素浓度不经过加权直接加上。

后续就是记录结果与绘制图像的过程。代码很简单,自行理解即可。

源代码:



% 普通 蚁群算法

function ACO
%----------- 定义全局变量  ----------%
global dimension_number   %子函数用
global NP                 %子函数用
%----------- 共性参数  ----------%
NP = 50;                 %种群规模
movep = 0.80;            %转移概率 ,区分两种选择方式
inforw = 0.8;            %信息素加权
watchw = 0.2;            %可见度加权
updatex = 0.8;           %更新系数
step = 10;               %迭代步长
alpha = 1.0e-3;        %控制参数
Max_N = 15000;             %限定代数
flagc = [0,Max_N];       %收敛标志
%----------- 数组部分  ----------%
D=30;MinX=-100;MaxX=100;Error=1.0e-10;
dimension_number=D;

%----------- 蚂蚁初始化  ----------%
X = MinX + (MaxX-MinX)*rand(NP,D);
F = fun1(X);
[bestF,bestlow] = min(F);
bestX = X(bestlow,:);
%----------- 信息素初始化  ----------%
information = 1./exp(alpha*F);
visibility = 1./exp(alpha*F);
%----------- 程序主循环开始  ----------%
for gen=1:1:Max_N
	time(gen) = gen;
	inforvisible = (information.^inforw).*(visibility.^watchw);
    cum = cumsum(inforvisible);
    
	%----------- 产生一个随机数 用来确定选择类型  ----------%
	rnd = rand;
	%----------- if rnd <= movep 执行最大值选择  ----------%
	if rnd <= movep
		[tmp,flag] = max(inforvisible);
    else
		rnd = rand;
		for i=1:1:NP
            if cum(i) > rnd*cum(NP)
			%if sum(inforvisible(1:i))>rnd*sum(inforvisible) 
                flag=i;
                break;
            end
		end
	end

	%----------- 蚂蚁移动过程 ----------%
	for i=1:1:NP
		X(i,:)=X(i,:)+sign(X(flag,:)-X(i,:))*step*(1-gen/Max_N)^5;
	end
	%----------- 计算函数值  ----------%
	X = simplebounds(X,MinX,MaxX);
	F = fun1(X);
	%----------- 信息素更新  ----------%
	information = (1-updatex)*information+updatex*1./exp(alpha*F);
	visibility = (1-updatex)*visibility+updatex*1./exp(alpha*F);
	%----------- 适应度统计  ----------%
	[bestF1,bestlow]=min(F);
	if bestF>bestF1
		bestX = X(bestlow,:);
		bestF = bestF1;
	else
		X(bestlow,:)=bestX;
		F(bestlow)=bestF;
	end
	%----------- 记录结果  ----------%
	result(gen) = bestF;
	if (bestF<Error) & (flagc(1)==0)
		flagc(1) = 1;
		flagc(2) = gen;
	end
	if mod(gen,10)==0
		disp(['代数:',num2str(gen),'----最优:',num2str(bestF)]);
	end

end
plot(time,result)
disp(bestX);
%----------- 子函数1:越界修剪  ----------%
function X=simplebounds(X,MinX,MaxX)
global dimension_number    %定义全局变量
global NP                  %定义全局变量
Lb = MinX*ones(NP,dimension_number);
Ub = MaxX*ones(NP,dimension_number);
ns_tmp = X;
I=ns_tmp<Lb;
ns_tmp(I)=Lb(I);
J = ns_tmp>Ub;
ns_tmp(J) = Ub(J);
X = ns_tmp;
%----------- 子函数2:目标函数  ----------%
function f1=fun1(X)
for i=1:1:length(X(:,1))
	f1(i) =  sum(X(i,:).^2);
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/572853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3中的ref、isRef、shallowRef、triggerRef和customRef

1.ref 接受一个参数值并返回一个响应式且可改变的 ref 对象。 ref 对象拥有一个指向内部值的单一属性 .value property &#xff0c;指向内部值。 例&#xff1a;此时&#xff0c;页面上的 str1 也跟着变化 <template><div><button click"handleClick&quo…

BUUCTF-MISC-10.LSB1

10.LSB1 题目&#xff1a;lsb隐写&#xff0c;stegsolve可以看到包含了一个PNG图片 使用stegsolve打开这个图片 由PNG文件头可以看出隐写内容为PNG文件&#xff0c;按save Bin键保存为PNG文件。 得到一张二维码图片&#xff0c;使用CQR扫一下

盲返模式:电商领域的新玩法与商业创新

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是什么是盲返模式&#xff1f; 随着互联网的深入发展&#xff0c;电商行业正面临着前所未有的机遇与挑战。在这个竞争激烈的市场环境中&#xff…

GAN 生成对抗神经网络

GAN 文章目录 GANGAN的结构GAN的目标函数GAN的训练GAN的优势和不足优势不足 GAN的结构 GAN的设计灵感来源于博弈论中的零和博弈&#xff08;Zero-sum Game&#xff09;&#xff0c;在零和博弈中&#xff0c;参与双方的收益是完全相反的&#xff0c;一方的收益必然导致另一 方的…

Python400集 视频教程,手把手带你零基础手写神经网络!!

嗨喽&#xff0c;大家好&#xff0c;今天又要给大家整一波福利了&#xff01; 学习编程&#xff0c;最忌讳就是今天一个教程&#xff0c;明天一个教程&#xff0c;频繁更换教程&#xff0c;增加自己的学习成本&#xff0c;对于新手小白会是一件严重打击自信心的事情。所以今天…

jetson开发板+外接散热风扇

本文参考链接 https://news.mydrivers.com/1/580/580811.htm?refhttps%3A//www.baidu.com/link%3Furl%3DM_D45a-od3NK-ER_Flgqqw4LjHLinB1xrmYNj7VVqHlM2zVXwR9Z7FGilCYDRRJYNpIsdejeAfpVtmVTowuFfK%26wd%3D%26eqid%3D81e7865e000256a5000000046628ff4a 一、三种风扇的种类 二…

全自动装箱机多少钱?它的性能和优势又是怎样的呢?

在现代化的生产线中&#xff0c;全自动装箱机已经成为许多企业提升效率、降低成本的重要设备。那么&#xff0c;全自动装箱机到底多少钱?它的性能和优势又是怎样的呢? 一、全自动装箱机&#xff1a;高效省力的生产助手 全自动装箱机是一种高度自动化的包装设备&#xff0c;能…

掌握未来通信技术:5G核心网基础入门

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;5GC笔记仓 朋友们大家好&#xff0c;本篇文章是我们新内容的开始&#xff0c;我们本篇进入5GC的学习&#xff0c;希望大家多多支持&#xff01; 目录 一.核心网的演进2G核心网2.5G核心网3G核心网4G…

CFCASSL证书的网络安全解决方案

在数字化时代&#xff0c;网络信息安全的重要性不言而喻。随着电子商务、在线交易、远程办公等互联网活动的日益普及&#xff0c;确保数据传输的安全性与隐私保护成为企业和用户共同关注的焦点。在此背景下&#xff0c;CFCA SSL证书作为一种权威、高效的网络安全解决方案&#…

ShardingSphere 5.x 系列【24】集成 Nacos 配置中心

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. ShardingSphereDriverURLProvider3. 方式一:基于 Nacos Java SDK…

《2024年网络弹性风险指数报告》:92%的组织并未准备好应对AI安全挑战

网络弹性是一个比传统网络安全更大、更重要的范例&#xff0c;拥有有效网络弹性能力的组织能在承受网络攻击、技术故障或故意篡改企图后迅速恢复正常业务运营。近日&#xff0c;Absolute security公司发布的《2024年网络弹性风险指数报告》旨在评估当今全球企业的网络弹性状况&…

【Elasticsearch<一>✈️✈️】简单安装使用以及各种踩坑

目录 &#x1f378;前言 &#x1f37b;一、软件安装&#xff08;Windows版&#xff09; 1.1、Elasticsearch 下载 2.1 安装浏览器插件 3.1、安装可视化工具 Kibana 4.1、集成 IK 分词器 &#x1f37a;二、安装问题 &#x1f379;三、测试 IK 分词器 ​&#x1f377; 四、章…

用斐波那契数列感受算法的神奇(21亿耗时0.02毫秒)

目录 一、回顾斐波那契数列 二、简单递归方法 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &#xff08;三&#xff09;性能分析 三、采用递归HashMap缓存 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &…

PPSSPPSDL for Mac v1.17.1 PSP游戏模拟器(附500款游戏) 激活版

PPSSPPSDL for Mac是一款模拟器软件&#xff0c;它允许用户在Mac上运行PSP&#xff08;PlayStation Portable&#xff09;游戏。通过这款模拟器&#xff0c;用户可以体验到高清甚至更高的分辨率的游戏画面&#xff0c;同时还能够升级纹理以提升清晰度&#xff0c;并启用后处理着…

新恒盛110kV变电站智能辅助系统综合监控平台+道巡检机器人

江苏晋控装备新恒盛化工有限公司是晋能控股装备制造集团有限公司绝对控股的化工企业&#xff0c;公司位于江苏省新沂市。新恒盛公司40•60搬迁项目在江苏省新沂市经济开发区化工产业集聚区苏化片区建设&#xff0c;总投资为56.64亿元&#xff0c;该项目是晋能控股装备制造集团重…

PEG SPARCL™试剂盒

Life Diagnostics开发了SPARCL™ 试剂盒用于检测甲氧基-PEG&#xff08;mPEG&#xff09;和非甲氧基PEG。可检测游离的PEG和PEG化的蛋白质。灵敏度随PEG链长度和PEG化程度的不同而变化。 SPARCL™检测具有以下特点&#xff1a; ● 发光免疫测定法 ● 只需一次30分钟的孵育 …

快递物流订阅推送API接口如何对接

快递物流订阅推送API接口指的是订阅国内物流快递信息&#xff0c;当运单状态发生变化时&#xff0c;会推送到您的回调地址&#xff0c;直到这些运单号生命周期结束。简单点说就是先订阅快递单号再推送物流信息。那么快递物流订阅推送API接口该如何对接呢&#xff1f; 首先我们…

如何通过香港站群服务器提升跨境电商交易效率?

如何通过香港站群服务器提升跨境电商交易效率? 在全球电子商务迅速发展的今天&#xff0c;跨境电商已成为企业拓展国际市场、获取更多商机的重要途径。然而&#xff0c;跨境电商面临的挑战也不容小觑&#xff0c;尤其是在交易效率方面。利用香港站群服务器&#xff0c;不仅可…

ABAP Visual Code 新建sap系统连接

本文主要介绍如何新建SAP前端系统链接 前提是你已经都扩展完了 1.点击SAP fiori--》点击新建 2.选择 abap on premise 3.输入如下信息 4.这里介绍下URL 如何获取 SMICM-->点击service 明细里面可以看到你的host name 和 port 当然你也可以随便找一个你的odata 服务看下ur…

easypoi 导出增加自增序列

要求&#xff1a;使用easypoi导出Excel的时候&#xff0c;要求增加”序号“列&#xff0c;从1开始增加。这列与业务数据无关&#xff0c;只是展示用&#xff0c;便于定位。如下图所示 实现方式&#xff1a;Java对象新增一列&#xff0c;注意name "序号", format &…
最新文章