旅行售货员问题及其近似算法(NPC问题)

2023-10-31

一、基本介绍

设有n个城镇,已知每两个城镇之间的距离,一个售货员从某一城镇出发巡回售货,问这个售货员应如何选择路线,能使每个城镇经过一次且仅一次,最后返回到出发地,而使总的费用最少?这就是旅行售货员问题。

哈密顿(Hamilton)圈:给定一个图G(V,E),如果G中的圈C恰好经过每一个顶点仅一次,则称该圈C为哈密顿圈。

旅行售货员问题就是在一个赋权完全图中找一个具有最小权哈密顿圈,即找到一个圈经过每个点仅一次,并且总权值最小,我们称这种圈为最优哈密顿圈。而哈密顿圈问题也是NPC问题的一种,故旅行售货员也是NP完全问题。
在这里插入图片描述

二、问题解法

旅行售货员问题可以对以下四种方法进行讨论:在这里插入图片描述

2.1 枚举法(穷举法)

在这里插入图片描述
设图G=(V,E)是一个带权图,权值代表两个城镇间的所需费用,旅行售货员问题要找出费用最小的周游路线。
旅行售货员问题的解空间可以组织成一棵树,从树的根节点到任一叶子节点的路径,如图。

假设有n个城市,从第一个城市走到第二个城市有n-1种走法,第二个到第三个有n-2种走法,… ,因而共有(n-1)!种解法。如下图,n=4时,第0层到第1层—3种走法,第1层到第2层—2种走法,第2层到第3层—1种走法,(4-1)!=3!=6。
在这里插入图片描述

若考虑顶点V1V2…VnV1和V1Vn…V2V1是同一条回路(经过顶点和边相同),如下图,则剩下不同的回路还有一半,即(n-1)!/2。
在这里插入图片描述

为了比较权的大小,对每条哈密顿回路需要做n次加法,总和为[(n-1)!/2]×n,时间复杂度为O(n!),这种级别计算量显然不可取,我们需要的目标复杂度是O(nk),即多项式。

2.2 回溯法

旅行售货员问题的解空间是一棵排列树。
回溯算法backtrack描述如下(深度优先搜索—假设先序):
1、当i=n时,当前扩展结点是排列树叶子结点的父结点
①检测图G是否存在一条从顶点x[n-1]到顶点x[n]的边和一条从顶点x[n]到顶点x[1]的边。
②如果这两条边都存在,则找到一条旅行员售货回路。
③此时,算法还需要判断这条回路的总权值是否优于已找到的当前最优的路线bestc
④如果是,则必须更新当前最优值bestc和当前最优解
在这里插入图片描述

2、当i<n时,当前扩展结点位于排列树的第i-1层
①图G中存在从顶点x[i-1]到顶点x[i]的边时,x[1:i]构成图x[1:i]的总权值小于当前最优值时算法进入树的第i层
②否则将剪去相应的子树。
在这里插入图片描述
backtrack最坏情况下,需要每条路都走一遍,即(n-1)!种走法,时间复杂度O(n!)

2.3 分支限界法

分支限界法常以广度优先或最大效益优先的方式搜索问题的解空间树。
优先队列式分支限界法:按优先级选取优先级最高的下一个结点为当前的扩展结点,权值越小优先级越高。
在这里插入图片描述

算法描述:
①准备工作:建立小根堆,用于存储活动节点。计算每个顶点的最小出边,若存在某个顶点没有出边,则算法终止。初始化树根(顶点1)为第一个活动节点。
②判断节点是否是叶结点的父节点:是的话,则检查是否一定有最低耗费,若是加入小根堆不是叶结点的父节点,则生成子节点,并判断子节点是否有可能取得最低耗费,若可能则加入小根堆。
③取出下一个节点作为活动节点,若该节点已经是叶结点,返回当前最低耗费值,即为最优旅行。若不是叶结点则循环2、3步。

分支限界法扩展步骤:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个26,一个29均大于25,故(1,3,2,4,1)即为最优路线
分支限界法时间复杂度:O(n2×2n)
其中搜索O(2n),对每个结点计算O(n2)

2.4 旅行售货员问题近似算法

该算法抽象出旅行售货员问题具有一些特殊性质。如费用函数c往往具有三角不等式性质,即对任意3个顶点u,v,w有c(u,w)<=c(u,v)+c(v,w)。在该条件下,且算法找出的旅行售货员回路的费用不会超过最优费用的2倍(三角形性质),旅行售货员问题仍为NP完全问题。

算法描述:
①选择图G的任意一点作为根顶点(此处选顶点a)
②用Prim算法找出带权图G以a为根的最小生成树T
③先序遍历最小生成树得到顶点表L
④将a加到表L的末尾,并将完全遍历后的顶点集合写出,得到一条旅行回路H={abchdefga}
在这里插入图片描述

采用朴素Prim算法时间复杂度为O(n^2),若继续用二叉队优化Prim算法可达到O(elog(v))。其中e为边,v为结点。

三、总结

我们可以得到四个算法的时间复杂度
1、枚举法 O(n!)
2、回溯法 O(n!)
3、分类限界法 O(2n)
4、NP近似算法(旅行者问题近似算法) O(n2) √
在这里插入图片描述
故该旅行售货员近似算法最好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

旅行售货员问题及其近似算法(NPC问题) 的相关文章

