模拟退火算法(SA)解决旅行商(TSP)问题的python实现

旅行商问题

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

模拟退火算法

模拟退火算法(Simulated Annealing)是一种启发式优化算法,受到固体退火过程的启发。该算法通过模拟物质在高温下退火冷却的过程,从而在解空间中跳出局部最优解,寻找全局最优解。
简单来说,模拟退火算法的主要步骤包括:
1 初始化:随机选择一个初始解,并设定初始温度(Temperature)。
2 **循环迭代:**在当前解的基础上进行微小的扰动,生成一个新解。计算新解的目标函数值(或者称为能量值)和当前解的目标函数值的差异(ΔE)。如果 ΔE 小于0,即新解更优,接受新解。如果 ΔE 大于0,以一定的概率(由一个概率分布计算得出,通常是玻尔兹曼分布)接受新解。这个概率随着温度的降低而减小,但在开始时有较大的概率接受劣解,以便跳出局部最优解。
3 降低温度,通常按照某个固定的降温率进行。
4 终止条件:当温度降低到足够低(接近零)或者达到最大迭代次数时停止算法。最终的解即为所求解。
这种随机性和“接受劣解”的策略使得模拟退火算法有可能避免陷入局部最优解,同时在搜索空间中进行广泛的探索,从而找到更优的解。算法中的温度和接受劣解的概率是关键的参数,它们影响了算法的探索性能。

在TSP问题中,模拟退火算法在解决旅行商问题(TSP)时的思路是通过在解空间中进行随机游走,模拟“退火”过程中的分子在热系统中的运动。具体步骤如下:
1 初始化解:随机生成一个初始路径,表示旅行商依次访问城市的顺序。
2 设定初始温度:初始时,系统的“温度”很高,容许接受较差的解。初始温度的选择对算法的性能有影响,通常由问题的特性和经验决定。
3 迭代过程:在当前解的基础上进行微小的扰动,例如交换两个城市的顺序,得到一个新的解。计算新解的路径长度与当前解的路径长度之差(ΔE)。如果 ΔE 小于0,即新解更优,直接接受新解。如果 ΔE 大于0,以一定的概率(由温度和 ΔE 决定)接受新解。温度高时,概率较大,有较大可能性接受劣解;随着迭代进行,温度逐渐降低,接受劣解的概率减小,算法越来越趋向于选择更好的解。
4 降低温度:在每个迭代步骤后,通过一个降温策略减小温度。典型的降温策略是乘以一个小于1的因子。
5 终止条件:当温度降低到足够低(接近零)或者达到最大迭代次数时停止算法。此时,当前解即为所求解。

代码实现


import random
import math# 读取 .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 simulated_annealing(distance_matrix, initial_temperature, cooling_rate, num_iterations):current_solution = random.sample(range(len(distance_matrix)), len(distance_matrix))current_energy = calculate_path_length(current_solution, distance_matrix)best_solution = current_solutionbest_energy = current_energytemperature = initial_temperaturefor _ in range(num_iterations):# 生成新解new_solution = current_solution[:]# 随机选择两个位置交换i, j = random.sample(range(len(new_solution)), 2)new_solution[i], new_solution[j] = new_solution[j], new_solution[i]new_energy = calculate_path_length(new_solution, distance_matrix)# 计算能量差delta_energy = new_energy - current_energy# 如果新解更优,或者以一定概率接受劣解if delta_energy < 0 or random.random() < math.exp(-delta_energy / temperature):current_solution = new_solutioncurrent_energy = new_energy# 更新最优解if current_energy < best_energy:best_solution = current_solutionbest_energy = current_energy# 降低温度temperature *= (1 - cooling_rate)return best_solution, best_energyif __name__ == "__main__":tsp_metadata = read_tsp_file("dantzig42.tsp")initial_temperature = 1000  # 初始温度cooling_rate = 0.003  # 冷却率num_iterations = 1000000distance_matrix = read_distance_matrix("dantzig42_d.txt", tsp_metadata["num_cities"])'''# 创建自己的距离矩阵的实现 num_cities = 5distance_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 = simulated_annealing(distance_matrix, initial_temperature, cooling_rate, num_iterations)print("最短路径:", best_path)print("最短距离:", best_distance)

结果展示

在这里插入图片描述

结果分析:

