蚁群算法(ACO算法)求解实例---旅行商问题 (TSP)

news2024/11/13 18:13:11

目录

  • 一、采用ACO求解 TSP
  • 二、 旅行商问题
    • 2.1 实际例子:求解 6 个城市的 TSP
    • 2.2 ==**求解该问题的代码,代码(完整代码关注底部微信公众号获取)**==
    • 2.3 代码运行过程截屏
    • 2.4 代码运行结果截屏(后续和其他算法进行对比)
  • 三、 ==如何修改代码?==
    • 3.1 减少城市坐标,如下:
    • 3.2 增加城市坐标,如下:
  • 四、 蚁群算法 (Ant Colony Optimization, ACO) 原理
    • 4.1 ACO算法定义
    • 4.2 ACO算法的基本思想
    • 4.3 ACO算法的工作原理
    • 4.4 ACO算法的参数
    • 4.5 ACO算法的优缺点
      • 4.5.1 优点
      • 4.5.2 缺点
    • 4.6 ACO算法的应用场景

一、采用ACO求解 TSP

完整代码关注博客底部微信公众号获得!

求解代码在文中,后续会出其他算法求解TSP问题,你们参加数学建模竞赛只需要会改代码即可。

用来对比此专栏的
遗传算法(GA算法)求解实例—旅行商问题 (TSP)
粒子群算法(PSO算法)求解实例—旅行商问题 (TSP)
模拟退火算法(SA算法)求解实例—旅行商问题 (TSP)
注意每次运行SA算法得到的结果可能不太一样。

我知道大家对原理性的东西不感兴趣,我把原理性的东西放在后面,大家如果需要写数模论文可以拿去,但是记得需要改一改,要不然查重过不去。

二、 旅行商问题

2.1 实际例子:求解 6 个城市的 TSP

假设有 6 个城市,其坐标如下:

城市X 坐标Y 坐标
01020
13040
22010
34030
41010
55020

目标是找到一个经过所有城市且总距离最短的路径。

2.2 求解该问题的代码,代码(完整代码关注底部微信公众号获取)

import numpy as np
import random

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30],
    [10, 10],
    [50, 20]
])


# 计算两城市之间的欧几里得距离
def calculate_distance(city1, city2):
    return np.sqrt(np.sum((city1 - city2) ** 2))







# 运行蚁群算法
best_path, best_distance = ant_colony_optimization(cities)
print("Best path:", best_path)
print("Best distance:", best_distance)

2.3 代码运行过程截屏

在这里插入图片描述

2.4 代码运行结果截屏(后续和其他算法进行对比)

在这里插入图片描述

三、 如何修改代码?

这一部分是重中之重,大家参加数学建模肯定是想跑出自己的结果,所以大家只需要把自己遇到的数学问题,抽象成TSP问题,然后修改代码的城市坐标,然后运行即可。

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30],
    [10, 10],
    [50, 20]
])

3.1 减少城市坐标,如下:

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30]
])

3.2 增加城市坐标,如下:

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30],
    [30, 40],
    [20, 10],
    [10, 10],
    [50, 20]
])

四、 蚁群算法 (Ant Colony Optimization, ACO) 原理

4.1 ACO算法定义

蚁群算法 (Ant Colony Optimization, ACO) 是一种基于群体智能的优化算法,由 Marco Dorigo 于 1992 年提出。蚁群算法模拟了自然界中蚂蚁群体寻找最短路径的行为,利用蚂蚁在行走过程中留下的信息素来引导后续蚂蚁选择路径。通过不断迭代和信息素更新,算法逐渐找到问题的最优解或近似最优解。ACO 主要用于求解组合优化问题,如旅行商问题 (TSP)、背包问题、车辆路径问题等。

4.2 ACO算法的基本思想

蚁群算法的核心思想是利用信息素 (Pheromone) 的正反馈机制来逐步优化解。蚂蚁在行走过程中会释放信息素,信息素的浓度与路径的质量(通常是路径的长度或花费的时间)有关。路径越短,信息素越浓,后续蚂蚁选择该路径的概率就越高。这种机制可以通过多次迭代不断强化优质路径,逐渐逼近最优解。

