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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
简单了解django缓存方式及配置
Jul 19 Python
使用python求解二次规划的问题
Feb 29 Python
Python中qutip用法示例详解
Oct 02 Python
python函数超时自动退出的实操方法
Dec 28 Python
详解python的xlwings库读写excel操作总结
Feb 26 Python
Python基础之tkinter图形化界面学习
Apr 29 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
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
eBay加拿大站:eBay.ca
2019/06/20 全球购物
linux面试题参考答案(9)
2015/01/07 面试题
办公室文秘岗位职责
2013/11/15 职场文书
销售演讲稿范文
2014/01/08 职场文书
财务总监管理职责范文
2014/03/09 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
读后感作文评语
2014/12/25 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
新闻通讯稿范文
2015/07/22 职场文书
田径运动会广播稿
2015/08/19 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL