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基础之基本运算符概述
Aug 13 Python
使用IPython来操作Docker容器的入门指引
Apr 08 Python
Python输出9*9乘法表的方法
May 25 Python
python线程池threadpool实现篇
Apr 27 Python
python实现整数的二进制循环移位
Mar 08 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
Pymysql实现往表中插入数据过程解析
Jun 02 Python
pycharm全局搜索的具体步骤
Jul 28 Python
python实现自动清理文件夹旧文件
May 10 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
3.从实例开始
2006/10/09 PHP
人大复印资料处理程序_补充篇
2006/10/09 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
PHP 时间日期操作实战
2011/08/26 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
php中memcache 基本操作实例
2015/05/17 PHP
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
解决vue移动端适配问题
2018/12/12 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
npm qs模块使用详解
2020/02/07 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
python中的decimal类型转换实例详解
2019/06/26 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
大学新生军训自我鉴定
2014/03/18 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
2019入党申请书格式
2019/06/25 职场文书
nginx内存池源码解析
2021/11/20 Servers
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android