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

news2025/1/23 13:10:09

注意:本文引用自专业人工智能社区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

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

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

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

相关文章

2024免费Mac电脑用户的系统清理和优化软件CleanMyMac

作为产品营销专家&#xff0c;对于各类产品的特性与优势有着深入的了解。CleanMyMac是一款针对Mac电脑用户的系统清理和优化软件&#xff0c;旨在帮助用户轻松管理、优化和保护Mac电脑。以下是关于CleanMyMac的详细介绍&#xff1a; CleanMyMac X2024全新版下载如下: https://…

React18从入门到实战

文章目录 一、React环境的搭建二、项目文件的介绍&#xff08;1&#xff09;package.json&#xff0c;他是项目存放依赖包的地方&#xff0c;里面包括了一些项目核心包及下载的其他插件包&#xff08;2&#xff09;src文件夹是项目源码目录&#xff0c;平时开发页面就在其中&am…

如何成为一名优秀的工程师下

身为工程师&#xff0c;理所当然要重视实践&#xff0c;自然科学不管发展到何时都离不开实验。 电子学本身就是 为了指导工程实践。所以不要谈空洞的理论。现在很多毕业生都面临这样的问题&#xff0c;总是谈一些空洞的理论&#xff0c;甚至错误的但还不以为然的理论。实践可以…

【软考】23种设计模式详解,记忆方式,并举例说明

23种设计模式详解&#xff0c;举例说明 一、创建型模式1.1、抽象工厂模式&#xff08;Abstract Factory&#xff09;1.1.1、简介1.1.2、意图与应用场景1.1.3、结构1.1.4、优缺点1.1.4、示例代码&#xff08;简化版&#xff09; 1.2、建造者模式&#xff08;Builder&#xff09;…

MySQL主从的介绍与应用

mysql主从 文章目录 mysql主从1. 主从简介1.1 主从作用1.2 主从形式 2. 主从复制原理3. 主从复制配置3.1 mysql安装&#xff08;两台主机安装一致&#xff0c;下面只演示一台主机操作&#xff09;3.2 mysql主从配置3.2.1 确保从数据库与主数据库里的数据一样3.2.2 在主数据库里…

34-4 CSRF漏洞 - CSRF跨站点请求伪造

一、漏洞定义 CSRF(跨站请求伪造)是一种客户端攻击,又称为“一键式攻击”。该漏洞利用了Web应用程序与受害用户之间的信任关系,通过滥用同源策略,使受害者在不知情的情况下代表攻击者执行操作。与XSS攻击不同,XSS利用用户对特定网站的信任,而CSRF则利用了网站对用户网页…

vscode教程

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

【SpringBoot3】SpringBoot入门

需求&#xff1a;使用 SpringBoot 开发一个web应用&#xff0c;浏览器发起请求 /hello后&#xff0c;给浏览器返回字符串 “hello world "。 步骤 ①. 创建Maven工程 ②. 导入spring-boot-stater-web起步依赖 <dependency> <groupId>org.springframework…

每天学习一个Linux命令之curl

每天学习一个Linux命令之curl 在Linux系统中&#xff0c;有很多有用的命令可以帮助我们与网络进行交互。一个非常常用的命令是curl&#xff0c;它是一个功能强大的工具&#xff0c;可用于发送、接收和处理各种网络请求。本文将详细介绍在Linux下使用curl命令的各种选项及其用法…

IntelliJ IDEA - Since Maven 3.8.1 http repositories are blocked

问题描述 新下载的 IDEA 在构建项目时&#xff0c;在下载引用的包时出现 “Since Maven 3.8.1 http repositories are blocked” 的问题。 原因分析 从 Maven 3.8.1 开始&#xff0c;不再支持 http 的包了。由于现在对网络安全的日益重视&#xff0c;都在向 https 转变&#…

虚拟M的改进

之前为了保留老习俗&#xff0c;虚拟M采用了和M调用一样的约定&#xff0c;这样的好处是习惯上保持一致&#xff0c;小伙伴提出现在是java了&#xff0c;还这样约定方法太啰嗦&#xff0c;确实是有点啰嗦&#xff0c;进行了改进。 改进为三个参数的&#xff0c;方法可以写在任…

SQLite 4.9的 OS 接口或“VFS”(十三)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite字节码引擎&#xff08;十二&#xff09; 下一篇:SQLite 4.9的虚拟表机制(十四) 1. 引言 本文介绍了 SQLite OS 可移植性层或“VFS” - 模块位于 SQLite 实现堆栈底部 提供跨操作系统的可移植性。 VFS是Virtual File…

政安晨:【Keras机器学习实践要点】(二十)—— 使用现代 MLP 模型进行图像分类

目录 简介 设置 准备数据 配置超参数 建立分类模型 定义实验 使用数据增强 将补丁提取作为一个图层来实施 将位置嵌入作为一个图层来实施 MLP 混频器模型 FNet 模式 gMLP 模式 实施 gMLP 模块 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐…

【Leetcode每日一题】 动态规划 - LCR 166. 珠宝的最高价值(难度⭐⭐)(52)

1. 题目解析 题目链接&#xff1a;LCR 166. 珠宝的最高价值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了 2.算法原理 想象一下&#xff0c;你正在玩一个寻宝游戏&#xff0c;游戏地图是一个二维网格&#xff0c;每个格子都藏有一…

神经网络中的超参数调整

背景 在深度神经网络学习和优化中&#xff0c;超参数调整一项必备技能&#xff0c;通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态&#xff0c;及时调整超参数以更科学地训练模型能够提高资源利用率。在本研究中使用了以下超参数&#x…

Golang 开发实战day08 - Multiple Return values

Golang 教程08 - Multiple Return values 1. Multiple return values 1.1 如何理解多个返回值&#xff1f; Go语言中的多返回值&#xff0c;就像你听了一首歌曲yellow&#xff0c;可以从歌曲里反馈出忧郁和害羞&#xff01;Goland的多个返回值就类似于如此&#xff0c;设定一…

vue实现验证码验证登录

先看效果&#xff1a; 代码如下&#xff1a; <template><div class"container"><div style"width: 400px; padding: 30px; background-color: white; border-radius: 5px;"><div style"text-align: center; font-size: 20px; m…

如何用Python编写简单的网络爬虫(页面代码简单分析过程)

一、什么是网络爬虫 在当今信息爆炸的时代&#xff0c;网络上蕴藏着大量宝贵的信息&#xff0c;如何高效地从中获取所需信息成为了一个重要课题。网络爬虫&#xff08;Web crawler&#xff09;作为一种自动化工具&#xff0c;可以帮助我们实现这一目标&#xff0c;用于数据分析…

Vscode连接WSL2当中的jupyter

主要解决办法参考自这篇博客 1. 在WSL当中安装jupyter 这个随便找一篇博客即可&#xff0c;比如这篇&#xff0c;也可以根据现有的环境参考其它博客内容 2. 使用jupyter创建一个虚拟环境 首先激活想要添加的虚拟环境后&#xff0c;输入命令安装库: pip install ipykernel …

免费全开源,功能强大的多连接数据库管理工具:DbGate

DbGate&#xff1a;您的全能数据库指挥中心&#xff0c;一站式免费开源解决方案&#xff0c;无缝连接并管理多款主流数据库&#xff0c;让复杂的数据世界变得轻松易控! - 精选真开源&#xff0c;释放新价值。 概览 DbGate 是跨平台的数据库管理器。支持 MySQL、PostgreSQL、SQ…