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 相关文章推荐
python3模块smtplib实现发送邮件功能
May 22 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
Python multiprocessing多进程原理与应用示例
Feb 28 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
python识别验证码的思路及解决方案
Sep 13 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
第十四节--命名空间
2006/11/16 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
js html实现计算器功能
2018/11/13 Javascript
Node 代理访问的实现
2019/09/19 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
Python实现带百分比的进度条
2016/06/28 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
python之array赋值技巧分享
2019/11/28 Python
appium+python adb常用命令分享
2020/03/06 Python
Python如何对XML 解析
2020/06/28 Python
Django REST 异常处理详解
2020/07/15 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
HTML5的新特性(1)
2016/03/03 HTML / CSS
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
2014小学语文教学工作总结
2014/12/17 职场文书
单位介绍信格式
2015/01/31 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
基于Python实现股票收益率分析
2022/04/02 Python