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爬虫的基本写法
Jan 08 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
python:print格式化输出到文件的实例
May 14 Python
python中csv文件的若干读写方法小结
Jul 04 Python
人工神经网络算法知识点总结
Jun 11 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
Python实现自动装机功能案例分析
Oct 22 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
JQuery小知识
2010/10/15 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
django的settings中设置中文支持的实现
2019/04/28 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
简历中的自我评价范文
2014/02/05 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
税务会计岗位职责
2015/04/02 职场文书
学籍证明模板
2015/06/18 职场文书
golang内置函数len的小技巧
2021/07/25 Golang
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技