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修改注册表终止360进程实例
Oct 13 Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
python安装本地whl的实例步骤
Oct 12 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
python实现UDP协议下的文件传输
Mar 20 Python
Django中ORM找出内容不为空的数据实例
May 20 Python
Python 如何定义匿名或内联函数
Aug 01 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
Python3 类型标注支持操作
Jun 02 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新手上路(四)
2006/10/09 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP错误机制知识汇总
2016/03/24 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
Python之pymysql的使用小结
2019/07/01 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
python3爬取torrent种子链接实例
2020/01/16 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
项目合作计划书
2014/01/09 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
党员干部一句话承诺
2014/05/30 职场文书
公司应聘自荐书
2014/06/14 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
教师自查自纠材料
2014/10/14 职场文书
实习证明格式范文
2014/10/14 职场文书
人口与计划生育责任书
2015/05/09 职场文书
课改心得体会范文
2016/01/25 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL