news 2026/1/30 7:34:42

回溯法---旅行商问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
回溯法---旅行商问题
  • 程语言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)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 19:16:57

TeslaMate实战指南:从数据焦虑到智能掌控的完整解决方案

TeslaMate实战指南&#xff1a;从数据焦虑到智能掌控的完整解决方案 【免费下载链接】teslamate 项目地址: https://gitcode.com/gh_mirrors/tes/teslamate 你是否曾为这些用车困惑而烦恼&#xff1f;&#x1f50b; 看着续航里程不断下降却无法准确评估电池健康&#x…

作者头像 李华
网站建设 2026/1/27 20:38:23

ARK服务器管理工具终极指南:简单快速的服务器部署方案

ARK服务器管理工具终极指南&#xff1a;简单快速的服务器部署方案 【免费下载链接】ark-server-tools 项目地址: https://gitcode.com/gh_mirrors/ark/ark-server-tools ARK服务器管理工具是一个专门为ARK: Survival Evolved游戏服务器设计的开源管理工具集&#xff0c…

作者头像 李华
网站建设 2026/1/22 14:24:47

Vue3-Admin-TS:构建企业级管理系统的终极TypeScript解决方案

Vue3-Admin-TS&#xff1a;构建企业级管理系统的终极TypeScript解决方案 【免费下载链接】vue3-admin-ts &#x1f389; the ts version of vue3-admin-template 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-admin-ts 还在为搭建现代化后台管理系统而烦恼吗&…

作者头像 李华
网站建设 2026/1/29 14:31:36

CTLL-2 细胞:特性、培养

CTLL-2 CTLL-2 是源自 C57BL/6 小鼠的细胞毒性 T 细胞克隆&#xff0c;别称 CTLL2、CTLL&#xff08;2&#xff09;&#xff0c;细胞形态呈淋巴母细胞样&#xff0c;属于典型的悬浮生长细胞。该细胞的核心生物学特性是生长依赖白细胞介素 - 2&#xff08;IL-2&#xff09;&…

作者头像 李华
网站建设 2026/1/26 17:13:30

什么是AI Agent构建器?有哪几种类型?以及为何要使用AI Agent构建器?

什么是AI Agent构建器&#xff1f;构建AI智能体的最基础方式是硬编码。如果你想使用一个抽象的AI Agent构建器来使这个过程更快、更容易维护&#xff0c;你可以从以下类型中选择&#xff1a;1. 基于工作流的构建器AI原生的工作流构建器后期改造了AI功能的工作流构建器2.非工作流…

作者头像 李华
网站建设 2026/1/24 14:03:39

数字营销策略师如何把工作流自动化工具n8n应用于数字营销?

Gustavo Salvador&#xff0c;MSG Agncia Digital的数字策略师兼数字培训联合制作人&#xff0c;一直在他的在线业务中使用n8n。我们与他探讨了如何将n8n工作流应用于数字营销和为客户制作创意内容。问&#xff1a;你好Gustavo&#xff0c;请介绍一下你自己&#xff1f;我叫Gus…

作者头像 李华