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 14 Python
用Python实现一个简单的线程池
Apr 07 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
python读取二进制mnist实例详解
May 31 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
Python之用户输入的实例
Jun 22 Python
python用for循环求和的方法总结
Jul 08 Python
Django发送邮件功能实例详解
Sep 02 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python路径的写法及目录的获取方式
Dec 26 Python
python 实现有道翻译功能
Feb 26 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错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python编程中的for循环语句学习教程
2015/10/14 Python
python分析作业提交情况
2017/11/22 Python
Django入门使用示例
2017/12/12 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
python aiohttp的使用详解
2019/06/20 Python
在django模板中实现超链接配置
2019/08/21 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
上班迟到检讨书
2014/01/10 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
党课培训主持词
2014/04/01 职场文书
小学教师评语大全
2014/04/23 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
索赔员岗位职责
2015/02/15 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
周一给客户的问候语
2015/11/10 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis