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实现批量转换文件编码的方法
Jul 28 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Redis使用watch完成秒杀抢购功能的代码
May 07 Python
python交易记录链的实现过程详解
Jul 03 Python
Django ValuesQuerySet转json方式
Mar 16 Python
python如何处理程序无法打开
Jun 16 Python
python判断是空的实例分享
Jul 06 Python
高考考python编程是真的吗
Jul 20 Python
python的setattr函数实例用法
Dec 16 Python
python实现无边框进度条的实例代码
Dec 30 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
php加密解密实用类分享
2014/01/07 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
手把手教你python实现SVM算法
2017/12/27 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Python实现的质因式分解算法示例
2018/05/03 Python
pytorch 共享参数的示例
2019/08/17 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
出纳岗位职责模板
2013/11/27 职场文书
新闻专业个人求职信
2013/12/19 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
安全责任书范本
2014/04/15 职场文书
房屋转让协议书
2014/10/18 职场文书
给学校的建议书400字
2015/09/14 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
vue中div禁止点击事件的实现
2022/04/02 Vue.js
服务器间如何实现文件共享
2022/05/20 Servers