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.rhkb.cn/news/313561.html

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

相关文章

如何利用交易形态的失败进行现货黄金?

进行现货黄金理财&#xff0c;除了需要投资者对黄金投资有热情之外&#xff0c;有方法也是很重要的&#xff0c;光有热情而没有技术&#xff0c;我们的资金很可能会成为其他人的囊中之物。但如果有了现货黄金理财的技术&#xff0c;情况就可能扭转过来。下面我们就从买入的角度…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

【draw.io的使用心得介绍】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

14.MMD导入Blender及贴图步骤

MMD导出.abc文件 在MMD十周年桥版本导入一个人物模型&#xff0c;这里导入仆人 注意MMD的路径不能有中文 点击上面的MMDBridge 设定 第一个选择blender by 第二个选择实行 这里是选择帧数范围和帧率 帧率一定要是30&#xff0c;不然后面可能会出问题 点击文件导出视频…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

说说2024年暑期三下乡社会实践工作新闻投稿经验

作为一名在校大学生,我有幸自去年起参与学院组织的暑期大学生三下乡社会实践团活动。这项活动不仅是我们深入基层、服务社会的重要平台,也是展现当代大学生风采、传递青春正能量的有效途径。然而,如何将这些生动鲜活的实践故事、感人至深的瞬间传播出去,让更多人了解并受到启发…

抽象的代理模式1.0版本

前言&#xff1a; 在阅读Spring Security官方文档时&#xff0c;里面设计到了一种设计模式——代理模式Proxy 众里寻她千百度&#xff0c;蓦然回首&#xff0c;那人却在灯火阑珊处 开始 在之前的文章里陈述了一个观点——编程语言和语言没有区别 现看看我们日常生活中的代理…

数据结构篇其一---顺序表

前言 数据结构篇&#xff0d;&#xff0d;&#xff0d;C语言实现数据结构 &#xff23;语言的基础知识&#xff1a;数组 函数 结构体 指针 动态内存分配。 顺序表 从数据结构的角度看待数组 int arr[10]; 数组是一个基本的数据结构吗&#xff1f; 这里以一维数组为例。 …

OpenCV 实现霍夫圆变换

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现霍夫变换 下一篇:OpenCV 实现重新映射 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 HoughCircles()检测图像中的圆圈。 理论 Hough 圆变换 H…

L2-052 吉利矩阵

题目描述 题解思路 这个道题就是很简单&#xff0c;就跟n皇后问题一样&#xff0c;给矩阵填数&#xff0c;使得矩阵满足一个什么条件&#xff0c;最后求方案数或者方案。很容易想到回溯法&#xff0c;根据数据范围&#xff0c;应该能够确定回溯法是没有问题的。 我们只需要枚举…

Python实现线性拟合及绘图

Python实现线性拟合及绘图 当时的数字地形实验&#xff0c;使用matplotlib库绘制了一张图表表示不同地形类别在不同分辨率下的RMSE值&#xff0c;并分别拟合了一条趋势线。现在来看不足就是地形较多时&#xff0c;需要使用循环更好一点&#xff0c;不然太冗余了。 代码逻辑 …

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码&#xff0c;解压即可食用&#xff0c;支持在本地浏览器打开。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

vscode 打代码光标特效

vscode 打代码光标特效 在设置里面找到settings 进入之后在代码最下方加入此代码 "explorer.confirmDelete": false,"powermode.enabled": true, //启动"powermode.presets": "fireworks", // 火花效果// particles、 simple-rift、e…

STM32_舵机的实战

一、配置相应的管脚 二、写代码

ASP.NET集成客户关系管理的企业网站的设计与开发

摘 要 企业要在激烈的市场竞争中立于不败之地&#xff0c;就必须找一种全新的管理理念和管理手段&#xff0c;对其内部和外部资源进行有效的整合。新一代ERP产品正在向客户端和供应端延伸&#xff0c;客户端的延伸即是客户关系管理。对于每个企业来说客户管理的完善程度将直接…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文&#xff0c;该公司在本论文中宣布的一种新的“越狱”技术&#xff0c;名为Many-shot Jailbreaking&#xff08;多轮越狱&#xff09;。文章详细描述了目前大语言模型&#xff08;LLM&…

IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁&#xff1f; A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点&#xff1a;网络安全 解析&#xff1a;&#xff08;B&#xff09; 钓鱼攻击通常被认为是应用层的安全威胁&#xff0c;也有在网络层进行伪装实施钓鱼攻击&#xff0c;…

Android驱动开发之如何编译和更换内核

编译内核可以使用图形化的界面配置,也可以直接使用脚本。在X86_64模拟器环境下,不用交叉编译,而交叉编译工具很容易出现兼容问题,一般也只能使用芯片厂商提供的工具,而不是GNU提供的工具。 android内核开发流程以及架构变化了很多,详情请看 内核官网 内核版本选择 由…