随机推荐

  • 【LVGL事件(Events)】事件在不同组件上的应用(一)

    点击 滑动 输入 数字改变等等都可触发事件 事件就是针对不同的操作做出相对应的反应 最近看到组态屏 这玩意开发起来好像挺简单的 哈哈哈 研究完LVGL的事件就看看这个 LVGL事件 Events 事件代码 喜暖知寒的博客 CSDN博客LVG
  • 如何监听edittext输入完成

    转载于 http blog csdn net harryweasley article details 50395209 假如你要做这样的一个功能 通过在编辑框输入一些字符进行搜索 输入完成后 再显示搜索结果 在输入的过程中 并不想一直通知
  • ffmpeg命令行太多了_如何使用FFmpeg从视频中删除多个片段?

    我编写了一个脚本来加快编辑录制的电视的速度 该脚本会询问您要保留的段的开始和结束时间 并将其拆分为文件 它为您提供了选择 您可以 采取一个或多个细分 您可以将这些段合并为一个结果文件 加入后 您可以保留或删除零件文件 您可以保留原始文件或将
  • python爬虫-单线程爬取图片

    今天我们准备使用爬虫来爬取一些图片首先我们找到其url页面 https pvp qq com web201605 wallpaper shtml 进入之后当我们点击跳转页面的时候 发现其上方的网址没有发生变化 如果不发生变化的话就不可以进行
  • 【TensorFlow】tf.nn、tf.layers和tf.contrib模块

    转自 https blog csdn net u014365862 article details 77833481 我们在使用tensorflow时 会发现tf nn tf layers tf contrib模块有很多功能是重复的 尤其是
  • Aware&原理---Spring源码从入门到精通(十四)

    上篇文章主要介绍 Autowired自动装配 1 Bean注解 传参在方法上 自动装配 参数会从ioc容器从获取 2 有参构造器如果只有一个的情况下 也可以省略 Autowired不写 自动装配 感兴趣的同学可以点进去看看 自动装配构造器
  • php 代码需要重写注释_不要注释错误的代码-重写它

    php 代码需要重写注释 在这篇文章中 我将分享我通过阅读代码 编写代码和阅读书本获得的 代码注释 的经验 让我们从著名的报价开始 Don t comment bad code rewrite it Brian W Kernighan an
  • 第一章 安装OpenResty(Nginx+Lua)开发环境

    首先我们选择使用OpenResty 其是由Nginx核心加很多第三方模块组成 其最大的亮点是默认集成了Lua开发环境 使得Nginx可以作为一个Web Server使用 借助于Nginx的事件驱动模型和非阻塞IO 可以实现高性能的Web应用
  • 华为OD机试 - 运维日志排序(Java)

    题目描述 运维工程师采集到某产品线网运行一天产生的日志n条 现需根据日志时间先后顺序对日志进行排序 日志时间格式为H M S N H表示小时 0 23 M表示分钟 0 59 S表示秒 0 59 N表示毫秒 0 999 时间可能并没有补全 也
  • 软件测试面试题及答案

    软件测试面试题及答案 以下是软件测试相关的面试题及答案 欢迎大家参考 1 你的测试职业发展是什么 测试经验越多 测试能力越高 所以我的职业发展是需要时间积累的 一步步向着高级测试工程师奔去 而且我也有初步的职业规划 前3年积累测试经验 按如
  • nvm、node、npm、node-sass版本相关问题

    node js的运行环境 npm 管理js的第三方插件 node modules nvm 管理node的版本 不同的项目可能使用的node的版本不同 使用nvm可以快速下载不同版本的node 和切换不同版本的node 1 下载nvm 下载地
  • 首富王健林:万达管理员工的20条天规!

    为现今亚洲首富的王健林 在公司员工管理方面必有他的过人之处 今天 我们带您看看他对员工从团队利益到个人价值 以及做人准则方面的要求 深刻体现出一个优秀企业的管理根基 值得大家一看 第1条天规 公司利益高于一切 公司是全体员工的生存平台 个人
  • nginx绑定多个端口

    有两种方法 一 在server段写上2个Listen就可以了 listen 192 168 0 15 808 listen 192 168 0 15 8098 如上 就可以同时监听2个端口了 二 在 nginx conf 中配置多个个ser
  • js实现调用摄像头拍照功能

    js实现调用摄像头拍照功能
  • Vim使用转义字符来实现特殊字符的替换

    Vim中字符替换 举个例子 以全局替换为例 s old new g 可以实现整篇文档的字符old替换成字符new 但是如果存在特殊字符的替换 s new g 即要实现字符 和字符new 的替换 由于存在特殊字符 以上写法肯定是替换不成功的
  • FastJson 处理泛型

    阿里的 FastJson 一直都很好用 在进行对象转换映射上处理起来非常简单 但今天我才发现我一直都是在瞎用 之前解析Map的方式是这样的 Map map JSON parseObject name zhangsan address han
  • OpenGL学习随笔(五)——2022.2.7

    通过前面的学习 已经了解了OpenGL渲染的主要流程和基础的数学知识 接下来继续学习如何管理3D图形数据 在本回中将会绘制一个立方体 一 缓冲区和顶点属性 要想绘制一个对象 它的顶点数据需要被发送给顶点着色器 在C OpenGl程序中 通常
  • JavaBean学习笔记

    一 JavaBean的概述 JavaBean 是一种Java语言写成的可重用组件 JavaBean 是指符合如下标准的Java类 类是公共的 有一个无参的公共的构造器 有属性 且有对应的get set方法 二 JavaBean的作用 用户可
  • opencv打不开usb摄像头 V4L: can't open camera by index 0

    使用opencv中的videocapture读取usb摄像头 打开失败 提示索引号不对 在网上找到了解决方案 v4l2 ctl list devices 即可获得摄像头的index 我的如下 H264 USB Camera usb fe38
  • 旅行售货员问题及其近似算法(NPC问题)

    旅行售货员问题 一 基本介绍 二 问题解法 2 1 枚举法 穷举法 2 2 回溯法 2 3 分支限界法 2 4 旅行售货员问题近似算法 三 总结 一 基本介绍 设有n个城镇 已知每两个城镇之间的距离 一个售货员从某一城镇出发巡回售货 问这个