模拟退火算法(Simulated Annealing)是一种启发式优化算法,受到固体退火过程的启发。该算法通过模拟物质在高温下退火冷却的过程,从而在解空间中跳出局部最优解,寻找全局最优解。在模拟退火算法中,由于接受劣解的概率,每次运行的结果可能会有所不同。这种随机性是模拟退火算法的一个特点,它使得算法有可能跳出局部最优解,寻找到全局最优解
由于每次选择接受劣解的概率是基于当前的温度和新解与当前解的能量差异计算的,因此在不同的运行中,随机性会导致算法在搜索空间中不同的路径上进行探索。当温度较高时,算法更容易接受劣解,随着温度的逐渐降低,接受劣解的概率也逐渐降低,算法会越来越倾向于选择更好的解。可以增加模拟退火算法的迭代次数(num_iterations)以增加搜索空间中的探索,也可以调整初始温度(initial_temperature)和冷却率(cooling_rate)以影响算法的收敛速度。增加迭代次数和调整参数可能会增加算法的计算时间,但也会提高找到更优解的机会。所以每次的最短路径和最短距离可能不一样。

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

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

相关文章

最最常用的MySQL Shell运维脚本,赶紧收藏吧!

作为运维人员或者开发人员&#xff0c;日常的mysql运维工作我们是一定要会的&#xff0c;我收集了一些常用shell脚本&#xff0c;仅供参考&#xff01; 1、备份数据库&#xff1a; #!/bin/bashBACKUP_DIR"backup_dir" MYSQL_USER"mysql_user" MYSQL_PASS…

【Databend】行列转化:数据透视和逆透视

文章目录 数据准备数据透视数据逆透视总结 数据准备 学生学科得分等级测试数据如下&#xff1a; drop table if exists fact_suject_data; create table if not exists fact_suject_data (student_id int null comment 编号,subject_level varchar null comment …

Unity中URP下实现深度贴花(雾效支持和BRP适配)

文章目录 前言一、让我们的贴画支持雾效1、我们舍弃内部的MixFog方法2、使用 雾效混合因子 对最后输出颜色进行线性插值相乘 二、在Shader中&#xff0c;限制贴花纹理的采样方式1、申明 纹理 和 限制采样方式的采样器2、在片元着色器进行纹理采样 三、BRP适配1、C#脚本中&#…

Github Copilot AI保密级教程

Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方面是优于GPT-3的&#xff0c;它可以根据程序员输入的上下文和代码提示&#xff0c;自动生成符合语…

2024年美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

AD20 解决PCB铺铜与锡盘之间锯齿状连接问题的设置方法

上一篇文章&#xff1a;PCB简单绘制一般步骤 对上一篇文章中&#xff0c;关于铺铜设置的补充&#xff0c;解决铺铜与锡盘之间的锯齿状连接情况。 1、新建Demo&#xff0c;创建PCB板子&#xff0c;布置锡盘和铺铜&#xff0c;如图&#xff1a; 2、设置规则&#xff0c;参考上一…

Java医院智能3D导诊系统源码 微信小程序源码

医院智慧3D导诊系统&#xff0c; 通过输入疾病症状和选择部位进行导诊挂号&#xff0c;支持小程序端、APP端 开发背景 人们经常去医院因为不知道挂什么科而烦恼&#xff0c;有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科&#xff0c;找什么类型的医生&…

聊天机器人之接收实时信息实现(二)

准备工作 如果没有准备好环境的请看 前期环境准备 这里默认已经注入成功并且已经登录好了账号。 具体实现 实现原理 通过本地搭建一个web服务&#xff0c;来接收一个POST请求&#xff0c;这个请求中就会涵盖实时的数据&#xff0c;包括昵称、消息内容、消息类型之类的。 p…

C#销售管理系统源码

C#销售管理系统源码 框架版本: .net framework 4.8 UI控件库:CsKin 功能介绍: 1.登陆 2. 进销存管理&#xff1a;收银台、商品入库、商品浏览、退货 3. 数据统计分析: 销售统计、工资核算 4. 基础数据维护:商品分类管理、员工管理

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

2024年,谷歌云首席技术官眼中的生成AI三大支柱,来看看有啥新花样

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

EVA-CLIP: Improved Training Techniques for CLIP at Scale论文解读

文章目录 前言一、摘要二、引言三、贡献四、模型方法五、论文链接总结 前言 最近&#xff0c;我一直在搞多模态大模型相关工作&#xff0c;也深知CLIP结构重要性&#xff0c;而EVA-CLIP论文是在CLIP模型基础上进行了一系列trick&#xff0c;实现优越CLIP模型的方法&#xff0c…