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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python实现处理管道的方法
Jun 04 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
python处理按钮消息的实例详解
Jul 11 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
火车票抢票python代码公开揭秘!
Mar 08 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
python实现动态数组的示例代码
Jul 15 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
python的time模块和datetime模块实例解析
Nov 29 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
Python打包exe时各种异常处理方案总结
May 18 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
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python实现马耳可夫链算法实例分析
2015/05/20 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
Python Selenium库的基本使用教程
2021/01/04 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
mysql有关权限的表都有哪几个
2015/04/22 面试题
安全检查验收制度
2014/01/12 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
详解Redis瘦身指南
2021/05/26 Redis
mysql 索引合并的使用
2021/08/30 MySQL
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis