蚁群算法解决旅行商问题的完整Python实现

news2024/11/18 13:42:26

蚁群算法(Ant Colony Optimization,简称ACO)是一种模拟蚂蚁觅食行为的启发式优化算法。它通过模拟蚂蚁在寻找食物时释放信息素的行为,来解决组合优化问题,特别是旅行商问题(TSP)。

蚁群算法的基本思想是,蚂蚁在搜索过程中通过释放信息素来引导其他蚂蚁的行为。蚂蚁在路径上释放的信息素会被其他蚂蚁感知到,并且更倾向于选择信息素浓度较高的路径。随着时间的推移,信息素会逐渐蒸发,从而使路径上的信息素浓度趋于平衡。

下面是一个使用蚁群算法解决旅行商问题的Python代码示例:

import numpy as np

class AntColonyOptimizer:
    def __init__(self, num_ants, num_iterations, alpha, beta, rho, Q):
        self.num_ants = num_ants
        self.num_iterations = num_iterations
        self.alpha = alpha
        self.beta = beta
        self.rho = rho
        self.Q = Q

    def optimize(self, distance_matrix):
        num_cities = distance_matrix.shape[0]
        pheromone_matrix = np.ones((num_cities, num_cities))
        best_path = None
        best_distance = np.inf

        for iteration in range(self.num_iterations):
            paths = self.construct_paths(distance_matrix, pheromone_matrix)
            self.update_pheromones(pheromone_matrix, paths)

            current_best_path = min(paths, key=lambda x: self.calculate_distance(x, distance_matrix))
            current_best_distance = self.calculate_distance(current_best_path, distance_matrix)

            if current_best_distance < best_distance:
                best_path = current_best_path
                best_distance = current_best_distance

            self.evaporate_pheromones(pheromone_matrix)

        return best_path, best_distance

    def construct_paths(self, distance_matrix, pheromone_matrix):
        num_cities = distance_matrix.shape[0]
        paths = []

        for ant in range(self.num_ants):
            path = [0]  # Start from city 0
            visited = set([0])

            while len(path) < num_cities:
                current_city = path[-1]
                next_city = self.select_next_city(current_city, visited, pheromone_matrix, distance_matrix)
                path.append(next_city)
                visited.add(next_city)

            path.append(0)  # Return to city 0
            paths.append(path)

        return paths

    def select_next_city(self, current_city, visited, pheromone_matrix, distance_matrix):
        num_cities = distance_matrix.shape[0]
        unvisited_cities = set(range(num_cities)) - visited
        probabilities = []

        for city in unvisited_cities:
            pheromone = pheromone_matrix[current_city, city]
            distance = distance_matrix[current_city, city]
            probability = pheromone**self.alpha * (1/distance)**self.beta
            probabilities.append(probability)

        probabilities = np.array(probabilities)
        probabilities /= np.sum(probabilities)
        next_city = np.random.choice(list(unvisited_cities), p=probabilities)

        return next_city

    def update_pheromones(self, pheromone_matrix, paths):
        for path in paths:
            distance = self.calculate_distance(path, distance_matrix)
            pheromone_deposit = self.Q / distance

            for i in range(len(path)-1):
                city_a = path[i]
                city_b = path[i+1]
                pheromone_matrix[city_a, city_b] += pheromone_deposit

    def evaporate_pheromones(self, pheromone_matrix):
        pheromone_matrix *= (1 - self.rho)

    def calculate_distance(self, path, distance_matrix):
        distance = 0

        for i in range(len(path)-1):
            city_a = path[i]
            city_b = path[i+1]
            distance += distance_matrix[city_a, city_b]

        return distance

# Example usage
distance_matrix = np.array([[0, 2, 9, 10],
                            [1, 0, 6, 4],
                            [15, 7, 0, 8],
                            [6, 3, 12, 0]])

