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程序的执行效率的教程
Apr 02 Python
python执行get提交的方法
Apr 29 Python
python使用PyGame模块播放声音的方法
May 20 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
微信跳一跳自动运行python脚本
Jan 08 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
python根据文本生成词云图代码实例
Nov 15 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 Python
python中的getter与setter你了解吗
Mar 24 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
公务员培训自我鉴定
2013/09/19 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
宾馆客房管理制度
2015/08/06 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android