蚁群算法(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 = 0
    for 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 = None
    best_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 = 0

                for 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 = None
                if 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_length
                best_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]] + rho
                pheromone_matrix[path[i + 1]][path[i]] = (1 - rho) * pheromone_matrix[path[i + 1]][path[i]] + rho

    return best_path, best_distance

# 主程序
if __name__ == "__main__":
    num_ants = 20
    num_iterations = 100
    alpha = 1.0
    beta = 3.0
    rho = 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)

结果展示

在这里插入图片描述

总结

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

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

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

相关文章

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息&#xff0c;Salesforce从中小企业CRM服务的蓝海市场切入&#xff0c;但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等&#xff0c;蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

Unity中URP下实现深度贴花

文章目录 前言一、场景设置二、实现思路1、通过深度图求出像素所在视图空间的Z值2、通过模型面片的求出像素在观察空间下的坐标值3、结合两者求出 深度图中像素的 XYZ值4、再将此坐标转换到模型的本地空间&#xff0c;把XY作为UV来进行纹理采样 三、URP下实现1、通过深度图求出…

使用Sqoop将数据从Hadoop导出到关系型数据库

当将数据从Hadoop导出到关系型数据库时&#xff0c;Apache Sqoop是一个非常有用的工具。Sqoop可以轻松地将大数据存储中的数据导出到常见的关系型数据库&#xff0c;如MySQL、Oracle、SQL Server等。本文将深入介绍如何使用Sqoop进行数据导出&#xff0c;并提供详细的示例代码&…

Leetcode10035. 对角线最长的矩形的面积

Every day a Leetcode 题目来源&#xff1a;10035. 对角线最长的矩形的面积 解法1&#xff1a;模拟 给你一个下标从 0 开始的二维整数数组 dimensions。 对于所有下标 i&#xff08;0 < i < dimensions.length&#xff09;&#xff0c;dimensions[i][0] 表示矩形 i …

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

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

在线海报图片设计器、图片编辑器,仿照稿定设计

源码介绍 在线海报设计系统素材设计源码是一个漂亮且功能强大的在线海报图片设计器&#xff0c;仿照稿定设计而成。该系统适用于多种场景&#xff0c;包括海报图片生成、电商分享图、文章长图、视频/公众号封面等。用户无需下载软件&#xff0c;即可轻松实现创意&#xff0c;迅…

redis夯实之路-哨兵(Sentinel)机制详解

Sentinel&#xff08;哨兵&#xff09;保证了redis的高可用性&#xff0c;一个Sentinel或多个Sentinel组成的系统监视多个主从服务器&#xff0c;当主服务器下线时&#xff0c;自动将一个从服务器升级为主服务器。 sentinel的主要功能 集群监控&#xff1a;负责监控redis mas…

UG装配-多运动组合动画与自动创建装配路径

当圆盘在装配过程中既有旋转运动&#xff0c;又有直线运动的时候&#xff0c;我们需要用到序列中的抽取路径 抽取路径命令在如下位置&#xff0c;需要注意的是&#xff0c;使用抽取路径前&#xff0c;如果有其他零件与所取对象配合&#xff0c;需要先物体脱离或使用拆卸对其脱离…

基于Hadoop的网上购物行为大数据分析及预测系统【flask+echarts+机器学习】前后端交互

有需要本项目或者部署的系统可以私信博主&#xff0c;提供远程部署和讲解 本研究基于淘宝用户行为的开源数据展开大数据分析研究&#xff0c;通过Hadoop大数据分析平台对阿里天池公开的开源数据集进行多维度的用户行为分析&#xff0c;为电商销售提供可行性决策。 首先我们将大…

Java LeetCode刷题 单调栈

单调栈 单调栈概念 每日温度 单调栈 概念 单调栈&#xff08;Monotonic Stack&#xff09;是一个特殊的数据结构&#xff0c;它是一种栈&#xff0c;但具有单调性的特性。单调栈有两种类型&#xff1a;单调递增栈和单调递减栈。 在单调递增栈中&#xff0c;栈内的元素保持递…

【JAVA】谈谈 ReadWriteLock 和 StampedLock

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

UE5 简易MC教程学习心得

https://www.bilibili.com/video/BV12G411J7hV?p13&spm_id_frompageDriver&vd_sourceab35b4ab4f3968642ce6c3f773f85138 ———— 目录 0.摧毁逻辑学习 1.发光材质灯方块 2.封装。想让子类 不更改父类的变量。 3.材质命名习惯。 0.摧毁逻辑学习 达到摧毁的条件…

日志审计系统Agent项目创建——读取日志文件(Linux版本)

紧接着上一篇的分享&#xff0c;继续做日志文件的读取&#xff0c;点击连接即可日志文件初始化https://blog.csdn.net/wjl990316fddwjl/article/details/135553238 1、将指针移动到文件末尾 //文件移动到结尾fseek(fp, 0, SEEK_END); 2、定义当前指针的位置 lastPosition ft…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/OpenAPI 的使用…

专业130+总分400+杭州电子科技大学843信号与系统考研经验杭电信息通信

今年专业课130&#xff0c;数一130&#xff0c;初试总分400&#xff0c;顺利上岸杭电通信工程学院&#xff0c;回望这一年有得有失&#xff0c;总结了一些经验分享给大家&#xff0c;希望对大家复习有帮助。 我的初试备考从3月开始&#xff0c;持续到初试前&#xff0c;这中间…

x-cmd pkg | tsx - Node.js 的直接替代品

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 tsx 代表 “TypeScript execute”&#xff0c;由 TypeScript 编写&#xff0c;内部使用由 Go 语言编写的 esbuild 核心二进制实现超快的 TypeScript 编译&#xff0c;旨在增强 Node.js 以无缝运行 TypeScript / ESM /…

小学信息科技Python课程第2课:坐标与画笔

一、turtle画布与坐标系 在同一平面互相垂直且有公共原点的两条数轴构成平面直角坐标系。在坐标系中&#xff0c;水平方向的轴都称为x轴&#xff0c;垂直方向的轴都称为y轴 它们相交于O点&#xff0c;在这一个点里&#xff0c;x轴的值为0&#xff0c;y轴的值也为0&#xff0c;所…

业务向——基于淘宝联盟平台的CPS

业务向——基于淘宝联盟平台的CPS 导读小试牛刀签名商品活动订单获取及用户 导读 上篇文章我们分享了多多进宝平台&#xff0c;那么这篇文章想继续带来CPS业务的分享&#xff0c;这次玩转的平台是淘宝联盟。在对接的过程中&#xff0c;也是踩了一些坑&#xff0c;特别是对于订…

git修改历史(非最新)提交信息

二、修改最近第二次或更早之前的commit信息 当前有三次提交&#xff0c;从近到远分别为1、2、3 以修改第2次提交为例&#xff08;从最新往前数&#xff09; 1、使用命令git rebase -i HEAD~2 按i进入编辑模式&#xff0c;将对应的pick改为edit&#xff0c;然后ctrlc退出。最…