aco = AntColonyOptimizer(num_ants=10, num_iterations=100, alpha=1, beta=2, rho=0.5, Q=1)
best_path, best_distance = aco.optimize(distance_matrix)

print("Best path:", best_path)
print("Best distance:", best_distance)

示例中使用一个4x4的距离矩阵来表示城市之间的距离。可以根据需要修改距离矩阵的大小和内容。蚁群算法的参数包括蚂蚁数量(num_ants)、迭代次数(num_iterations)、信息素重要程度(alpha)、启发式信息重要程度(beta)、信息素蒸发率(rho)和信息素增量(Q)根据具体问题进行调整。

程序输出如下:

Best path: [0, 1, 2, 3, 0]
Best distance: 22

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

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

相关文章

RAG:让大语言模型拥有特定的专属知识

作为一个在Chatbot领域摸爬滚打了7年的从业者&#xff0c;笔者可以诚实地说&#xff0c;在大语言模型的推动下&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;技术正在快速崛起。 RAG的搜索请求和生成式AI技术&#xff0c;为搜…

【数据库原理】期末突击(2)

有不会的题可以后台问我的哦&#xff0c;看见了就会回。祝大家期末心想事成。 数据库大题显而易见就只有几类&#xff0c;大家可以根据老师平时讲解的例题对应去解决一类型的题目。 前提知识; 候选码候选键关键字键码 关系代数&#xff1a;&#xff08;1&#xff09;传统&…

echarts使用之柱状图

一、引入Echarts npm install eacharts --save 二、选择一个Echarts图 选择创建一个柱状图 option { // x轴参数的基本配置xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun] //X轴数据}, // y轴参数的基本配置yAxis: {type: value}, // series:[{data: …

MySQL连接池、C3P0、Druid德鲁伊连接池技术

MySQL连接池 连接池C3P0Druid 连接池 概念&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。当系统初始化好后&#xff0c;容器被创建&#xff0c;容器中会申请一些连接对象&#xff0c;当用户来访问数据库时&#xff0c;从容器中获取连接对象&#xff0…

怎么样检查自己系统上的Python环境中是否有某个包(扩展库)?

比如我们这里想看下有没有库pytz 很简单&#xff0c;进入Python的命令行&#xff0c;然后输入下面的命令&#xff1a; import pytz如果有这个库&#xff0c;则不会报错&#xff0c;否则会报错。 Windows的测试结果如下&#xff1a; Centos的测试结果如下&#xff1a;

Linux中vim查看文件某内容

一、编辑文件命令 [rootyinheqilin ~]# vim test.txt 1&#xff0c;在编辑的文件中连续按2次键盘的【g】键&#xff0c;光标会移动到文档开头第一行 2&#xff0c;输入一个大写 G&#xff0c;光标会跳转到文件的最后一行第一列&#xff08;末行) 二、查看文件内容命令 gre…

改善制造业客户体验的实用技巧与策略

制造业是一个关键行业&#xff0c;在经济中发挥着至关重要的作用。它负责为我们的日常生活生产必需品和服务。然而近年来&#xff0c;该行业发生了重大变化&#xff0c;企业现在面临着日益激烈的竞争和满足消费者需求的压力。为了保持竞争力&#xff0c;制造商必须专注于打造更…

算法通关村番外篇-LeetCode编程从0到1系列二

大家好我是苏麟 , 今天来说LeetCode编程从0到1系列二 . 内置函数 最后一个单词的长度 描述 : 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子…

PHP大型企业人才招聘网站源码带文字安装教程

PHP大型企业人才招聘网站源码带文字安装教程 运行环境 服务器宝塔面板 PHP 5.6 Mysql 5.5及以上版本 Linux Centos7以上 功能说明&#xff1a; 会员模块包括企业管理、职位管理、名企管理、企业认证审核、 企业设置。内容模块包括新闻管理、新闻类别、新闻属性、添加新闻。 运营…

海外云手机:一机多用,引领跨境电商新潮流

如今&#xff0c;跨境卖家除了经营跨境平台外&#xff0c;还需抓住短视频和社交媒体的机遇。在社交媒体上实现引流&#xff0c;将流量导向自己的跨境平台或独立站&#xff0c;吸引用户购买&#xff0c;完成流量变现&#xff0c;已成为跨境电商的一项关键策略。本文将介绍如何用…

获取深层次字段报错TypeError: Cannot read properties of undefined (reading ‘title‘)

动态生成菜单时报错,不能多层获取路由meta下面的title字段 <template><p>{{ meneList }}</p><template v-for"item in meneList" :key"item.path"><el-menu-item v-if"!item.children"><template #title>{…

【Tomcat】在一台计算机上运行两个Tomcat服务

首先把Tomcat整个文件复制一份放在其他文件夹路径中 1.修改环境变量 添加环境变量在系统变量里面 “CATALINA_HOME” 指向一个Tomcat文件夹路径 “CATALINA_HOME1” 指另一个Tomcat文件夹路径 2.修改startup里面的环境变量&#xff0c;全部修改 分别修改两个apache-tomcat…

教你用SadTalker一键整合包轻松制作专属数字人

数字人的效果&#xff1a; &#x1f3b5;我用SadTalker制作了专属虚拟数字人&#xff0c;还会唱歌哦&#xff0c;多多点赞关注就出教程呦&#x1f497; SadTalker有独立离线版Ai数字人&#xff0c;也可以在Stable Diffusion以插件的形式使用&#xff0c;但是如果显卡小的话还是…

水经微图安卓版APP正式上线!

在水经微图APP&#xff08;简称“微图APP”&#xff09;安卓版已正式上线&#xff01; 在随着IOS版上线约一周之后&#xff0c;安卓版终于紧随其后发布了。 微图安卓版APP下载安装 自从IOS版发布之后&#xff0c;就有用户一直在问安卓版什么时候发布&#xff0c;这里非常感谢…

PHP Web应用程序中常见漏洞

一淘模板&#xff08;56admin.com)发现PHP 是一种流行的服务器端脚本语言&#xff0c;用于开发动态 Web 应用程序。但是&#xff0c;与任何其他软件一样&#xff0c;PHP Web 应用程序也可能遭受安全攻击。 在本文中&#xff0c;我们将讨论 PHP Web 应用程序中一些最常见的漏洞…

计算机网络——应用层(2)

计算机网络——应用层&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) Web和HTTP概念解读HTTPHTTP请求和响应包含内容常见的请求方法Web缓存优点缺点 总结 DNS提供的服务 小程一言 我的计算机网络专栏&#xff0c;是自己在计算机网络学习过程…

std::numeric_limits::max()编译错误问题解决

在使用numeric_limits的max最大值时&#xff0c;报 替换成下面就可以了 (numeric_limits::max)()

IPv6路由协议---IPv6动态路由(OSPFv3-6)

OSPFv3链路状态通告类型 Link-LSA(8类LSA) Link-LSA每个连接的链路都产生一条Link LSA,该LSA的泛洪范围只在链路范围内。 Link-LSA的作用: 向该链路上其他路由器通知本地的link-local地址,即到本地的下一跳地址。 收集本路由器在该链路上配置的所有的IPv6前缀,并通知该…

element的Table表格组件树形数据与懒加载简单使用

目录 1. 代码实现2. 效果图3. 解决新增、删除、修改之后树节点不刷新问题。&#xff08;[参考文章](https://blog.csdn.net/weixin_41549971/article/details/135504471)&#xff09; 1. 代码实现 <template><div><!-- lazy 是否懒加载子节点数据 --><!-…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 &#xff08;以环境名为py37_pytorch1.9为例&#xff09; 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境&#xff1a; ​​​​​​​conda env list 切换/进入环境&#xff1a; conda activate py37_pytorch1.9 删除环…