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 23 Python
python3编写C/S网络程序实例教程
Aug 25 Python
安装Python的web.py框架并从hello world开始编程
Apr 25 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
超简单使用Python换脸实例
Mar 27 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
python对execl 处理操作代码
Jun 22 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 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无刷新上传文件实现代码
2011/09/19 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
php防止sql注入简单分析
2015/03/18 PHP
php实现URL加密解密的方法
2016/11/17 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
js实现简单的打印表格
2020/01/15 Javascript
python 中split 和 strip的实例详解
2017/07/12 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
上海天奕面试题笔试题
2015/04/19 面试题
重阳节登山活动方案
2014/02/03 职场文书
公交公司毕业生求职信
2014/02/15 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server