4.3 ACO算法的工作原理

  1. 初始化

    • 在图的每条边上初始化一个较小的信息素值,表示蚂蚁可以选择的路径。
    • 设置蚂蚁数量、最大迭代次数、信息素挥发系数、信息素重要性因子 α 和启发信息重要性因子 β 等参数。
  2. 蚂蚁构建解

    • 每只蚂蚁从随机选择的起始节点出发,按照一定的概率规则选择下一个节点(城市)。
    • 选择下一个节点的概率 P_{ij} 由信息素浓度和启发信息共同决定:
      P i j = ( τ i j ) α ⋅ ( η i j ) β ∑ k ∈ allowed ( τ i k ) α ⋅ ( η i k ) β P_{ij} = \frac{(\tau_{ij})^\alpha \cdot (\eta_{ij})^\beta}{\sum_{k \in \text{allowed}} (\tau_{ik})^\alpha \cdot (\eta_{ik})^\beta} Pij=kallowed(τik)α(ηik)β(τij)α(ηij)β
      其中:
      • τ i j \tau_{ij} τij 是节点 i i i j j j 之间的信息素浓度
      • η i j = 1 d i j \eta_{ij} = \frac{1}{d_{ij}} ηij=dij1是节点 i i i j j j 之间距离的倒数,表示启发信息(距离越短,选择的概率越大)。
      • α \alpha α β \beta β 分别是信息素和启发信息的重要性因子。
  3. 路径评估

    • 每只蚂蚁在构建完一条完整路径后,计算路径的总距离(或其他目标函数值)。
  4. 信息素更新

    • 信息素挥发:为了避免信息素无限积累,所有路径上的信息素会以一定比例挥发:
      τ i j ← ( 1 − ρ ) ⋅ τ i j \tau_{ij} \leftarrow (1 - \rho) \cdot \tau_{ij} τij(1ρ)τij
      其中,(\rho) 是信息素挥发系数,取值在 (0, 1) 之间。
    • 信息素增量:每只蚂蚁根据其找到的路径长度在路径上留下信息素:
      τ i j ← τ i j + ∑ 所有蚂蚁 Δ τ i j k \tau_{ij} \leftarrow \tau_{ij} + \sum_{\text{所有蚂蚁}} \Delta \tau_{ij}^{k} τijτij+所有蚂蚁Δτijk
      其中, Δ τ i j k = Q L k \Delta \tau_{ij}^{k} = \frac{Q}{L^{k}} Δτijk=LkQ L k L^{k} Lk 是蚂蚁 k k k 找到的路径长度, Q Q Q 是常数。
  5. 迭代和终止

    • 重复步骤 2-4,直到达到最大迭代次数或找到满意解。

4.4 ACO算法的参数

  • 蚂蚁数量:每次迭代中构建路径的蚂蚁数量,通常取值与问题规模相关。
  • 信息素重要性因子 (α):控制蚂蚁在路径选择时对信息素的依赖程度。α 越大,蚂蚁对已有路径的信息素依赖程度越高。
  • 启发信息重要性因子 (β):控制蚂蚁在路径选择时对启发信息(如距离的倒数)的依赖程度。β 越大,蚂蚁对距离的依赖程度越高。
  • 信息素挥发系数 (ρ):控制信息素的挥发速率。较大的挥发率会使得历史信息素影响较小,有助于探索新路径。
  • 常数 (Q):用于控制信息素增量的规模,通常根据问题的特点进行设置。

4.5 ACO算法的优缺点

4.5.1 优点

  • 强大的全局搜索能力:ACO 通过多只蚂蚁的并行搜索和信息素的正反馈机制,能够有效避免陷入局部最优解,具有较强的全局搜索能力。
  • 适应性强:算法能够动态调整信息素的分布,自适应地寻找问题的最优解,适用于各种组合优化问题。
  • 易于并行化:每只蚂蚁独立构建解,适合并行计算。

4.5.2 缺点

  • 收敛速度较慢:由于依赖于大量蚂蚁的并行搜索和信息素更新,ACO 的收敛速度相对较慢。
  • 参数敏感:ACO 对参数(如蚂蚁数量、信息素重要性、启发信息重要性等)较为敏感,需要进行调优以获得最佳效果。
  • 计算复杂度高:在大规模问题中,计算复杂度较高,尤其是在信息素更新阶段。

4.6 ACO算法的应用场景

  • 旅行商问题 (TSP):寻找经过所有城市的最短路径。
  • 车辆路径问题 (VRP):寻找最优的车辆调度路径。
  • 任务分配和调度:如生产调度、工作车间调度问题等。
  • 网络路由优化:在计算机网络中寻找最优的路由路径。
  • 图像处理:图像分割、边缘检测等。

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

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

相关文章

Acwing数据结构:单链表

单链表 主要思想:使用数组实现链表(而不用结构体,结构体代码更长,后续图论也是基于数组实现),即静态链表。因为动态链表使用new申请空间需要较多的时间,而算法要求的是以较少的时间完成任务。 单链表&…

软件测试八股文

Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自…

appimage 软件创建桌面快捷图标

1、appimage 软件创建桌面快捷图标 1)下载 AppImage 文件 首先,确保你已经下载了 AppImage 文件,并且该文件具有可执行权限。你可以通过以下命令为 AppImage 文件添加可执行权限: chmod x /path/to/your-app.AppImage2&#xff…

