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_Ntime(gen) = gen;inforvisible = (information.^inforw).*(visibility.^watchw);cum = cumsum(inforvisible);%----------- 产生一个随机数 用来确定选择类型  ----------%rnd = rand;%----------- if rnd <= movep 执行最大值选择  ----------%if rnd <= movep[tmp,flag] = max(inforvisible);elsernd = rand;for i=1:1:NPif cum(i) > rnd*cum(NP)%if sum(inforvisible(1:i))>rnd*sum(inforvisible) flag=i;break;endendend%----------- 蚂蚁移动过程 ----------%for i=1:1:NPX(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>bestF1bestX = X(bestlow,:);bestF = bestF1;elseX(bestlow,:)=bestX;F(bestlow)=bestF;end%----------- 记录结果  ----------%result(gen) = bestF;if (bestF<Error) & (flagc(1)==0)flagc(1) = 1;flagc(2) = gen;endif mod(gen,10)==0disp(['代数:',num2str(gen),'----最优:',num2str(bestF)]);endend
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_Ntime(gen) = gen;inforvisible = (information.^inforw).*(visibility.^watchw);cum = cumsum(inforvisible);%----------- 产生一个随机数 用来确定选择类型  ----------%rnd = rand;%----------- if rnd <= movep 执行最大值选择  ----------%if rnd <= movep[tmp,flag] = max(inforvisible);elsernd = rand;for i=1:1:NPif cum(i) > rnd*cum(NP)%if sum(inforvisible(1:i))>rnd*sum(inforvisible) flag=i;break;endendend%----------- 蚂蚁移动过程 ----------%for i=1:1:NPX(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>bestF1bestX = X(bestlow,:);bestF = bestF1;elseX(bestlow,:)=bestX;F(bestlow)=bestF;end%----------- 记录结果  ----------%result(gen) = bestF;if (bestF<Error) & (flagc(1)==0)flagc(1) = 1;flagc(2) = gen;endif mod(gen,10)==0disp(['代数:',num2str(gen),'----最优:',num2str(bestF)]);endend
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.mzph.cn/news/828879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

Vue Router基础知识整理

Vue Router基础知识整理 1. 安装与使用&#xff08;Vue3&#xff09;安装使用 2. 配置路径别名和VSCode路径提示&#xff08;了解&#xff09;3. 使用查询字符串或路径传参query动态路由 与 params 4. router-link、定义别名、定义路由名称、编程式导航定义别名 aliasrouter-li…

李沐66_使用注意力机制的seq2seq——自学笔记

加入注意力 1.编码器对每次词的输出作为key和value 2.解码器RNN对上一个词的输出是query 3.注意力的输出和下一个词的词嵌入合并进入RNN 一个带有Bahdanau注意力的循环神经网络编码器-解码器模型 总结 1.seq2seq通过隐状态在编码器和解码器中传递信息 2.注意力机制可以根…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案&#xff0c;这一组合在近年来得到了广泛的关注和应用。ELK的出现&#xff0c;源于大数据和云计算技术的快速发展&#xff0c;以及对高效日志管理的迫切需求。 随着企业信息化程度…

【10-10-10旁观思维】项目管理必会的思维分析工具 08(送模板~)

&#x1f468;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;面对一个决策或选择&#xff0c;当你犹豫不决时&#xff0c;可以想一下 ⏰10分钟后&#xff0c;自己是怎么看待自己现在的决策&#xff0c;依然保持一致亦或会后悔&#xff1b; ⏰10个月后&#xff0c;你又会如何思…

Javascript 插值搜索与二分搜索

插值搜索和二分搜索都是在有序数组中查找目标元素的算法。它们之间的核心区别在于确定中间元素的方式。 1、二分搜索&#xff08;Binary Search&#xff09;&#xff1a;二分搜索是一种通过将目标值与数组中间元素进行比较&#xff0c;然后根据比较结果缩小搜索范围的算…

Docker资源管理-数据管理

一、CPU 资源控制&#xff1a; 1.cgroups&#xff1a; cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups&#xff08;Control grou…

深度剖析SSD掉电保护机制-1

随着固态硬盘&#xff08;Solid State Drives, SSD&#xff09;在数据中心、企业存储、个人计算设备等领域广泛应用&#xff0c;其数据安全性与可靠性成为至关重要的考量因素。其中&#xff0c;应对突发电源故障导致的数据丢失风险的掉电保护&#xff08;Power Loss Protection…

MA-Chitosan MA甲基丙烯酸修饰羧甲基壳聚糖 MA-Chitosan

MA-Chitosan MA甲基丙烯酸修饰羧甲基壳聚糖 MA-Chitosan、 【中文名称】甲基丙烯酸化羧甲基壳聚糖 【英文名称】Chitosan-MA 【结 构】 【纯 度】95%以上 【保 存】-20℃ 【规 格】10mg,500mg,1g,5g,10g 【产品特性】 Chitosan-MA&#xff08;壳聚糖-甲基丙烯酸…

Verilog基础语法——parameter、localparam与`define

Verilog基础语法——parameter、localparam与define 写在前面一、localparam二、parameter三、define写在最后 写在前面 在使用Verilog编写RTL代码时&#xff0c;如果需要定义一个常量&#xff0c;可以使用define、parameter和localparam三种进行定义与赋值。 一、localparam …

大模型都在用的:旋转位置编码

写在前面 这篇文章提到了绝对位置编码和相对位置编码&#xff0c;但是他们都有局限性&#xff0c;比如绝对位置编码不能直接表征token的相对位置关系&#xff1b;相对位置编码过于复杂&#xff0c;影响效率。于是诞生了一种用绝对位置编码的方式实现相对位置编码的编码方式——…

机器学习day1

一、人工智能三大概念 人工智能三大概念 人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09; 人工智能&#xff1a;人工智能是研究计算代理的合成和分析的领域。人工智能是使用计算机来模拟&#xff0c;而不是人类…

关于Android中的限定符

很多对于Android不了解或是刚接触Android的初学者来说&#xff0c;对于Android开发中出现的例如layout-large或者drawable-xxhdpi这样的文件夹赶到困惑&#xff0c;这这文件夹到底有什么用&#xff1f;什么时候用&#xff1f;这里简单的说一下。 其实&#xff0c;在上面例子中&…

基于OpenCV的人脸签到系统

效果图 目录文件 camerathread.h 功能实现全写在.h里了 class CameraThread : public QThread {Q_OBJECT public:CameraThread(){//打开序号为0的摄像头m_cap.open(0);if (!m_cap.isOpened()) {qDebug() << "Error: Cannot open camera";}//判断是否有文件,人脸…

iframe实现pdf预览,并使用pdf.js修改内嵌标题,解决乱码问题

项目中遇到文件预览功能,并且需要可以打印文件.下插件对于内网来说有点麻烦,正好iframe预览比较简单,且自带下载打印等功能按钮. 问题在于左上方的文件名乱码,网上找了一圈没有看到解决的,要么就是要收费要会员(ztmgs),要么直接说这东西改不了. 使用: 1.引入 PDF.js 库&…

Spring Boot集成Redisson实现延迟队列

项目场景&#xff1a; 在电商、支付等领域&#xff0c;往往会有这样的场景&#xff0c;用户下单后放弃支付了&#xff0c;那这笔订单会在指定的时间段后进行关闭操作&#xff0c;细心的你一定发现了像某宝、某东都有这样的逻辑&#xff0c;而且时间很准确&#xff0c;误差在1s内…

与AI对话:探索最佳国内可用的ChatGPT网站

与AI对话&#xff1a;探索最佳国内可用的ChatGPT网站 &#x1f310; 链接&#xff1a; GPTGod 点击可注册 &#x1f3f7;️ 标签&#xff1a; GPT-4 支持API 支持绘图 Claude &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&…

JavaEE——Spring Boot + jwt

目录 什么是Spring Boot jwt&#xff1f; 如何实现Spring Boot jwt&#xff1a; 1. 添加依赖 2、创建JWT工具类 3. 定义认证逻辑 4. 添加过滤器 5、 http请求测试 什么是Spring Boot jwt&#xff1f; Spring Boot和JWT&#xff08;JSON Web Token&#xff09;是一对常…

苍穹外卖学习

并不包含全部视频内容&#xff0c;大部分都按照操作文档来手搓代码&#xff0c;资料&#xff0c;代码都上传git。 〇、实际代码 0.1 Result封装 package com.sky.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data pub…

软考 系统架构设计师系列知识点之软件可靠性基础知识(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;4&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第1节 软件可靠性基本概念 9.1.3 可靠性目标 前文定量分析软件的可靠性时&#xff0c;使用失效强度来表示软件缺陷对…