蚁群算法(ACO)解决旅行商(TSP)问题的python实现

TSP问题

旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D = [dij],其中dij表示城市i到城市j的距离,i, j = 1, 2 … n,则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。说明:
回路:从某个城市出发,最后回到这个城市。

蚁群算法

蚁群算法(Ant Colony Optimization, ACO)是一种基于蚂蚁觅食行为的模拟优化算法,由意大利学者Marco Dorigo于1990年代初期提出。它是一种用来寻找优化路径的概率型算法,广泛应用于解决各种组合优化问题,如旅行商问题(TSP)、车辆路径问题(VRP)等。

基本原理
蚁群算法的灵感来源于蚂蚁在寻找食物过程中的行为模式。蚂蚁在移动时会在路径上留下信息素,而其他蚂蚁会倾向于选择信息素较浓的路径,因此这种行为形成了一种正反馈机制。在这个过程中,最短的路径上的信息素浓度增长最快,最终导致更多的蚂蚁选择这条路径。

关键概念
信息素(Pheromone):蚂蚁在路径上留下的信息素是蚁群算法的核心。蚂蚁在选择路径时会考虑信息素的浓度,信息素浓度高的路径更有可能被选择。
启发式信息(Heuristic Information):反映问题本身特征的信息,如在TSP中,两城市间距离的倒数可以作为启发式信息。
信息素更新:路径上的信息素会随着时间而挥发,同时每次迭代后根据蚂蚁走过的路径更新信息素的浓度。

蚁群算法解决TSP问题原理

启发式信息(Heuristic Information):这通常是问题本身的某些先验知识,例如在TSP中,两个城市间的距离的倒数可以作为启发式信息。
信息素(Pheromone):蚁群算法中的关键部分,模拟蚂蚁在路径上留下的信息素,以指导后来的蚂蚁选择路径。
正反馈机制:蚂蚁倾向于选择含有较多信息素的路径,而这条路径上的蚂蚁越多,留下的信息素就越多,从而吸引更多蚂蚁。
随机性:蚂蚁在选择路径时还会有一定的随机性,以避免过早地陷入局部最优解。

过程

1 初始化:随机放置一定数量的蚂蚁在不同的城市上,并初始化信息素浓度。
2 构建解决方案:每只蚂蚁根据信息素浓度和启发式信息来选择下一个访问的城市,直到构建出一个完整的路径(即访问所有城市一次)。
3 更新信息素:根据蚂蚁走过的路径和所得的解(如总路径长度)来更新路径上的信息素浓度。一般来说,路径越短,更新的信息素越多。
4 迭代循环:重复构建解决方案和更新信息素的过程,直到达到预设的迭代次数或其他停止条件。
5 输出最优解:选择在迭代过程中找到的最短路径作为TSP问题的解。
蚁群算法在求解TSP问题时特别有效,因为它能够在大规模搜索空间中有效地找到近似最优解,同时具有很好的

代码实现

我们这里代码给出了自定义数据集和dantzig42 数据集的代码

