蚁群算法—ACA

news2024/10/5 16:22:40
🍎道阻且长,行则将至。🍓

目录

  • 一、蚁群算法简介🍓
    • 1.ACA基本思想
    • 2.ACA基本原理
    • 3.ACA基本步骤
  • 二、算法求解TSP问题🍎
    • 1.导入数据
    • 2.计算城市间相互距离
    • 3.初始化参数
    • 4.迭代寻找最佳路径
    • 5.结果显示
    • End


一、蚁群算法简介🍓

蚁群算法(Ant Colony Algorithm,ACA),20世纪90年代 M.Dorigo(意大利)受自然界蚂蚁觅食行为的启发提出一种新的优化算法解决旅行商问题(TSP),并取得较好的结果。
在这里插入图片描述

1.ACA基本思想

 蚂蚁在寻找食物时,会在其经过的路径上释放一种信息素,并能够感知其他蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径上的信息素浓度,这样会形成一个正反馈。最终找到一条从巢穴到食物源的最佳路径,即最短距离。路径上的信息素浓度会随着时间的推进而逐渐衰减。

 将蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也越来越多。最终,整个蚁群集中到最佳的路径上,即对应优化问题的最优解。

2.ACA基本原理

将以解决TSP问题为例描述ACA基本原理。

设整个蚂蚁群体中蚂蚁的数量为 m,城市的数量为 n,城市与城市之间的距离为di,j(i,j=1,2,…,n),t 时刻城市 i 与城市 j 连接路径上的信息素浓度为τi,j(t)。初始时刻,各个城市间连接路径上的信息素浓度相同:τi,j(0)=τ0

蚂蚁 k(k=1,2,…,m)根据各个城市间连接路径上的信息素浓度决定其下一个访问城市,设 Pki,j(t)表示 t 时刻蚂蚁 k 从城市 i 转移到城市 j 的概率,其计算公式为:
在这里插入图片描述
其中,ηij(t)为启发函数,ηij(t)=1/dij,表示蚂蚁从城市 i 转移到城市 j 的期望,allowk(k=1,2,…,m)为蚂蚁k待访问城市的集合,开始时allowk中有(n-1)个元素,即出去蚂蚁k出发城市的其他所有城市。随着时间的推进allowk中的元素不断减少,直至为空,表示所有的城市均访间完毕。α 为信息素重要程度因子,其值越大表示信息素的浓度在转移中起的影响越大。β 为启发函数重要程度因子,其值越大表示启发函数在转移中的影响越大,蚂蚁会以较大的概率转移到距离短的城市。

在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素也会逐渐消失,设 ρ(0<ρ<1)表示信息素的挥发程度。当所有蚂蚁完成一次循环后,各个城市间连路径上的信息素浓度需进行实时更新:
在这里插入图片描述
在这里插入图片描述
其中,△τki,j 表示第 k 只蚂蚁在城市 i 与城市 j 连接路径上释放的信息素浓度;△τi,j 表示所蚂蚁在城市 i 与城市 j 连接路径上释放的信息素浓度之和。

针对蚂蚁释放信息素问题,有 3 种不同的模型,分别称之为 ant cycle systemant quantity systcmant density system

  • 1.ant cycle system
    ant cycle system 模型中,△τki,j 的计算公式为:
    在这里插入图片描述
    Q为常数,表示蚂蚁循环一次所释放的信息素总量,Lk为第 k 只蚂蚁经过路径的长度。利用蚂蚁经过路径的整体信息(经过路径的总长)计算释放的信息素浓度
  • 2.ant quantity systcm
    在这里插入图片描述
    利用蚂蚁经过路径的局部信息(经过各个城市间的距离)计算释放的信息素浓度。
  • 3.ant density system
    在这里插入图片描述
    只是简单地将信息素释放的浓度取为固定值没有考虑不同蚂蚁经过路径长短的影响

