蚁群优化算法(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 random

def 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 + dy
                if 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 1
                    p = (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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库的基本操作

目录 一、数据库的库操作 二、数据库的表操作 一、数据库的库操作 数据库的创建 create database (if not exists) 库名 这里的if not exists 是一个判断用的&#xff0c;如果数据库存在&#xff0c;就不执行语句&#xff0c;如果数据库不存在&#xff0c;则执行该语句。 创建…

Python实现【坦克大战】+源码分享

写在前面&#xff1a; 坦克大战&#xff0c;这款经典的电子游戏&#xff0c;无疑是许多80后和90后心中不可磨灭的童年记忆。它不仅仅是一款游戏&#xff0c;更是那个时代科技娱乐方式的缩影&#xff0c;见证了电子游戏行业的起步与发展。 在那个电脑和网络尚未完全普及的年代…

日志系统:一条SQL更新语句是如何执行的?

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又是…

鸿蒙实战开发-通过输入法框架实现自绘编辑框

介绍 本示例通过输入法框架实现自会编辑框&#xff0c;可以绑定输入法应用&#xff0c;从输入法应用输入内容&#xff0c;显示和隐藏输入法。 效果预览 使用说明 1.点击编辑框可以绑定并拉起输入法&#xff0c;可以从输入法键盘输入内容到编辑框。 2.可以点击attach/dettac…

java汽车租赁超时罚款系统springboot+vue-前后端分离-e36ht

本文所设计的汽车租赁系统的设计与实现拥有前端和后端&#xff0c;前端使用Vue.js框架和创建&#xff0c;后端使用Springboot框架创建&#xff0c;开发语言采用Java&#xff0c;使用Mysql数据库对后台数据进行存储。将IDEA作为主要的开发工具。接着进行系统的需求分析、功能设计…

AFCI 应用笔记三、使用 mlflow 管理模型

1. 简介 由于 AI 神经网络涉及多种参数&#xff0c;需要频繁修改各种超参数&#xff0c;比如&#xff1a;learning rate&#xff0c;batchsize&#xff0c;filter numbers&#xff0c;alpha 等等&#xff0c;每个参数都有可能影响到模型最终的准确率&#xff0c;所以比较这些参…

JavaSE继承和多态(上)

目录 一.继承的基本使用 1.继承的概念 2.继承的语法 3.父类成员访问 &#xff08;1&#xff09;子类中访问父类的成员变量 1.子类和父类不存在同名成员变量 2.子类和父类成员变量同名 (2)子类中访问父类的成员方法 1.成员方法名字不同 2.成员方法名字相同 二.super关键…

Java基础 - 10 - File、IO流(一)

File&#xff1a;代表文本 IO流&#xff1a;读写数据 一. File File是java.io.包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以是文件或文件夹&#xff09; 注意&#xff1a;File类只能对文件本身进行操作&#xff0c;不能读写文件里…

【Java+Springboot】------ 通过JDBC+GetMapping方法进行数据select查询、多种方式传参、最简单的基本示例!

一、JDBC如何使用、PostGresql数据库 1、在pom.xml 先引用jdbc组件。 <!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> 2、在pom.xml 再引用p…

【GIS前言技术】今年全球唯一一次日全食要来了!

今年全球唯一一次日全食将于北京时间4月9日凌晨上演&#xff0c;全食带扫过北美洲&#xff0c;墨西哥、美国和加拿大的众多城市都能看到这次日全食&#xff0c;发生时间为当地时间4月8日中午到下午&#xff0c;观赏性比较强。 日全食&#xff08;Eclipse&#xff09;是日食的一…

Linux进程状态深度解析:探索进程的生命周期

文章目录 一、引言1、进程的概念与重要性2、Linux系统下进程状态的意义3、进程状态与系统性能的关系 二、Linux下进程状态概述1、Linux进程状态的分类2、进程状态信息的获取方法 三、Linux下进程状态详解1、运行状态&#xff08;Running&#xff09;2、可中断睡眠状态&#xff…

算法打卡day33|动态规划篇01|动态规划理论基础| Leetcode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 动态规划理论 定义 动态规划的解题步骤 算法题 Leetcode 509. 斐波那契数 个人思路 解法 动态规划 Leetcode 70. 爬楼梯 个人思路 解法 动态规划 Leetcode 746. 使用最小花费爬楼梯 个人思路 解法 动态规划 动态规划理论 定义 动态规划(Dynamic Programmi…

yarn集群部署

yarn集群部署案例 我们来基于一个案例讲解yarn集群部署 我们要部署yarn集群&#xff0c;需要分别部署HDFS文件系统及YARN集群 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助 同…

乐健体育刷分----AI运动的站姿风车

一.前情提要 1.本文仅作学习参考不得用于其他不当途径&#xff0c;若有问题后果自负 二.操作 1.打开乐健体育 2.点击AI运动&#xff0c;找到站姿风车 3.摄像头对准以下图片&#xff0c;拖动图片或保持不动均可 &#xff08;站姿风车2组及以上效果更佳&#xff09;

在实体类中使用JSONObject对象

有时候我们的业务需求可能字段是json格式&#xff0c;这个时候我们的实体类就对应的也应该是json格式&#xff0c;需要使用到JSONObject这个对象&#xff0c;但是可能会使用不了这个对象&#xff0c;那接下来我将简单介绍如何使用这个对象。 以下为我的实体类中的某个字段&…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

ruoyi-vue-pro 前端vue js直接import导入本地文件使用方法

我的xml文件名称叫w2101.xml 第一步&#xff0c;删除所有依赖&#xff0c;否则配置以后就会启动报错&#xff1a; 第二步配置对应的文件格式&#xff0c;我当前使用的是xml文件 config.module.rule(xml).test(/\.xml$/).use(xml-loader).loader(xml-loader).end();第三步…

3D桌面端可视化引擎HOOPS Visualize如何实现3D应用快速开发?

HOOPS Visualize是一个开发平台&#xff0c;可实现高性能、跨平台3D工程应用程序的快速开发。一些主要功能包括&#xff1a; 高性能、以工程为中心的可视化&#xff0c;使用高度优化的OpenGL或DirectX驱动程序来充分利用可用的图形硬件线程安全的C和C#接口&#xff0c;内部利用…

计算机毕业设计选题之基于SSM的旅游管理系统【源码+PPT+文档+包运行成功+部署讲解】

&#x1f493;项目咨询获取源码联系v&#x1f493;xiaowan1860&#x1f493; &#x1f6a9;如何选题&#xff1f;&#x1f351; 对于项目设计中如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;有疑问不清晰的可…

企业如何选择合适自己的ERP系统?ERP系统应该具有哪些功能和特点?

企业如何选择合适自己的ERP系统&#xff1f;ERP系统应该具有哪些功能和特点&#xff1f; ERP作为一款功能如此众多、对企业如此重要的系统&#xff0c;可能会开源免费吗&#xff1f; 如果有这样一款功能全面又完全开源的ERP&#xff0c;早就爆火了&#xff0c;市面上可能还出…