import random
import math
import numpy as np
# 读取 .tsp 文件以获取元数据
def read_tsp_file(filename):metadata = {}with open(filename, 'r') as file:lines = file.readlines()for line in lines:if line.startswith("DIMENSION"):metadata["num_cities"] = int(line.split(":")[1])# 可以根据需要解析其他元数据return metadata# 读取距离矩阵文件 .d
def read_distance_matrix(filename, num_cities):with open(filename, 'r') as file:lines = file.readlines()# 解析距离矩阵distance_matrix = []for line in lines:row = [int(dist) for dist in line.strip().split()]distance_matrix.append(row)return distance_matrix# 计算路径长度
def calculate_path_length(path, distance_matrix):total_distance = 0for i in range(len(path) - 1):total_distance += distance_matrix[path[i]][path[i + 1]]total_distance += distance_matrix[path[-1]][path[0]]  # 回到起始城市return total_distance# 蚁群算法
def ant_colony_optimization(distance_matrix, num_ants, num_iterations, alpha, beta, rho):num_cities = len(distance_matrix)pheromone_matrix = [[1.0 for _ in range(num_cities)] for _ in range(num_cities)]best_path = Nonebest_distance = float('inf')for _ in range(num_iterations):for ant in range(num_ants):current_city = random.randint(0, num_cities - 1)unvisited_cities = set(range(num_cities))unvisited_cities.remove(current_city)path = [current_city]while unvisited_cities:probabilities = []total_prob = 0for city in unvisited_cities:pheromone = pheromone_matrix[current_city][city]distance = distance_matrix[current_city][city]prob = (pheromone ** alpha) * ((1 / distance) ** beta)probabilities.append((city, prob))total_prob += prob# 选择下一个城市chosen_city = Noneif total_prob > 0:prob_values = [prob / total_prob for _, prob in probabilities]chosen_city = random.choices([city for city, _ in probabilities],prob_values)[0]else:chosen_city = random.choice(list(unvisited_cities))path.append(chosen_city)unvisited_cities.remove(chosen_city)current_city = chosen_city# 计算路径长度path_length = calculate_path_length(path, distance_matrix)# 更新最佳路径if path_length < best_distance:best_distance = path_lengthbest_path = path# 更新信息素for i in range(len(path) - 1):pheromone_matrix[path[i]][path[i + 1]] = (1 - rho) * pheromone_matrix[path[i]][path[i + 1]] + rhopheromone_matrix[path[i + 1]][path[i]] = (1 - rho) * pheromone_matrix[path[i + 1]][path[i]] + rhoreturn best_path, best_distance# 主程序
if __name__ == "__main__":num_ants = 20num_iterations = 100alpha = 1.0beta = 3.0rho = 0.5#tsp_metadata = read_tsp_file("dantzig42.tsp")#distance_matrix = read_distance_matrix("dantzig42_d.txt", tsp_metadata["num_cities"])distance_matrix = np.array([[0, 10, 20, 15, 30],   # 城市0到其他城市的距离[10, 0, 25, 20, 35],   # 城市1到其他城市的距离[20, 25, 0, 12, 28],   # 城市2到其他城市的距离[15, 20, 12, 0, 22],   # 城市3到其他城市的距离[30, 35, 28, 22, 0]    # 城市4到其他城市的距离])best_path, best_distance = ant_colony_optimization(distance_matrix, num_ants, num_iterations, alpha, beta, rho)print("最短路径:", best_path)print("最短距离:", best_distance)

结果展示

在这里插入图片描述

总结

蚁群算法在组合优化问题中表现出色,尤其是在动态变化的问题环境中。它已被应用于各种实际问题,如物流配送、网络路由优化、图像处理等领域。
优势与局限性
优势:蚁群算法具有强大的全局搜索能力,能够在大规模搜索空间中有效找到解决方案;同时具备良好的并行性和适应性。
局限性:蚁群算法可能需要较多的迭代次数才能收敛,且有可能陷入局部最优解。此外,算法参数的设置对结果影响较大,需要根据具体问题仔细调整。

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

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

相关文章

【kafka】记录用-----------1

主题&#xff08;topic&#xff09;&#xff1a;消息的第一次分类 根据人为的划分条件将消息分成不同的主题 主题的划分是人为的根据不同的任务情景去划分 比如&#xff0c;我们有两个主题&#xff0c;一个是"订单"&#xff0c;另一个是"库存"。每个主题代…

强化学习应用(二):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

【JAVA】谈谈 ReadWriteLock 和 StampedLock

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 ReadWriteLock&#xff08;读写锁&#xff09; 基本原理&#xff1a; 接口和实现&#xff1a; 用法示例&#xff1a; StampedL…

Camunda Cluster

Rest API&#xff1a;无状态&#xff0c;根据权重路由。控制台API&#xff1a;webapp 登录有状态&#xff0c;根据IP路由。 nginx.conf upstream rest_proxy {server localhost:8080 weight1;server localhost:8081 weight1;server localhost:8082 weight1; }upstream webapp…

《2024 年 Web3.0 数字资产趋势报告》(二)

撰文&#xff1a;方军、周芳鸽、李祺虹、张睿彬&#xff0c;Uweb 编辑&#xff1a;Nona&#xff0c;Techub News 点击关注公众号获取完整报告 接下来我们将继续和大家分享《2024 年 Web3.0 数字资产趋势报告》中其余部分。

PyCharm连接服务器(利用PyCharm实现远程开发)

利用PyCharm实现远程开发 注&#xff1a;该功能只有在PyCharm专业版下才可以使用&#xff0c;并且必须是官方的正版许可&#xff0c;破解版的是不可以使用的&#xff01;&#xff01;&#xff01;可以通过免费教育许可申请使用权限&#xff08;申请流程&#xff09;。 pycharm…

