当前位置: 首页 > news >正文

回溯法---旅行商问题

  • 程语言Python
  • 难度 中等

问题描述:

给定一组城市和每对城市之间的距离,找到一条最短路径,使得一位旅行商从一个城市出发后,恰好访问每个城市一次,并最终返回出发的城市。

问题特点:

完整性:

旅行商需要访问所有给定的城市。

唯一性:

每个城市只能访问一次(除了起始城市,它既是起点也是终点)。

闭合性:

旅行路线必须形成一个环路,即旅行商最后要回到出发点。

最优性:

寻找的路径应该是所有可能路径中最短的一条。

数学表示:
测试用例:

ifname== "main": import sys NoEdge = sys.maxsize a = [[0,0,0,0,0,0],[0,NoEdge,10,NoEdge,4,12],[0,10,NoEdge,15,8,5],[0,NoEdge,15,NoEdge,7,30],[0,4,8,7,NoEdge,6],[0,12,5,30,6,NoEdge]] n = len(a) x = [i for i in range(n)] bestx =None bestc = NoEdge cc = 0 backtrack(2)#第一个城市固定,所以从第二层开始搜索 print("最短路径长度为:", bestc) print("最短路径为:", bestx)

源码:
import sys def backtrack(t): global cc, bestc, bestx, x, a, n, NoEdge # 递归终止:遍历完所有城市,计算返回起点的总距离 if t == n: # 总距离 = 当前路径长度 + 最后一个城市回到起点的距离 total = cc + a[x[n-1]][x[1]] if total < bestc: bestc = total # 深拷贝当前路径,避免后续修改影响最优解 bestx = x.copy() else: # 遍历t到n-1的城市,生成排列(选择下一个要访问的城市) for i in range(t, n): # 交换x[t]和x[i],选择第i个城市作为当前层的选择 x[t], x[i] = x[i], x[t] # 剪枝:当前路径长度 + 上一个城市到当前城市的距离 < 最优解,才继续搜索 if cc + a[x[t-1]][x[t]] < bestc: # 更新当前路径长度 cc += a[x[t-1]][x[t]] # 递归搜索下一层 backtrack(t + 1) # 回溯:恢复当前路径长度 cc -= a[x[t-1]][x[t]] # 回溯:恢复x的顺序 x[t], x[i] = x[i], x[t] if __name__ == "__main__": NoEdge = sys.maxsize # 表示无路径(本题中未用到,仅占位) # 距离矩阵:a[i][j]表示城市i到城市j的距离,索引0无意义,有效城市为1-5 a = [ [0, 0, 0, 0, 0, 0], [0, NoEdge, 10, NoEdge, 4, 12], [0, 10, NoEdge, 15, 8, 5], [0, NoEdge, 15, NoEdge, 7, 30], [0, 4, 8, 7, NoEdge, 6], [0, 12, 5, 30, 6, NoEdge] ] n = len(a) # n=6,对应城市索引0(无效)、1、2、3、4、5 x = [i for i in range(n)] # 当前路径,初始为[0,1,2,3,4,5] bestx = None # 最优路径 bestc = NoEdge # 最优路径长度,初始为极大值 cc = 0 # 当前路径长度 backtrack(2) # 第一个城市(x[1]=1)固定,从第2层开始搜索 print("最短路径长度为:", bestc) print("最短路径为:", bestx)
http://www.cnnetsun.cn/news/103279.html

相关文章:

  • Minecraft Bedrock启动器技术实现与优化指南
  • MegSpot开源项目完整教程:从入门到精通
  • XposedRimetHelper位置服务功能深度解析:提升钉钉使用体验
  • 深度解锁Windows隐藏功能:ViVeTool GUI使用全攻略
  • 如何快速配置Jellyfin Bangumi插件:新手3分钟上手教程
  • KOReader终极完整指南:免费打造专业级电子书阅读体验
  • VMD-Python分子可视化工具深度解析与实战指南
  • 零基础掌握X-AnyLabeling:GeCO模型目标计数实战全解析
  • Windows界面美化终极指南:DWMBlurGlass实现透明效果全解析
  • 掌握Tianshou:PyTorch强化学习框架从入门到实战
  • 百度网盘秒传链接高效使用指南:从零基础到精通
  • QQ截图独立版:解锁Windows屏幕捕捉新体验的完整手册
  • Emby界面美化完全手册:3种方法打造专属影音中心
  • EmotiVoice语音能量调节功能改善发音力度
  • uvm32一款极简、无依赖的虚拟机沙盒,支持动态加载APP,仅需3KB Flash/1KB RAM
  • Blender版本管理革命:智能化工具如何重塑3D创作工作流
  • 5、Linux 命令使用指南
  • EmotiVoice与动作捕捉结合:打造全感知虚拟人
  • Stable Diffusion WebUI Forge技术架构深度解析:PyTorch生态下的AI绘画引擎
  • 如何快速掌握Grammarly插件:开发者的写作辅助完整指南
  • 5分钟快速上手:yt-dlp-gui 图形界面视频下载终极指南
  • ReadCat电子书阅读器:打造极致纯净的数字阅读体验
  • 韩国掘金必看:Coupang火箭速度背后,跨境卖家的蓝海锚点逻辑
  • FT Transformer终极指南:从架构解析到实战优化
  • 告别混乱桌面:5个步骤用Windows Terminal打造高效远程工作站
  • 16、Kubernetes存储与有状态应用运行指南
  • 19、Kubernetes资源配额、集群容量管理与性能优化
  • 21、高级 Kubernetes 网络技术全解析
  • FastAPI多环境部署终极指南:3步告别配置地狱
  • DAIR-V2X车路协同实战手册:从数据到决策的全链路解密