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导入txt数据到mysql的方法
Apr 08 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
不可错过的十本Python好书
Jul 06 Python
教你学会使用Python正则表达式
Sep 07 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
python datetime时间格式的相互转换问题
Jun 11 Python
python代码中怎么换行
Jun 17 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
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python功能键的读取方法
2015/05/28 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python中一些深不见底的“坑”
2019/06/12 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
开学典礼感言
2014/02/16 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
岗位廉政承诺书
2014/03/27 职场文书
实习评语大全
2014/04/26 职场文书
项目建议书
2015/02/04 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android
详解MySQL的内连接和外连接
2023/05/08 MySQL