3.ACA基本步骤

  • 1.初始化参数
    种群大小(蚂蚁数) m、信息素重要程度因子 α、启发函数重要程度因子 β、信息素挥发因子 ρ、信息素释放总量 Q、最大选代次数itermax、迭代次数初始值 iter = 1;
  • 2.构建解空间
    将各个蚂蚁随机地置于不同出发点,对每个蚂蚁 k(k=1,2,…,m),计算 Pki,j(t) 来确定其下一个待访问的城市,直到所有蚂蚁访问完所有的城市;
  • 3.更新信息素
    计算各个蚂蚁经过的路径长度 L(=1,2,…,m),记录当前选代次数中的最优解(最短路径),同时对各个城市连接路径上的信息素浓度进行更新;
  • 4.判断是否终止
    若 iter<itermax,则令 iter = iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,输出最优解。

在这里插入图片描述


二、算法求解TSP问题🍎

1.导入数据

load citys_data.mat

城市坐标 x y:

citys_data:
1304	2312
3639	1315
4177	2244
3712	1399
3488	1535
3326	1556
3238	1229
4196	1004
4312	790
4386	570
3007	1970
2562	1756
2788	1491
2381	1676
1332	695
3715	1678
3918	2179
4061	2370
3780	2212
3676	2578
4029	2838
4263	2931
3429	1908
3507	2367
3394	2643
3439	3201
2935	3240
3140	3550
2545	2357
2778	2826
2370	2975

2.计算城市间相互距离

n = size(citys,1);
D = zeros(n,n);
for i = 1:n
    for j = 1:n
        if i ~= j
            D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
        else
            D(i,j) = 1e-4;
        end
    end
end

3.初始化参数

m = 50;                              % 蚂蚁数量
alpha = 1;                           % 信息素重要程度因子
beta = 5;                            % 启发函数重要程度因子
rho = 0.1;                           % 信息素挥发因子
Q = 1;                               % 常系数
Eta = 1./D;                          % 启发函数
Tau = ones(n,n);                     % 信息素矩阵
Table = zeros(m,n);                  % 路径记录表
iter = 1;                            % 迭代次数初值
iter_max = 200;                      % 最大迭代次数
Route_best = zeros(iter_max,n);      % 各代最佳路径
Length_best = zeros(iter_max,1);     % 各代最佳路径的长度
Length_ave = zeros(iter_max,1);      % 各代路径的平均长度

4.迭代寻找最佳路径

while iter <= iter_max
     % 随机产生各个蚂蚁的起点城市
      start = zeros(m,1);
      for i = 1:m
          temp = randperm(n);
          start(i) = temp(1);
      end
      Table(:,1) = start;
      citys_index = 1:n;
      % 逐个蚂蚁路径选择
      for i = 1:m
          % 逐个城市路径选择
         for j = 2:n
             tabu = Table(i,1:(j - 1));           % 已访问的城市集合(禁忌表)
             allow_index = ~ismember(citys_index,tabu);
             allow = citys_index(allow_index);  % 待访问的城市集合
             P = allow;
             % 计算城市间转移概率
             for k = 1:length(allow)
                 P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;
             end
             P = P/sum(P);
             % 轮盘赌法选择下一个访问城市
             Pc = cumsum(P);
            target_index = find(Pc >= rand);
            target = allow(target_index(1));
            Table(i,j) = target;
         end
      end
      % 计算各个蚂蚁的路径距离
      Length = zeros(m,1);
      for i = 1:m
          Route = Table(i,:);
          for j = 1:(n - 1)
              Length(i) = Length(i) + D(Route(j),Route(j + 1));
          end
          Length(i) = Length(i) + D(Route(n),Route(1));
      end
      % 计算最短路径距离及平均距离
      if iter == 1
          [min_Length,min_index] = min(Length);
          Length_best(iter) = min_Length;
          Length_ave(iter) = mean(Length);
          Route_best(iter,:) = Table(min_index,:);
      else
          [min_Length,min_index] = min(Length);
          Length_best(iter) = min(Length_best(iter - 1),min_Length);
          Length_ave(iter) = mean(Length);
          if Length_best(iter) == min_Length
              Route_best(iter,:) = Table(min_index,:);
          else
              Route_best(iter,:) = Route_best((iter-1),:);
          end
      end
      % 更新信息素
      Delta_Tau = zeros(n,n);
      % 逐个蚂蚁计算
      for i = 1:m
          % 逐个城市计算
          for j = 1:(n - 1)
              Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);
          end
          Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);
      end
      Tau = (1-rho) * Tau + Delta_Tau;
    % 迭代次数加1,清空路径记录表
    iter = iter + 1;
    Table = zeros(m,n);
end

5.结果显示

[Shortest_Length,index] = min(Length_best);
Shortest_Route = Route_best(index,:);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);

figure(1)
plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...
     [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');
grid on
for i = 1:size(citys,1)
    text(citys(i,1),citys(i,2),['   ' num2str(i)]);
end
text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),'       起点');
text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),'       终点');
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法优化路径(最短距离:' num2str(Shortest_Length) ')'])
figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')
legend('最短距离','平均距离')
xlabel('迭代次数')
ylabel('距离')
title('各代最短距离与平均距离对比')

在这里插入图片描述 在这里插入图片描述

最短距离:15828.7082
最短路径:15  14  12  13  11  23  16   4   2   5   6   7   8   9  10   3  18  17  19  24  25  20  21  22  26  28  27  30  31  29   1  15
>> 

End

  • 采用正反馈机制,使得搜索过程不断收敛,最终逼近最优解。
  • 每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境进行间接地通讯。
  • 搜索过程采用分布式计算方式,多个个体同时进行并行计算,大大提高了算法的计算能力和运行效率。
  • 启发式的概率搜索方式不容易陷入局部最优,易于寻找到全局最优解。

☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

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

相关文章

软件 - 配置安装 Photoshop 的 RID 独立运行版本

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131673004 Adobe Photoshop 是一款专业的图像处理软件,广泛应用于平面设计、摄影、插画、视频制作等领域,可以对各种格式的图片进行编辑、修饰、合成、优化等操作,创…

SpringBoot + Vue 实现酒店客房管理系统

目录 1 问题的提出 5 2系统开发的可行性研究 6 2.1 技术上可行性分析 6 系统现阶段的发展过程中&#xff0c;利用现有人力和物力是完全具备的能力开发出来 6 2.2 经济的可行性分析 6 2.3 操作可行性分析 6 3 需求分析 7 3.1 需求描述 7 3.2 功能需求分析 7 3.3 非功能需求分析…

JDBC学习笔记

目录 一、JDBC 1&#xff1a;为什么要学习JDBC技术 2、JDBC技术概述与理解 3、JDBC使用步骤分析 3.1、注册驱动 3.2 、获取连接 3.3、创建发送sql语句对象 3.4、发送sql语句 3.5、结果集解析 3.6、资源关闭 一、JDBC 1&#xff1a;为什么要学习JDBC技术 1、Java和数…

【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

亚马逊买家号如何绑定信用卡

要在亚马逊上绑定信用卡作为买家号的支付方式&#xff0c;请按照以下步骤进行操作&#xff1a; 1、登录亚马逊账户&#xff1a;使用您的亚马逊账户用户名和密码登录到亚马逊网站。 2、导航至"我的账户"&#xff1a;在页面右上角&#xff0c;将鼠标悬停在"你好…

安装使用docker-compose

Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&#xff08;container&…

【单周期CPU】LoongArch | LA32R | 二选一控制器MUX | 数据通路

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中数据通路的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 2017.4以上版…

华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明先将[0,0]位置的值变为1。第一次同化&#xff1a;第二次同化&#xff1a; 大家好&#xff0c;我是哪吒。 一、题目描述 存在一个m*n的二维数组&#xff0c;其成员取…

小程序项目时间选择器用法

项目需求是要实现这种形式, 但是相信大家都试了各种插件,都不太合适,uView框架也不能满足自己的需要; 推荐使用:uview-ui-plus 基本上小程序遇到的单选多选 日期 省市区 都可以完美的实现,可以通过插件市场安装使用 但是要实现ui给的原型图 还需要做一下调整 弹性布局给两个选…

Linux查找关键字出现的位置

在Linux中&#xff0c;您可以使用以下命令来查找文件中关键字出现的位置&#xff1a; grep -rnw /path/to/search -e keyword其中&#xff1a; - -r 递归地搜索指定路径下的所有子目录。 - -n 显示匹配行的行号。 - -w 完整匹配单词&#xff0c;而不是部分匹配。 - /path/to/s…

pandas 重复数据处理详解

概要 重复值处理主要涉及两个部分&#xff0c;一个是找出重复值&#xff0c;第二个是删除重复值&#xff0c;也就是根据自己设定的条件进行删除操作。本次来介绍关于重复数据处理的几个常用方法。 定位重复值 对于重复值&#xff0c;我们首先需要查看这些重复值是什么样的形式…

LFU算法的详细介绍与实现

LRU 算法的淘汰策略是 Least Recently Used&#xff0c;也就是每次淘汰那些最久没被使用的数据&#xff1b;而 LFU 算法的淘汰策略是 Least Frequently Used&#xff0c;也就是每次淘汰那些使用次数最少的数据。 LRU 算法的核心数据结构是使用哈希链表 LinkedHashMap&#xff…

spring全家桶(一):如何创建springboot项目

一.如何创建springboot项目 1.通过官网网站创建项目&#xff1a;https://start.spring.io/ 2.eclipse通过插件Spring Tool Suite(sts)创建项目 3.idea默认已经有spring插件 二.程序入口 SpringBootApplication public class HelloApplication {public static void main(Strin…

Linux--获取当前进程的父进程PID(即PPID)

方法一&#xff1a;编程法 #include <sys/types.h>pid_t ppidgetppid(); 方法二&#xff1a;指令法 ps axj | head -1 && ps axj | grep 当前进程PID 注&#xff1a;你会发现&#xff0c;每次查看当前进程PID时&#xff0c;PID都不相同&#xff0c;但是它的P…

设计模式——原型模式

原型模式比较简单&#xff0c;本质就是将一个设置好一部分公共属性的对象进行克隆&#xff0c;产生出大量的对象&#xff0c;再对每个对象进行相应的个性化处理需要注意的是&#xff1a;对象克隆时&#xff0c;如果其成员变量中存在引用类型&#xff08;数组、引用对象等&#…

《人工智能.一种现代方法》原版精读思维导图-第二章

目录 书籍 相关 2. Intelligent Agents 2.1 Agents and Environments 2.2 Good Behavior: The Concept of Rationality 2.3 The Nature of Environments 2.4 The Structure of Agents summary 书籍 人工智能.一种现代方法 Artificial Intelligence. The Modern Appro…

基于LLM大模型开发Web App生成器

随着越来越多的代码生成模型公开可用&#xff0c;现在可以以我们以前无法想象的方式进行文本到网络甚至文本到应用程序。 本教程介绍了一种通过流式传输和渲染内容来生成 AI Web 内容的直接方法。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、在 Node 应用程序中…

13 个最佳免费 PDF 编辑器清单

您正在寻找一款真正免费的 PDF 编辑器&#xff0c;不仅可以编辑和添加文本&#xff0c;还可以更改图像、添加您自己的图形、签署您的名字、填写表格等等&#xff1f;您来对地方了&#xff1a;我研究了这些类型的应用程序&#xff0c;以得出您正在寻找的内容的列表。 其中一些是…

element 表格套输入框

实现效果&#xff1a; 编辑&#xff1a; 查看&#xff1a;点击平台补贴展示弹窗 <el-table:data"tableData"border:header-cell-style"{background:#D7D7D7,color:#000}"style"width: 100%"row-dblclick"dbclick":cell-class-name…

c++中的时间处理(3)与sleep相关的时间函数

1、Sleep()函数 头文件&#xff1a; Windows下为&#xff1a;windows.h Linux下为&#xff1a;unistd.h 注意&#xff1a; &#xff08;1&#xff09;Sleep是区分大小写的&#xff0c;有的编译器是大写&#xff0c;有的是小写。 &#xff08;2&#xff09;Sleep括号里的时间&…