运筹优化 | 模拟退火求解旅行商问题 | Python实现
"""模拟退火旅行商"""
import random
import numpy as np
import math
import time
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
location = np.loadtxt('city_location.txt') # 加载数据'''一些关键参数'''
num_city = 30 # 城市总数
initial_t = 100 # 初始温度
lowest_t = 0.001 # 最低温度
iteration = 10000 # 设置迭代次数'''输入两个城市之间的距离'''
def distance_mat():distance = [] # 初始化距离数组for i in range(30):distance_each = [] # 初始化每个城市到其他城市的距离for j in range(30):dis = math.sqrt(pow(location[i][0] - location[j][0], 2) +pow(location[i][1] - location[j][1], 2)) # 计算距离distance_each.append(dis) # 赋值到distance_each数组distance.append(distance_each) # 按列添加return distance'''计算所有路径对应的距离'''
def cal_newpath(distance, path):# 此时传入的path是一条随机生成的路径dis = 0for j in range(num_city - 1): # 只遍历0到28个城市,是因为第29个城市的下一个是起点,这样才是TSP问题,形成闭环dis = distance[path[j]][path[j + 1]] + dis # 这条路径上经过的两两个点的距离之和即为这条路径的长度dis = dis + distance[path[29]][path[0]] # 计算的距离之和再加上第28个城市回到起点的距离return dis'''点对点的距离矩阵'''
distance = distance_mat()
'''初始路径'''
path = list(range(30)) # 生成0到29的列表,即城市索引
'''初始距离'''
dis = cal_newpath(distance, path) # 先计算初始的距离,这样在模拟退火的时候才可以开始比较
'''初始温度'''
t_current = initial_t
'''灵敏度分析'''
sensibility = []start_time = time.time() # 开始计时'''模拟退火'''
while t_current > lowest_t: # 外层循环:改变温度count_m = 0 # M的计数count_iter = 0 # 迭代次数计数while count_iter < iteration: # 内层循环:连续多次不接受新的状态则跳出内循环i = 0j = 0while i == j: # 防止随机了同一城市i = random.randint(1, 29)j = random.randint(1, 29)path_new = path.copy()path_new[i], path_new[j] = path_new[j], path_new[i] # 任意交换两个城市的位置,产生新的路径组合dis_new = cal_newpath(distance, path_new) # 计算新路径的距离dis_delta = dis_new - dis # 计算新距离和旧距离的差值rand = random.random() # 生成一个0到1的浮点随机数exp_d = math.exp(-dis_delta / t_current) # Metropolis准则'''是否接受新解的过程'''if dis_delta < 0: # 如果新距离小于旧距离,则直接接受path = path_newdis = dis_newelif exp_d > rand: # 如果新距离大于旧距离,用Metropolis准则判断是否接受path = path_newdis = dis_newelse: # 不接受新解count_m = count_m + 1count_iter = count_iter + 1 # 迭代次数加1sensibility.append(dis)t_current = 0.99 * t_current # 改变温度end_time = time.time()
elapsed_time = end_time - start_time# 绘制最短路径的坐标图
x_coords = [location[i][0] for i in path]
y_coords = [location[i][1] for i in path]# 添加起点到终点的连线
x_coords.append(x_coords[0])
y_coords.append(y_coords[0])plt.figure(1)
plt.plot(x_coords, y_coords, marker='o', linestyle='-')
plt.title('最短路径坐标图')
plt.xlabel('X 坐标')
plt.ylabel('Y 坐标')
plt.grid(True)
plt.show()plt.figure(2)
plt.plot(sensibility,marker='.',color='r',markersize=3)
plt.title('最短路径坐标图')
plt.xlabel('迭代次数')
plt.ylabel('最短距离')
plt.grid(True)
plt.show()'''输出结果'''
print('最短距离:', dis)
print('最短路径:', path)
print('运行时间:', elapsed_time, '秒')
最短距离: 424.69177537685437
最短路径: [0, 5, 4, 3, 12, 11, 29, 22, 21, 16, 15, 28, 27, 26, 25, 24, 23, 14, 13, 7, 9, 20, 19, 18, 6, 10, 8, 2, 17, 1]
运行时间: 43.86513066291809 秒


相关文章:
运筹优化 | 模拟退火求解旅行商问题 | Python实现
"""模拟退火旅行商""" import random import numpy as np import math import time import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False location np.loadtxt(city_location.t…...
1017 A除以B
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 ABQR 成立。 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 空格分隔。 输出格式: 在一行中依…...
SAP UI5 walkthrough step8 Translatable Texts
在这个章节,我们会将一些文本常量独立出一个资源文件 这样的话,可以方便这些文本常量被翻译成任意的语言 这种国际化的操作,我们一般命名为i18n 新建一个文件i18n.properties webapp/i18n/i18n.properties (New) showHelloButtonTextSay …...
RocketMQ-源码架构二
梳理一些比较完整,比较复杂的业务线 消息持久化设计 RocketMQ的持久化文件结构 消息持久化也就是将内存中的消息写入到本地磁盘的过程。而磁盘IO操作通常是一个很耗性能,很慢的操作,所以,对消息持久化机制的设计,是…...
Unity_ET框架项目-斗地主_启动运行流程
unity_ET框架项目-斗地主_启动运行流程 项目源码地址: Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤: 下载目录如下: 1. VS(我用是2022版VisualStudio)…...
自动化测试框架 —— pytest框架入门篇
今天就给大家说一说pytest框架。 今天这篇文章呢,会从以下几个方面来介绍: 01、pytest框架介绍 pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持非常丰富的插件,同时兼容 unittest 框架。…...
String类详解
String类详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 解密String类:探秘Java中的字符串魔法 在Java的世界里,String类犹如一位魔法…...
Linux高级管理--安装MySQL数据库系统
MySQL服务基础 MySQL.是一个真正的多线程、多用户的SQL数据库服务,凭借其高性能、高可靠和易于使 用的特性,成为服务器领域中最受欢迎的开源数据库系统。在2008年以前,MySOL项目由MySQL AB公司进行开发,发布和支持,之后…...
团建策划信息展示服务预约小程序效果如何
团建是中大型企业商家每年举办的员工活动,其形式多样化、具备全部参与的娱乐性。但在实际策划流程及内容时,部分公司便会难以入手,术业有专攻,这个时候团建策划公司便会发挥效果。 如拓展训练、露营、运动会、体育竞技等往往更具…...
一个Redis实例最多能存放多少keys
程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …...
K8S(四)—pod详解
目录 pod介绍Pod的概念:Pod的特性:Pod的配置:Pod的控制:示例 YAML 文件: pod启动流程问题 两种方式启动镜像的升级和回滚更新 Deployment:回滚检查 Deployment 历史版本回滚到之前的修订版本缩放 Deploymen…...
shiro Filter加载和执行 源码解析
一、背景 在使用若依框架(前后端不分离包含shiro安全框架)时,发现作者添加了验证码、登录帐号控制等自定义过滤器,于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例,对源码解析。注意类之间的继承关…...
IDEA上传jar包到Maven
mvn install:install-file //固定格式,maven的语法 -Dfilealibaba-sdk-1.0.0.jar //这里填写包的路径,因为我们是在当前目录所以只需要输入包名即可 -DgroupIdcom.qiehua.csdn //这里填写包的groupId,之后作为pom.xml中引用的gr…...
JavaScript——基本语法
1.定义变量: 变量类型 变量名 变量值 var关键字声明变量 es6版本以上 var 可写可不写 <script>// 定义变量:变量类型 变量名 变量值 var关键字声明变量 es6版本以上 var 可写可不写var num 2;</script>2.条件控制 <script>var …...
一款最近很火的开源低代码平台
低代码平台近年来获得大量融资的原因是多方面的。首先,低代码平台代表了软件开发领域的一个重要趋势,即通过简化编程过程来降低技术门槛,使非专业开发者也能构建应用程序。这为那些希望加速数字化转型的企业提供了新的可能性,因此…...
vue之代理配置devServer(vue.config.js)片段
关于vue.config.js的部分配置解析:首先看下面一段配置 devServer: { open: process.platform darwin,//true or false (true则启动项目自动打开系统自带浏览器) host: 0.0.0.0, // 配置devServer服务监听的地址 比如:想让局域网…...
CTD测试流程
连接 连接17Plus,用usb转232线,db9公针2、3分别接Data I/O的2、3。DB9的5接Data I/O的1。尼龙塞子打开状态。不用闭合。 软件连接 打开SeaTermAF V2,注意打开前先把串口插上,否则软件读不到串口。如果读不到,就在插…...
面试经典150题(15-19)
leetcode 150道题 计划花两个月时候刷完,今天(第七天)完成了5道(15-19)150: 今天这些都是我之前做过的,还有就是今天的全都是模拟过程。。所以做的还算快。 15(13. 罗马数字转整数) 题目描述&a…...
Linux下的网络服务
一般来说,各种操作系统在网络方面的性能比较是这样的顺序BSD>Linux>Win NT>Win 9X, 由此说来,Linux的网络功能仅次于UNIX,而强于Win NT和其它的视窗系列产品,对于Win2000我还不能评价太多,因为不是很熟。 Lin…...
制造业对于IT软硬件监控和摄像头故障监控的需求
制造业对于生产线的自动化和智能化需求较高,IT监控运维管理软件在制造业的应用也日益普及。监控易为制造业提供了一系列定制化的解决方案,助力企业实现生产线的智能化和高效化。 随着制造业的数字化转型和智能化升级,IT运维管理软件的需求也在…...
系统级开发中的夜间MVP构建与Boneyard归档实践
1. 项目概述:一个名为“Boneyard”的夜间MVP构建最近在开源社区里,我注意到一个挺有意思的项目,叫sys-fairy-eve/nightly-mvp-2026-04-05-boneyard。光看这个标题,信息量就很大,它像是一个系统构建流水线上的一个特定快…...
开源阅读鸿蒙版技术架构解析:构建去中心化数字阅读生态的实践方案
开源阅读鸿蒙版技术架构解析:构建去中心化数字阅读生态的实践方案 【免费下载链接】legado-Harmony 开源阅读鸿蒙版仓库 项目地址: https://gitcode.com/gh_mirrors/le/legado-Harmony 开源阅读鸿蒙版(Legado-Harmony)是一款专为鸿蒙操…...
碳纤维板的导电特性
简 介: 碳纤维板导电性能测试表明,其表面有机膜被刺破后会呈现导电性,电阻值从十几欧姆到几百欧姆不等,且导电性能随测量点位置变化。测试中使用尖头万用表探针穿透表面薄膜,发现同一束碳纤维连接处电阻较低࿰…...
STC8H单片机低功耗实战:用掉电模式和外部中断,让电池续航翻倍
STC8H单片机低功耗实战:用掉电模式和外部中断,让电池续航翻倍 在电池供电的嵌入式设备开发中,功耗控制往往是决定产品成败的关键因素。想象一下,一款设计精良的便携式环境监测仪,如果因为功耗问题导致频繁更换电池&am…...
别只装AlexNet了!手把手教你在MATLAB里玩转更多预训练模型(VGG, ResNet, MobileNet安装指南)
别只装AlexNet了!手把手教你在MATLAB里玩转更多预训练模型(VGG, ResNet, MobileNet安装指南) 当你第一次在MATLAB中调用alexnet函数时,那种"开箱即用"的体验确实令人惊艳。但就像一位米其林大厨不会只满足于使用基础厨具…...
ArduPilot硬件抽象层(HAL)详解:如何让你的代码跑在不同的飞控板上(以STM32为例)
ArduPilot硬件抽象层深度解析:从STM32到多平台移植实战指南 引言:为什么HAL是飞控开发的核心枢纽 在无人机飞控开发领域,硬件平台的多样性一直是开发者面临的首要挑战。不同厂商的MCU架构、外设接口和操作系统差异,往往导致代码…...
如何用D2DX游戏优化工具突破《暗黑破坏神2》25fps限制:宽屏适配与性能提升的终极解决方案
如何用D2DX游戏优化工具突破《暗黑破坏神2》25fps限制:宽屏适配与性能提升的终极解决方案 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/…...
j | 禁忌 | n |孩
通过网盘分享的文件:禁 | 忌女 | 孩(日版) 链接: https://pan.baidu.com/s/1bjsnnvP2f1EiA8ySTbCAOg?pwdtqp2 提取码: tqp2...
ESP32开发板Flash型号傻傻分不清?教你用esptool.py一键查询并看懂ID(附厂商对照表)
ESP32开发板Flash型号识别全攻略:从ID解析到厂商对照 当你拿到一块ESP32开发板或模组时,是否经常遇到这样的困惑:Flash芯片的具体型号和容量不明,导致在menuconfig配置时无从下手?这种"盲盒"体验确实让人头疼…...
半小时搞定C#开发
前言 此篇发出的原因有两点 致敬C#开篇 - 孤独战士,一篇包含雄心壮志的开篇,便无疾而终,时隔这么多年回关,内心莫名欣慰,感谢曾经的自己,就像文章标题所说,做一个无谓的孤独战士。笔者看到现在…...
