Python基于回溯法子集树模板解决旅行商问题(TSP)实例


Posted in Python onSeptember 05, 2017

本文实例讲述了Python基于回溯法子集树模板解决旅行商问题(TSP)。分享给大家供大家参考,具体如下:

问题

旅行商问题(Traveling Salesman Problem,TSP)是旅行商要到若干个城市旅行,各城市之间的费用是已知的,为了节省费用,旅行商决定从所在城市出发,到每个城市旅行一次后返回初始城市,问他应选择什么样的路线才能使所走的总费用最短?

Python基于回溯法子集树模板解决旅行商问题(TSP)实例

分析

此问题可描述如下:G=(V,E)是带权的有向图,找到包含V中每个结点一个有向环,亦即一条周游路线,使得这个有向环上所有边成本之和最小。

这个问题与前一篇文章https://3water.com/article/122933.htm的区别就是,本题是带权的图。只要一点小小的修改即可。

解的长度是固定的n+1。

对图中的每一个节点,都有自己的邻接节点。对某个节点而言,其所有的邻接节点构成这个节点的状态空间。当路径到达这个节点时,遍历其状态空间。

最终,一定可以找到最优解!

显然,继续套用回溯法子集树模板!!!

代码

'''旅行商问题(Traveling Salesman Problem,TSP)'''
# 用邻接表表示带权图
n = 5 # 节点数
a,b,c,d,e = range(n) # 节点名称
graph = [
  {b:7, c:6, d:1, e:3},
  {a:7, c:3, d:7, e:8},
  {a:6, b:3, d:12, e:11},
  {a:1, b:7, c:12, e:2},
  {a:3, b:8, c:11, d:2}
]
x = [0]*(n+1) # 一个解(n+1元数组,长度固定)
X = []     # 一组解
best_x = [0]*(n+1) # 已找到的最佳解(路径)
min_cost = 0    # 最小旅费
# 冲突检测
def conflict(k):
  global n,graph,x,best_x,min_cost
  # 第k个节点,是否前面已经走过
  if k < n and x[k] in x[:k]:
    return True
  # 回到出发节点
  if k == n and x[k] != x[0]:
    return True
  # 前面部分解的旅费之和超出已经找到的最小总旅费
  cost = sum([graph[node1][node2] for node1,node2 in zip(x[:k], x[1:k+1])])
  if 0 < min_cost < cost:
    return True
  return False # 无冲突
# 旅行商问题(TSP)
def tsp(k): # 到达(解x的)第k个节点
  global n,a,b,c,d,e,graph,x,X,min_cost,best_x
  if k > n: # 解的长度超出,已走遍n+1个节点 (若不回到出发节点,则 k==n)
    cost = sum([graph[node1][node2] for node1,node2 in zip(x[:-1], x[1:])]) # 计算总旅费
    if min_cost == 0 or cost < min_cost:
      best_x = x[:]
      min_cost = cost
      #print(x)
  else:
    for node in graph[x[k-1]]: # 遍历节点x[k-1]的邻接节点(状态空间)
      x[k] = node
      if not conflict(k): # 剪枝
        tsp(k+1)
# 测试
x[0] = c # 出发节点:路径x的第一个节点(随便哪个)
tsp(1)  # 开始处理解x中的第2个节点
print(best_x)
print(min_cost)

效果图

Python基于回溯法子集树模板解决旅行商问题(TSP)实例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python函数缺省值与引用学习笔记分享
Feb 10 Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
浅谈Python中数据解析
May 05 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
详解使用Python下载文件的几种方法
Oct 13 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 #Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 #Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 #Python
python进程管理工具supervisor的安装与使用教程
Sep 05 #Python
基于Django模板中的数字自增(详解)
Sep 05 #Python
用python结合jieba和wordcloud实现词云效果
Sep 05 #Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 #Python
You might like
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python3.2中Print函数用法实例详解
2015/05/19 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
python 批量将中文名转换为拼音
2021/02/07 Python
介绍一下Java中的static关键字
2012/05/12 面试题
销售心得体会
2014/01/02 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
学习新党章思想汇报
2014/01/09 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
起诉意见书范文
2015/05/19 职场文书
2015年教研员工作总结
2015/05/26 职场文书
人与自然的观后感
2015/06/18 职场文书
2016高考感言
2015/08/01 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang