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

news2025/1/17 0:18:51

        本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程,对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.coloradmin.cn/o/1622980.html

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

相关文章

Fhopify:跨境电商行业迎来发展新机遇打造购物者天堂

随着全球化的推进和互联网的普及,跨境电商作为一种新型的商业模式,日益受到人们的关注和重视。它通过互联网平台,打破了地域限制,使得消费者可以便捷地购买来自世界各地的商品,同时也为企业提供了更广阔的市场和发展空间。在这样的背景下,跨境电商的新趋势和未来发展备受关注。…

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…

初学python记录:力扣2739. 总行驶距离

题目&#xff1a; 卡车有两个油箱。给你两个整数&#xff0c;mainTank 表示主油箱中的燃料&#xff08;以升为单位&#xff09;&#xff0c;additionalTank 表示副油箱中的燃料&#xff08;以升为单位&#xff09;。 该卡车每耗费 1 升燃料都可以行驶 10 km。每当主油箱使用了…

演示在一台Windows主机上运行两个Mysql服务器(端口号3306 和 3307),安装步骤详解

目录 在一台Windows主机上运行两个Mysql服务器&#xff0c;安装步骤详解因为演示需要两个 MySQL 服务器终端&#xff0c;我只有一个 3306 端口号的 MySQL 服务器&#xff0c;所以需要再创建一个 3307 的。创建一个3307端口号的MySQL服务器1、复制 mysql 的安装目录2、修改my.in…

基于springboot实现海滨学院班级回忆录的设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现海滨学院班级回忆录的设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足&#xff0c;创建了一个计算机管理海…

Andorid进程间通信之 UNIX SOCKET

1&#xff0c;什么是UNIX SOCKET UNIX SOCKET&#xff0c;域套接字&#xff0c;UNIX SOCKET可用于同一台设备进程间通信&#xff0c;它不需要经过网络协议栈&#xff0c;不需要打包拆包、计算校验和、维护序列号应答等&#xff0c;只需要将数据从一个进程复制到另一个进程&…

xray使用入门

简介 长亭科技旗下的一款网络安全漏洞扫描工具&#xff0c;用于检测和评估web应用程序的安全性。具有一下特点&#xff1a;检测速读快、检查范围广、代码质量高、高级可定制以及安全无危害。属于不开源的项目&#xff0c;用户直接下载xray的可执行文件&#xff0c;即可运行该工…

SSH远程连接docker容器-Linux-SSH -L 打隧道

问题&#xff1a;在物理机上用podman创建了一个容器&#xff0c;想SSH直接远程连接docker容器 解决方式&#xff1a; 步骤1: 在本地terminal输入以下命令&#xff1a; ssh -L 容器端口号:localhost:容器端口号 物理机用户名物理机ip -p 物理机端口号 即可&#xff0c;可新打…

1、k8s问题pod从service中剔除

一、起因 redis原来由两服务器的集群变为三服务器的集群&#xff0c;通过statefulset扩展了两节点&#xff0c;并把redis-app-0和redis-app-3从集群中去除&#xff0c;但是由于service路由后端不变&#xff0c;导致程序连接后端仍然可能到redis-app-0和redis-app-3 二、处理 …

WiFi、Ethenet、4G优先级切换

1、多网卡情况下如何调整优先级方案 按照目前公司前辈给出的方案&#xff0c;调整优先级的手段有两种&#xff1a; <1>.删除默认路由--route del 的方法 <2>.ifmetric源码提供的修改路由表的mteric的值来设置路由的优先级&#xff0c;metric越小优先级越高。 应…

C#开发中关于业务类与窗口文件以及数据库的大体连接流程(业务类的写法)

所有的开发在基准上&#xff0c;都是数据的交互&#xff0c;在VS中基于WinFrm的C#开发可以采用业务类与窗口类分开&#xff0c;以形成模块&#xff0c;接下来简述大体开发流程 业务类中&#xff0c;我们需要继承EntityClass类&#xff0c;来形成与窗口类的接口&#xff1a; pu…

Spring 事务 @Transactional 注解

上期我们讲解了Spring事务的两种实现&#xff0c;其中声明式注解使用了 Transactional 注解&#xff0c; 接下来我们学习 该注解的使用细节。 我们主要学习 Transactional注解当中的三个常见属性&#xff1a; rollbackFor&#xff1a;异常回滚属性&#xff0c;指定能够出发事…

河道采砂执法监管信息化平台:科技赋能,智慧监管

随着信息技术的飞速发展&#xff0c;信息化平台已经成为提升行业监管效率和水平的重要工具。河道采砂作为水利资源管理的重要环节&#xff0c;其执法监管同样需要与时俱进&#xff0c;利用先进技术手段提升监管效能。河道采砂执法监管信息化平台便是这一背景下的产物&#xff0…

【总结】hbase master重启恢复失败问题修复

问题现象 最近hbase master 莫名其妙宕机了&#xff0c;查看最后输出日志&#xff0c;也没有发现有效信息。 于是想着先重启一把&#xff0c;在hbase master 选主成active状态的过程中&#xff0c;发现重启多次都很漫长&#xff0c;且最终因重启时间过长&#xff0c;被hbase-…

基于STM32的蓝牙小车(虚拟串口模拟)的Proteus仿真

文章目录 一、前言二、仿真图1.要求2.思路3.画图3.1 电源部分3.2 超声波测距部分3.3 电机驱动部分3.4 按键部分3.5 蓝牙部分3.6 显示屏部分3.7 整体 4.仿真5.软件 三、总结 一、前言 proteus本身并不支持蓝牙仿真&#xff0c;这里我采用虚拟串口的方式来模拟蓝牙控制。 这里给…

了解网卡、光猫、路由器

了解网卡、光猫、路由器 一、网卡二、光猫三、路由器四、光猫和路由器的联系和区别五、家庭正常上网的简单流程六、企业正常上网的简单流程 一、网卡 网卡&#xff1a;用来允许计算机在计算机网络上进行通讯的计算机硬件 一般来说&#xff0c;笔记本都有两种网卡&#xff0c;有…

栈和队列--数据结构

栈&#xff08;Stsck&#xff09; 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵循“后进先出”&#xff08;LIFO&#xff09;的原则。 …

性价比高超声波清洗机品牌有哪些?四款高性价比超声波清洗机安利

如果你经常不清洗眼镜&#xff0c;那么非常推荐你入手一台超声波清洗机在家清洗眼镜&#xff01;因为&#xff0c;超声波清洗机清洗眼镜真的非常方便。如果你经常佩戴眼镜&#xff0c;但是常常忘记清洗的话&#xff0c;看完这篇文章后一定要改掉不清洗眼镜的坏习惯&#xff0c;…

ffmpeg的安装以及使用

1.FFmpeg 的主要功能和特性&#xff1a; 格式转换&#xff1a;FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP4、AVI、MKV、MOV、FLV、MP3、AAC 等。视频处理&#xff1a;FFmpeg 可以进行视频编码、解…

数码相机数据恢复,3招找回珍贵照片!

“我有一部数码相机&#xff0c;存储了很多很重要的文件和数据。但是我一不小心就误删了里面的重要数据&#xff0c;有什么方法可以恢复相机里的文件吗&#xff1f;” 数码相机已成为我们日常生活中不可或缺的一部分&#xff0c;它帮助我们记录生活的点滴&#xff0c;留下美好的…