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 快速排序代码
Nov 23 Python
Django的session中对于用户验证的支持
Jul 23 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
Python 字符串换行的多种方式
Sep 06 Python
Django 模型类(models.py)的定义详解
Jul 19 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
python单例设计模式实现解析
Jan 07 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
Python类及获取对象属性方法解析
Jun 15 Python
pytorch损失反向传播后梯度为none的问题
May 12 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 Ajax中文乱码问题解决方法
2009/02/27 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
python 如何调用 dubbo 接口
2020/09/24 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
优良学风班总结材料
2014/02/08 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
学校隐患排查制度
2015/08/05 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS