蚁群优化算法(Ant Colony Optimization Algorithm)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法引言

蚁群算法,是一种模拟蚂蚁觅食行为的优化算法。想象一下,当你在野餐时,不小心洒了一些糖在地上。一只蚂蚁偶然发现了这些糖,就会在回巢的路上留下信息素,引导其他蚂蚁也找到这个食物来源。随着越来越多的蚂蚁走这条路,信息素会越来越浓,这条路就越来越“受欢迎”。但是,如果有一条更短的路径,那么蚂蚁会更快地来回运送食物,因此那条路径上的信息素会更快地积累,逐渐变成最优路径。这就是蚁群算法的灵感来源。

算法应用

蚁群算法的应用非常广泛,它可以用于解决旅行商问题(TSP)、车辆路径规划、网络路由优化等多种复杂的优化问题。由于其独特的优化机制和较好的寻优能力,蚁群算法在很多实际问题中都表现出了出色的性能。尤其在处理动态变化的问题时,蚁群算法能够有效地适应环境变化,找到新的最优解。

算法计算流程

蚁群算法 (Ant Colony Optimization, ACO) 是一种模拟蚂蚁受食行为的启发式算法,用于解决图形路径优化问题,蚁群算法基于蚂蚁在寻找食物源和返回巢穴时,通过分泌信息素来标记路径并指导其他蚂蚁的行为。这种信息素会随时间蒸发,而被更多蚂蚁使用的路径上的信息素会更浓,导致更多蚂蚁选择该路径。

初始化:

最开始,所有路径的信息素浓度 \tau_{ij}(t)都被初始化为一个小的常数,这意味着一开始,所有路径都被视为同等可能。

构建解决方案:

蚂蚁们开始它们的搜索。每只蚂蚁根据信息素浓度和启发式信息(如路径长度的倒数) 来选择下一个地点。这是通过路径选择概率公式 P_{ij}(t)实现的。蚂蚁选择路径的概率计算如下:

公式概述:

                                            P_{ij}(t)=\frac{\left[\tau_{ij}(t)\right]^\alpha\cdot\left[\eta_{ij}\right]^\beta}{\sum_{k\in\text{ allowed }}\left[\tau_{ik}(t)\right]^\alpha\cdot\left[\eta_{ik}\right]^\beta}


– P_{ij}(t)是在时间 t 蚂蚁从城市 i 移动到城市 j 的概率。
– \tau_{ij}(t) 是路径 i 到 j 上的信息素浓度。
– \eta_{ij} 是启发式信息,如路径的倒数。
– α 和 β 分别控制信息素重要程度和启发式因子的相对重要程度。
– 分母是蚂蚁可以选择的所有路径上这些值的总和,用于归一化概率。

信息素浓度 \tau_{ij}(t) :
– 信息素浓度是蚂蚁沟通找到好路径的方式。如果一条路径被很多蚂蚁选择,那么这条路径上的信息素浓度会增加,提示其他蚂蚁这可能是一个好的选择。

启发式信息 \eta_{ij}:
– 启发式信息通常是路径的逆长度(例如,两地点间距离的倒数)。路径越短,这个值就越大,表示路径越有可能是好的选择。

参数 α 和 β :
– α 调节信息素浓度的影响力。当 α 较大时,蚂蚁更可能遵循其他蚂蚁的路径。
– β 调节启发式信息 (如路径长度) 的影响力。当 β 较大时,蚂蚁更倾向于选择较短的路径。

为什么这样设计?
– 这个公式的设计反映了蚂蚁在自然界中寻找食物的行为。在自然界中,蚂蚁通过释放信息素和感应这些信息素来找到食物并传达信息。这个公式通过数学方式模仿了这一行为。
– 通过调整 α 和 β ,可以平衡蚂蚁在遵循其他蚂蚁的路径(即社会信息)和使用自己的启发式信息 (即个体认知) 之间的权衡。帮助蚂蚁决定下一步的最佳路径。这种设计旨在模拟蚂蚁在自然界中通过集体行为找到最优路径的方式,是一种有效的启发式搜索策略。通过在算法中调整参数 α 和 β,可以灵活地控制信息素浓度和启发式信息对蚂蚁行为的影响,从而适应不同类型的优化问题。

更新信息素


– 信息素更新公式:

                                       \tau_{ij}(t+1)=(1-\rho)\cdot\tau_{ij}(t)+\Delta\tau_{ij}(t)

其中,\tau_{ij}(t)是时刻 t 在路径 i 到 j 上的信息素浓度, ρ 是信息素蒸发率,\Delta\tau_{ij}(t)是此时刻该路径上的信息素增量。

迭代过程

这个构建解决方案和更新信息素的过程会不断重复。每一次迭代,蚂蚁都会根据当前的信息素分布来做出决策,而信息素分布则是根据之前蚂蚁的经验不断更新的。

寻找最优解

经过多次迭代后,信息素浓度会在更优路径上积累,导致更多的蚂蚁选择这些路径。这个过程逐渐引导蚂蚁群体向最优解聚集。算法通常会在达到预定的迭代次数、找到满足特定质量的解决方案,或者在一定时间内没有显著改进后终止。

算法实例

这里演示使用蚁群优化算法解函数f(x,y)=x^2+y^2

1. 定义搜索空间:
– 假设 x 和 y 在 [−5,5] 的区间内。
2. 初始化:
– 放置2只蚂蚁:
– 蚂蚁1: x_1=-3,y_1=2
– 蚂蚁2: x_2=1,y_2=-1
– 初始化信息素浓度为一致值, 比如 1 。
3. 计算启发式信息:
– 对于蚂蚁 1,\eta_{-3,2}=1/f(-3,2)=1/(9+4)=1/13\approx0.0769
– 对于蚂蚁 2,\eta_{1,-1}=1/f(1,-1)=1/(1+1)=1/2=0.5 。

4. 选择下一步:
– 假设蚂蚁可以移动到相邻的整数坐标。为了简化,我们考虑蚂蚁1只有两个选项:移动到 (−4,2) 或 (−2,2) 。
– 假设 α=1 和 β=1 ,计算这两个选项的概率:
– 对于 (−4,2):


– 对于 (−2,2):


– 总概率 =0.05+0.125=0.175 。
– 因此,概率分别为 0.05/0.175≈0.286 和 0.125/0.175≈0.714 。
5. 移动蚂蚁:
– 假设蚂蚁1 随机选择了 (−2,2) (因为这个选项的概率更高)。蚂蚁2同样也进行选择。假设蚂蚁 2 选择移动到 (2,−1) 。

6. 计算新位置的函数值:
– 蚂蚁1在新位置的函数值:f(-2,2)=(-2)^2+2^2=8 。
– 蚂蚁2在新位置的函数值: f(2,-1)=2^2+(-1)^2=5 。
7. 更新信息素:
– 假设信息素蒸发率 ρ=0.1 。
– 新信息素浓度更新。例如,对于蚂蚁1经过的路径,更新为:
– 


– 对蚂蚁 2 经过的路径进行类似的更新。
8. 重复过程:
– 如果需要,重复上述步骤,直到满足终止条件。
9. 输出最优解:
– 根据所有蚂蚁经过的路径和它们的函数值,选择最佳解。在这个例子中,蚂蚁 2 找到的位置 (2,−1) 有最小的函数值 5 。

10. 请注意,这个例子是一个简化的版本,实际应用中,ACO算法会涉及更多蚂蚁、更复杂的移动策略和信息素更新机制。这个例子旨在展示ACO的基本原理和计算步骤。在实际应用中,这个算法通常需要通过多次迭代来逐步改进解决方案。另外参数的设置也很重要,例如:
– 参数调整: α,β,ρ 的值会影响算法性能,需要根据具体问题调整。
– 信息素初始化:不宜过高,以避免早熟收敛。
– 停止条件:设置合理的迭代次数或解的质量阈值。

代码示例

为了实现上述例子的模拟,我们将使用Python语言。下面是蚁群算法的基本步骤:

  1. 放置蚂蚁:在蚁巢处放置一定数量的蚂蚁。
  2. 移动蚂蚁:蚂蚁根据信息素和启发式信息选择路径。
  3. 更新信息素:蚂蚁在走过的路径上留下信息素。
  4. 重复过程:重复上述步骤直到找到一个较优的路径。

让我们开始编写代码。

import numpy as np
import randomdef f(x, y):return x**2 + y**2# 定义搜索空间
x_range = (-5, 5)
y_range = (-5, 5)# 初始化参数
n_ants = 2  # 蚂蚁数量
alpha = 1  # 信息素重要程度的参数
beta = 1   # 启发式信息的参数
rho = 0.1  # 信息素蒸发率
iterations = 1  # 迭代次数# 初始化蚂蚁位置
positions = [(random.uniform(*x_range), random.uniform(*y_range)) for _ in range(n_ants)]# 初始化信息素浓度
pheromone = np.ones((11, 11))  # 信息素矩阵,考虑了-5到5的整数坐标# 进行迭代
for iteration in range(iterations):new_positions = []for x, y in positions:# 计算周围点的概率probabilities = []for dx in [-1, 0, 1]:for dy in [-1, 0, 1]:new_x, new_y = x + dx, y + dyif new_x >= x_range[0] and new_x <= x_range[1] and new_y >= y_range[0] and new_y <= y_range[1]:tau = pheromone[int(new_x - x_range[0])][int(new_y - y_range[0])]eta = 1 / f(new_x, new_y) if f(new_x, new_y) != 0 else 1p = (tau ** alpha) * (eta ** beta)probabilities.append((p, (new_x, new_y)))# 选择新位置total_p = sum([p[0] for p in probabilities])probabilities = [(p[0]/total_p, p[1]) for p in probabilities]new_position = random.choices([p[1] for p in probabilities], weights=[p[0] for p in probabilities], k=1)[0]new_positions.append(new_position)# 更新信息素pheromone[int(x - x_range[0])][int(y - y_range[0])] *= (1 - rho)pheromone[int(x - x_range[0])][int(y - y_range[0])] += 1 / f(*new_position)positions = new_positions# 找到并输出最优解
best_position = min(positions, key=lambda pos: f(*pos))
best_value = f(*best_position)best_position, best_value

可视化蚁群算法的效果如下:

图片[1]-蚁群优化算法(Ant Colony Optimization Algorithm)-VenusAI

现在我们已经成功地可视化了蚁群算法找到的最短路径。在两个子图中,您可以看到蚁群优化算法的初始状态(左图)和训练完成后的状态(右图),以及它们相对于函数表面的位置。这个可视化展示了蚂蚁是如何从初始位置移动到新位置的,并且可以看到它们在函数表面上的相对高度变化。

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

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

相关文章

免疫检查点信号转导和癌症免疫治疗(文献)

目录 基础 介绍 免疫检查点的表面调控&#xff08;细胞膜层面&#xff09; ​编辑 PD-1调节 PD-L1调节 CTLA-4 调节 检查点信号通路 关于靶点研究 展望 Immune checkpoint signaling and cancer immunotherapy - PubMed (nih.gov) 基础 【中英字幕】肿瘤免疫疗法之免…

分享10个免费高可用的GPT3.5和4.0网站并做功能测试【第一个】

1.介绍 网址&#xff1a;直接点&#xff1a;aicnn 或者 www.aicnn.cn 基于ChatGPT可以实现智能聊天、绘画生成、高清文本转语音、论文润色等多种功能&#xff0c;基于sd和mj实现的绘画功能&#xff0c;下面是功能测试&#xff1a; 博主从 1.GPT3.5是否完全免费/是否限制频率、…

MySQL学习笔记------事务

事务 事务是一组操作的集合&#xff0c;他是一个不可分割的单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败 事务操作 create table account(id int comment ID,name varchar(10) …

Spring 中类似 aBbb 单字母单词序列化与反序列问题

文章目录 前言代码准备问题排查lombok自定义生成 get、set 结合源码解析使用 lombok使用 lombok 自定义生成 user 对象 get、set 方法 如何解决使用注解 JsonProperty("aTest")自定义实现符合 Spring 规范的 get set 方法 个人简介 前言 最近在使用 spring boot mvc…

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序&#xff0c;得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时&#xff0c;假如在windows&#xff0c;当软件崩溃时&#xff0c;…

C++11右值引用

传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 左值与左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针)&…

C++面试经典问题

常见问题&#xff1a;智能指针、多态、虚函数、STL原理、链表、排序、二叉树、设计模式、线程进程、内存 对象所有权 在接触智能指针之前首先要理解对象的所有权是什么&#xff0c;在这之前我们总是用new和delete来进行内存的申请与释放&#xff0c;在这种堆内存分配的方式中…

springboot国际化多语言

1,新建国际化多语言文件 在resources目录下新建 messages.properties 其他语言的文件 编辑messages.properties文件,下方从text切换到Resource Bundle ,即可对照着编辑多语言文件 (如果没有找到Resource Bundle,先在settings->plugins中安装Resource Bundle Editor) 2,配…

Lumos学习王佩丰Excel第二讲:单元格格式设置

今天学会GIF录制了&#xff0c;分享知识会更简便一些&#xff0c;话不多说&#xff0c;开始吧~ 一、美化表格 1、设置单元格格式的路径 从菜单栏进入&#xff1a; 选中区域&#xff08;单元格&#xff09;- 右键“设置单元格格式”&#xff1a; 2、合并单元格 合并一行 批量…

5.3 用栈翻转数组,动态规划求斐波那契数列

5.3 用栈翻转数组&#xff0c;动态规划求斐波那契数列 1. 用栈翻转数组 assume cs:code,ds:data,ss:stack data segmentarr dw 1111h,2222h,3333h,4444h,5555h,6666h,7777h,8888hres db 800 dup(0) data endsstack segmentdb 100 dup(0) stack endscode segmentstart:mov ax,…

YOLOv8模型剪枝实战:Network Slimming网络瘦身方法

课程链接&#xff1a;YOLOv8模型剪枝实战&#xff1a;Network Slimming网络瘦身方法_在线视频教程-CSDN程序员研修院 YOLOv8是一个当前非常流行的目标检测器&#xff0c;本课程使用Network Slimming&#xff08;网络瘦身&#xff09;剪枝方法对YOLOv8进行模型剪枝&#xff0c;…

力扣347. 前 K 个高频元素

思路&#xff1a;记录元素出现的次数用map&#xff1b; 要维护前k个元素&#xff0c;不至于把所有元素都排序再取前k个&#xff0c;而是新建一个堆&#xff0c;用小根堆存放前k个最大的数。 为什么是小根堆&#xff1f;因为堆每次出数据时只出堆顶&#xff0c;每次把当前最小的…

手动实现Tomcat底层机制+自己设计Servlet

文章目录 1.Tomcat整体架构分析自己理解 2.第一阶段1.实现功能2.代码1.TomcatV1.java 3.调试阶段1.阻塞在readLine导致无法返回结果 4.结果演示 3.第二阶段1.实现功能2.代码1.RequestHander.java2.TomcatV2.java 3.调试阶段1.发现每次按回车会接受到两次请求 4.结果演示 4.第三…

[dvwa] Command Injection

命令注入 0x01 low 没有过滤&#xff0c;直接利用 127.0.0.1 && ip a 函数 php_uname(mode) 动态地检查服务器的操作系统 ‘s’&#xff1a;操作系统名称 ‘n’&#xff1a;网络主机名 ‘r’&#xff1a;操作系统发行版本号 ‘v’&#xff1a;操作系统版本 ‘m’&…

书籍《笔记的方法》读后感

读完《笔记的方法》有几周的时间&#xff0c;书里有些记录的内容&#xff0c;觉得非常有价值的&#xff0c;自己的观点&#xff0c;当下读书&#xff0c;其实并没有那么高大尚&#xff0c;就是存粹陶冶下情操&#xff0c;读书还是有一定作用的&#xff0c;毕竟看书只能慢慢来&a…

淘宝API接口详解:如何高效利用API进行电商开发

淘宝API接口详解&#xff1a;如何高效利用API进行电商开发 请求示例&#xff0c;API接口接入Anzexi58 在电商行业蓬勃发展的今天&#xff0c;淘宝作为国内最大的电商平台之一&#xff0c;为商家和开发者提供了丰富的API接口。这些接口使得电商开发变得更加高效和便捷。本文将详…

【算法篇】三道题理解算法思想——认识BFS

BFS&#xff08;宽搜&#xff09; 宽度优先遍历和深度优先遍历组成了大家熟悉的搜索算法&#xff0c;这两种算法也是蓝桥杯之类竞赛题的常考思想&#xff0c;正巧马上蓝桥杯临近&#xff0c;博主也是刷了很多BFS相关的题型&#xff0c;在这篇文章中会从力扣上选取三道简单的宽搜…

一键无痕清理:高效删除Mac文件夹,释放宝贵存储空间

在当今重视隐私的时代&#xff0c;当转让或出借Mac电脑时&#xff0c;确保个人文件和敏感信息彻底清除至关重要。常规删除Mac上的文件和文件夹仅使数据看似消失&#xff0c;实际上它们仍驻留在硬盘上&#xff0c;存在被数据恢复软件找回的风险。为实现不可逆的删除效果&#xf…

【Linux】指令

1. 简单指令 whoami 显示当前登入账号名 ls /home 现在有的用户名 adduser 用户名 新加用户&#xff08;必须在root目录下&#xff09; passwd 用户名 给这个用户设置密码 userdel -r 用户名 删除这个用户 pwd 显示当前所处路径 stat 文件名 / 文件夹名 显示文件状…

五分钟快速搭建五金行业小程序商城教程解析

作为五金行业的从业者&#xff0c;你可能想要拓展线上业务&#xff0c;提供更方便快捷的购物体验给顾客。而小程序商城成为了一种非常受欢迎的方式。但是&#xff0c;你可能觉得不懂代码无法实现这样的小程序商城。现在&#xff0c;我将通过以下步骤&#xff0c;教你如何在五分…