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根据出生日期获得年龄的方法
Mar 31 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python实现简单生成验证码功能【基于random模块】
Feb 10 Python
Python对象属性自动更新操作示例
Jun 15 Python
Python基于mysql实现学生管理系统
Feb 21 Python
pandas.cut具体使用总结
Jun 24 Python
Django框架表单操作实例分析
Nov 04 Python
用 Python 制作地球仪的方法
Apr 24 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
Python爬虫制作翻译程序的示例代码
Feb 22 Python
pycharm部署django项目到云服务器的详细流程
Jun 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中与数组相关的函数
2007/03/22 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
angular中使用路由和$location切换视图
2015/01/23 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
通过python爬虫赚钱的方法
2019/01/29 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
Python datetime包函数简单介绍
2019/08/28 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
python语言是免费还是收费的?
2020/06/15 Python
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
运动会广播稿200米
2014/01/27 职场文书
中学自我评价
2014/01/31 职场文书
高中军训感言400字
2014/02/24 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
毕业典礼致辞
2015/07/29 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
java调用Restful接口的三种方法
2021/08/23 Java/Android
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
Python&Matlab实现樱花的绘制
2022/04/07 Python