在Java中正确使用Optional

Optional类是在Java 8中引入的&#xff0c;用于解决NullPointerException的问题。 java.util.Optional类是一个泛型类型的类&#xff0c;只包含一个类型为T的值。其目的是提供对可能为null的类型T的引用对象的更安全的替代方案。但是&#xff0c;只有在正确使用的情况下&#…

HarmonyOS开发FA应用模型下多个页面的声明方式

目录 方式1 方式2 HarmonyOS配套的IDE是DevEco Studio&#xff0c;目前的版本是3.1。官网可以直接下载 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 ​ 方式1 ​在DevEco Studio如果是在pages目录通过右键New->ArkTS File生成的文件&#xff0c;需要注意&…

鸿蒙原生应用再添新丁!天眼查 入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;天眼查 入局鸿蒙 来自 HarmonyOS 微博1月12日消息&#xff0c;#天眼查启动鸿蒙原生应用开发#作为累计用户数超6亿的头部商业信息查询平台&#xff0c;天眼查可以为商家企业&#xff0c;职场人士以及普通消费者等用户便捷和安全地提供查询海量…

ubuntu安装mysql(tar.xz)

1&#xff1a;下载地址 MySQL &#xff1a;&#xff1a; 下载 MySQL 社区服务器 2&#xff1a;上传文件到服务器 3:解压 mkdir mysqlmv mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz /mysqlcd /mysqltar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar.xzmv /mysql/mysql-8.…

【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

行为型设计模式——状态模式

状态模式 状态模式是比较简单的设计模式&#xff0c;它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断&#xff08;俗称屎山&#xff09;。它将每个状态定义为一个类&#xff0c;而每个状态类有自己对应的方法&#xff0c;因此当需要根据状态执行逻辑代码…

开源Bluespec bsc编译器和可重用示例设计

这篇介绍Bluespec以及设计示例的文章&#xff0c;是在2021年ICCAD&#xff08;International Conference On Computer-Aided Design&#xff09;发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec&#xff0c;因此将此论文翻译成中文&#xff0c;…

app跳转小程序免登录

app跳转小程序二次登录&#xff1a; app跳转小程序&#xff0c;第一种做法是 点击 app 页面 --> 跳转到对应小程序的路径 --> 登录小程序 --> 使用功能。这种做法&#xff0c;在 app跳转小程序后&#xff0c;需要二次登录&#xff0c;用户体验不是很好。 app跳转小…

【JVM】垃圾回收 GC

一、前言 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;是由 Java 虚拟机&#xff08;JVM&#xff09;垃圾回收器提供的一种对内存回收的一种机制&#xff0c;它一般会在内存空闲或者内存占用过高的时候对那些没有任何引用的对象不定时地进行回收。以避免…

C#进阶-IIS服务器发布ASP.NET项目

对于云服务器&#xff0c;程序员一般不会陌生&#xff0c;如果项目需要发布到现网&#xff0c;那么服务器是必不可缺的一项硬性条件&#xff0c;那么如何在云服务器上部署一个项目&#xff0c;需要做哪些配置准备&#xff0c;下面就由本文档为大家讲解&#xff0c;本篇以 IIS服…

封装数据访问通用类DbHelper

为什么要封装通用类&#xff1f; 数据交互&#xff1a;增上改查 相同的事情&#xff1a;连接 T-SQL命令&#xff0c;Command 执行命令&#xff0c;选择执行方式 得到相应结果 关闭连接 将一些从重复的逻辑进行封装&#xff0c;达到通用的目的 提高复用率…

[redis] redis高可用之持久化

一、Redis 高可用的相关知识 1.1 什么是高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;…

Sip - Ubuntu 配置 miniSIPServer 服务器(测试用)

客户提供的账号过期了&#xff0c;简单搭建 SIP 服务器&#xff0c;以便测试使用。个人认为这个配置起来最为简单&#xff0c;且测试功能足够。 官网miniSIPServer - 基于 Windows 以及 Linux 平台的 VoIP (SIP) 服务器软件. miniSIPServer 可能是最容易使用的 VoIP(SIP) 服务器…

android studio设置gradle和gradle JDK版本

文章目录 1.gradle JDK版本2.gradle版本 1.gradle JDK版本 file -> project structure -> SDK Location -> Gradle Settings -> Gradle JDK -> Download JDK 2.gradle版本 file -> project structure -> Project