大模型入门 ch04:实现一个GPT模型

本文是github上的大模型教程LLMs-from-scratch的学习笔记,教程地址:教程链接 LLM大模型主要是参数量大,而不是代码量大。 这是本节的具体内容 首先实现一个GPT的骨架分别实现GPT骨架内的各个部分,包括LayerNorm,GELU,…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

docker操作的基本命令加容器的基本命令(仅供自己参考)

1、docker build:本地将一个docker文件打包成镜像 2、docker push:将自己打包的镜像传到镜像服务器上 3、docker pull:将镜像服务器上的镜像拉取到本地 4、docker images: 查看镜像服务器上的镜像 5、docker rmi:删…

编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)

相邻你找了很多博文,都没有办法。现在终于找到了正宗。 参考 GitHub - thecodemonkey86/qt_mysql_driver: Typical symptom: QMYSQL driver not loaded. Solution: get pre-built Qt SQL driver plug-in required to establish a connection to MySQL / MariaDB u…

伊犁云计算22-1 raid 5 linux 配置

1  添加四块sata 硬盘  2  设置启动项为原来scsi 的硬盘 3  四块盘都是  fd   li&…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境,读取一个配置文件,并把配置文件简单解析了一下。 前面读取配置文件,使用File.readFrom(),这个直接把文件全部读取出来,返回一个字节数组。然后又创建一个字节流,给文件…

Redis——持久化策略

Redis持久化 Redis的读写操作都是在内存上,所以Redis性能高。 但是当重启的时候,或者因为特殊情况导致Redis崩了,就可能导致数据的丢失。 所以Redis采取了持久化的机制,重启的时候利用之间持久化的文件实现数据的恢复。 Redis提…

python怎么打开编辑器

1、在电脑开始菜单中点击所有程序,找到Python程序,点击其中idle。 2、然后点击左上角的“File”,打开菜单,在下拉菜单中选择“New File”选项,就可打开python编辑器了。 3、在打开的python编辑器中就可以输入自己想写的…

Qwen大型语言模型系列的最新成果 ----Qwen2.5

通义千问2.5-7B-Instruct-GGUF 模型库 (modelscope.cn) apt install git-lfsgit lfs installgit clone https://www.modelscope.cn/qwen/Qwen2.5-7B-Instruct-GGUF.git

从源码到平台:食堂采购系统与供应链管理平台的开发详解

本篇文章,小编将从技术角度探讨如何基于源码开发一个食堂采购系统,并结合供应链管理平台的实现策略,帮助开发者与企业深入了解该系统的开发流程与关键要点。 一、食堂采购系统源码开发概述 食堂采购系统作为餐饮企业管理食材采购、库存以及…

综述论文“Towards Personalized Federated Learning”分享

综述论文“Towards Personalized Federated Learning”分享 文章目录 综述论文“Towards Personalized Federated Learning”分享I. 引言A. 联邦学习的分类B. 个性化联邦学习的动机C. 贡献 II. 个性化联邦学习的策略策略I:全局模型个性化策略II:学习个性…

无人机集群路径规划:麻雀搜索算法(Sparrow Search Algorithm, SSA)​求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化…

2024年中国研究生数学建模竞赛【华为杯】C题-数据驱动下磁性元件的磁芯损耗建模(代码+讲解+成品论文+答疑)

2024年中国研究生数学建模竞赛,即华为杯,研赛正式开赛了,本次比赛white学长团队选择了C题,各位小伙伴可以根据自己的擅长选择合适题目,比赛过程中请注意以下时间节点: 华为杯比赛时间节点 一、背景 随着国民…

大小端字节序 和 内存高低地址顺序

目录 1. 大小端字节序 1.1 什么是大小端字节序? 1.2 为什么有大小端字节序? 1.3 习题:用程序结果判断大端小端 2. 各种易混淆的高低地址顺序 2.1 监视窗口的地址表示【计算机标准展示方式】 2.2 横向地址表示 2.3 一个字节 与 多个字节 的地址…

在腾讯云申请https(我得是腾讯云服务器),通过宝塔设置https

参考 一键 HTTPS:https://cloud.tencent.com/document/product/400/58062 DNS 验证:https://cloud.tencent.com/document/product/400/54500?from_cn_redirect1 申请免费的证书 访问连接:https://console.cloud.tencent.com/ssl 点击页…

Python数据分析与可视化(Python绘图详解)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【更新】上市公司绿色专利申请及授权数据(2000-2023年)

一、数据介绍 数据名称:上市公司-绿色专利申请、授权数据 数据范围:A股上市公司 数据年份:2000-2023年 数据样本:61243条 数据来源:国家知识产权局 二、数据指标 年份股票代码股票简称行业名称行业代码省份城市区…