是否有经过充分研究的优化来找到穿过图形中每个加权边的最短路径?

2023-11-24

我一直在四处寻找,但似乎每个人最喜欢的问题都有一个稍微不同的情况:TSP、哈密顿量、欧拉等。我有一个图,由 V(顶点)和 E(边)表示,其中每条边是无向的,并且有一定的遍历成本。我想以最小的成本遍历每一条边,并可能重复。

直观上,这个问题感觉是 NP 难问题,因为它与其他 NP 难问题密切相关。然而,我意识到由于路径可以重复边缘,因此可能更容易。

我的第一个想法是将边转换为顶点,将顶点转换为节点,并尝试像哈密顿量一样对其进行分析。然而,这有每个节点只能访问一次的限制,而且我找不到任何关于放松可以多次访问节点的问题的信息。

有谁知道我是否只是不擅长搜索,这实际上是一个已知和研究的问题?


这是什么

你正在考虑中国邮递员问题,也称为路线检查问题或邮递员旅行。

它能做什么

该问题要求图的最短/最小成本游览,该图访问每个边至少一次。这被称为中国邮递员之旅(CPT)解决此问题可以让您在其他应用程序中:

  • 找到校车或邮件投递的最佳路线,其中必须访问所有街道来接送乘客/投递邮件,并且巴士不限于仅访问街道一次。其他例子包括扫雪机路线、公路部门在街道上画线,或者警车试图按节奏访问每条街道。

  • 描述机器的复杂性和/或优化测试该机器。例如,按下手机上的按钮就像在状态之间选择一条有向边。菜单出现,菜单关闭。如果您知道手机可能处于的所有状态,那么求解 CPP 将为您提供测试所有状态转换的最佳计划。该计划的长度是对机器复杂性的衡量。例如,诺基亚 2110 移动电话有一个包含 88 个菜单项和 273 个操作的菜单子系统。该系统的 CPT 的按钮按下次数为 515 次。 [1]

无向图

这是最初的问题,由关美高1960 年。他的论文于 1962 年被翻译成英文。 [2] 此后不久,研究表明该问题可以简化为匹配问题,因此可以使用线性规划在多项式时间内求解。 [3]格罗切尔等人。简单介绍一下这方面的历史。 [5]

要解决该问题,请注意该图必须是单个图连通分量.

如果图是单个连接组件并且所有节点都有偶数degree,那么该图有一个欧拉路径。该路径可以在O(|E|)时间使用Hierholzer 算法。如果不是所有的节点都有偶数度,那么我们需要一个更强大的算法。

观察到,如果一个图有两个奇数度的节点,添加连接它们的附加边将导致多图其中每个节点的度数为偶数。根据上面的内容,这样的图有一个容易找到的欧拉路径。进一步:无论采取哪条路线,必须遍历多次的边将连接两个奇数度的节点。很容易看出原因:向其中一个奇数度节点添加一条边使其成为偶数度,但使与该边相关的另一个节点具有奇数度。获得仅包含偶数度节点的图的唯一方法是在两个奇数度节点之间建立一条路径。为了最小化多重图上欧拉路径的成本,我们应该沿着两个奇数度节点之间的最小成本路径添加额外的边。这可以通过以下方式找到:迪杰斯特拉算法.

现在,想象一下我们有2n奇数节点。通过对上述内容的一些思考,您可以说服自己,您将需要n连接这些顶点对的不同的、不重叠的路径。知道这一点,解决问题的一种方法是使用Floyd-Warshall 算法计算奇数度节点之间的所有对最短路径O(|V|³)时间。然后可以找到最大加权匹配O(|E|*|V| 日志 |V|)时间。 [4]

迈克尔斯对此有一篇简单的文章以及一些直观的证明。 [6] Laporte 提供了更技术性的描述,将匹配问题转换为线性整数规划。 [7] 艾塞尔特等人。给出另一个技术描述以及对相关问题的相当广泛的审查(见下文)。 [8]

其他一些变体

由于我们总是只需要一个想法就可以使算法问题变得更加困难,因此以下是一些可能令人感兴趣的变体:

  • 完全有向图:只有当图形是时,这里才存在解决方案强关联(有快速测试为了这)。要找到解决方案,请查找O(|E|)计算每个顶点的入度和出度之间的差值。然后解决了一个多有限源网络问题:每个节点根据其输入输出差异来生产或消耗流量。该问题已解决,以求最小权重最大流量O(|V|² |E|)时间。沿着一条边的流量是必须插入到它旁边才能形成欧拉图的平行边的数量。欧拉之旅可以在O(|E|)时间使用Hierholzer 算法。 Harold Thimbleby 提供了一个记录良好的 Java 实现(参见 [1],还有他的website).

  • 具有有向边和无向边的图:这个问题是NP完全问题。即使图表是这样,它仍然如此planar,节点的总度数最多为 3,所有边的成本等于 1。这就是说,即使在严重受限的情况下,混合图也是一个难题。 [9]

  • 无向树图:树的每条边都会被访问两次。有一些快速方法可以确定图是否是树:请参阅this维基页面。

  • 欧拉游览图:欧拉巡演就是CPT。有一些快速方法可以确定图是否为欧拉图:请参阅this维基页面。

  • 必须根据优先级访问边的图: 这是等级制度菲律宾人民党。它并不总是可以解决的。当它是时,它可以是 NP 完全的。但是,在某些条件下,有一个O(N⁵)算法。 [10]

  • 带时间窗口的图表:在此公式中,每条边都与一个时间范围相关联[le,ue]在此期间必须完成边缘。例如,当街道清扫工正在清洁街道并且某些街道被要求在不同时间禁止车辆时,就会出现这样的问题。该问题是NP-hard问题,可以通过约束规划精确解决。 [11]

  • 你不需要访问所有的边缘: 这被称为农村邮递员问题。对于有向和无向情况,这个问题都是 NP 困难的。具有有向边和无向边的实例(堆垛机问题) 也是 NP 困难的。请参阅[12]进行评论。

  • 边的代价根据遍历方向的不同而不同: 这被称为有风的邮递员问题。这个问题是NP完全问题。 [13]

[1] Thimbleby, H. 2003。定向中国邮递员问题。软件:实践。专家,33:1081-1096。 doi:10.1002/spe.540

[2] 关美高. 1962. 使用奇数点或偶数点的图形编程,中国数学 1,第 273-277 页。

[3] Edmonds, J., Johnson, E.L., 1973。匹配、欧拉之旅和中国邮递员。数学规划 5, 88–124。

[4] Galil, Z.、Micali, S.、Gabow, H. 1986。用于在一般图中查找最大加权匹配的 O(EV log V) 算法。 SIAM J.Comp。 15、120-130。

[5] Grötschel, M., Yuan, Y., 2012。欧拉、关美子、柯尼斯堡和一位中国邮递员。优化故事 43.

[6] Michaels, J.G., 1991。第 20 章:中国邮递员问题,载于:离散数学的应用。麦格劳-希尔高等教育,第 354-364 页。

[7] Laporte, G., 2014。第 3 章:无向中国邮递员问题,见:弧路由。第 53–64 页。

[8] Eiselt, H.A.、Gendreau, M.、Laporte, G., 1995。弧路由问题,第一部分:中国邮递员问题。运筹学 43, 399–414。

[9] Papadimitriou, C.H., 1976。关于边缘遍历的复杂性。 ACM 杂志 (JACM) 23, 544–554。 (如果这个Papadimitriou的名字看起来很熟悉,可能你认出他是《星球大战》中的角色)逻辑混合).

[10] Dror, M.、Stern, H. 和 Trudeau, P. (1987),Postman 在弧上具有优先关系的图上游览。网络,17:283-294。 doi:10.1002/net.3230170304

[11] U. F. AMINU 和 R. W. EGLESE,针对具有时间窗口的中国邮递员问题的约束规划方法,计算机与运筹研究,33 (2006),第 3423–3431 页。

[12] Eiselt, H.A.、Gendreau, M.、Laporte, G.,1995。弧路由问题,第二部分:农村邮递员问题。运筹学 43, 399–414。

[13]关美谷(1984),“关于大风邮差问题”,离散应用数学,9(1):41-46,doi:10.1016/0166-218X(84)90089-1,MR 754427。

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

是否有经过充分研究的优化来找到穿过图形中每个加权边的最短路径? 的相关文章

  • Facebook Workplace API 身份验证

    我正在开发一个与 Facebook 的 Workplace 集成的 Web 应用程序 我花了一整天的时间试图弄清楚如何使用 OAUTH 身份验证机制进行成员身份验证 由于我拥有应用程序访问令牌 我能够获取用于模拟的成员访问令牌 但是 我如何
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何在matplotlib中部分填充之间,如不同值的不同颜色

    I m trying to color the space between the graph line and the x axis The color should be based on the value of the corres
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • 您将如何显示/布局企业应用程序之间的数据流?

    我的雇主是一家大型瑞士电信公司 我们有许多系统用于为不同任务传输数据 例如性能管理 故障管理 配置管理等 为了向 管理 尖头等 解释这些系统如何交互 我将有关数据流 格式 协议的信息收集到 数据库 逗号分隔的说服者 中 然后为 Graphv
  • 在大文件中查找重复项

    我有一个非常大的文件 大约有 1500 万个条目 文件中的每一行都包含一个字符串 称为键 我需要使用 java 查找文件中的重复条目 我尝试使用哈希图并检测重复的条目 显然 这种方法向我抛出了 java lang OutOfMemoryEr
  • 使用 Haskell 绘制图表

    是否可以使用 Haskell 绘制一个简单的图表 你们中的任何人都可以告诉我该怎么做吗 该图应至少包含 3 个点 Haskell 图表 https github com timbod7 haskell chart似乎不错 The wiki
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 查找数组中的重叠数据

    我们正在编写一个 C 应用程序 它将有助于删除不必要的数据重复器 只有在以下情况下才可以移除中继器 all它接收到的数据被其他中继器接收 我们第一步需要做的事情解释如下 例如 我有 int 数组的集合 A 1 2 3 4 5 b 2 4 6
  • n的渐近增长选择下限(n/2)

    如何找到 n select Floor n 2 的渐近增长 我试过 使用扩展并得到它等于 n n 1 floor n 2 1 n floor n 2 知道我该如何从那里去吗 感谢任何帮助 更喜欢提示而不是答案 我同意上面的答案 但想提供更多
  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • 大小为 n 的数组,其中一个元素 n/2 次

    给定一个由 n 个整数组成的数组 其中一个元素出现超过 n 2 次 我们需要在线性时间和恒定的额外空间中找到该元素 YAAQ 又一个数组问题 我有一种偷偷的怀疑 这类似于 在 C 中 We don t need an array publi
  • 如何以最小化每个分区总和的最大值的方式对整数数组进行分区?

    输入是正整数或空整数的数组 A 和另一个整数 K 我们应该将 A 划分为 K 个连续元素块 我所说的 划分 是指 A 的每个元素都属于某个块 并且 2 个不同的块不包含任何共同元素 我们将块的总和定义为该块的元素的总和 目标是在 K 个块中
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 模式识别算法

    过去我必须开发一个充当规则评估器的程序 你有一个先行词和一些后续词 动作 所以如果先行词评估为真 则执行的动作 当时我用的是修改版RETE算法 http en wikipedia org wiki Rete algorithm RETE 有
  • 在 O(n) 时间内对列表中的数字方块进行排序?

    给定一个按排序顺序排列的整数列表 例如 9 2 0 2 3 我们必须对每个元素进行平方并按排序顺序返回结果 所以 输出将是 0 4 4 9 81 我可以找出两种方法 O NlogN 方法 我们将每个元素的平方插入哈希集中 然后将元素复制到列
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 为什么我的 Python 散点图不起作用?

    我使用 pylab 创建了一个非常简单的散点图 pylab scatter engineSize fuelMile pylab show 该程序的其余部分不值得发布 因为正是该行给我带来了问题 当我将 散点 更改为 绘图 时 它会绘制数据图

随机推荐

  • iOS 7 自定义后退按钮

    我想使用自定义后退按钮 在 iOS 6 中 一切都很完美 但是iOS 7很奇怪 UIBarButtonItem appearance setBackButtonBackgroundImage UIImage imageNamed back
  • org.openqa.selenium.InvalidCookieDomainException:使用 Selenium 和 WebDriver 文档不支持 cookie

    我正在尝试将 cookie 推送到从上一个会话存储的 selenium firefox webdriver 但出现错误 org openqa selenium InvalidCookieDomainException Document is
  • UIPanGestureRecognizer 起点已关闭

    我有一个 UIView 它附加了一个 UIPanGestureRecognizer 手势工作正常 只是起点不是平移第一次开始的位置 它通常在 x 和 y 坐标中偏离 5 到 15 个像素 不幸的是 方差不是一致并且似乎与平移运动发生的速度有
  • 使用 php 向后读取文件行(fgets)

    我有一个txt文件 我想向后阅读 目前我正在使用这个 fh fopen myfile txt r while line fgets fh echo line br 这将输出我文件中的所有行 我想从下到上阅读这些行 有办法做到吗 第一种方式
  • C# 服务:如何获取用户配置文件文件夹路径

    我需要从 C windows 服务中获取用户目录 比如 C Users myusername 理想情况下 我希望有漫游路径 就像 C Users myusername AppData Roaming 当我在控制台程序中使用以下内容时 我得到
  • 匹配结束 HTML 标签的正则表达式

    我正在编写一个小型 Python 脚本来清理 HTML 文档 它的工作原理是接受要保留的标签列表 然后解析 HTML 代码 丢弃不在列表中的标签我一直在使用正则表达式来做到这一点 并且我已经能够匹配开始标签和自关闭标签但不关闭标签 我一直在
  • 如何自动生成日期属性为 Date 而不是 NSDate 的 NSManagedObject 子类?

    我目前正在将我的项目更新到 Swift 3 并将所有 NSDate 方法和扩展移至 Date 以便在应用程序中保持标准 问题是我使用 Xcode 自动生成 NSManagedObject 子类 并且它生成日期属性为 NSDate 而不是 D
  • Spring:如何在运行时更改接口实现

    作为一名 Java 开发人员 我经常需要在接口的不同实现之间进行选择 有时这种选择是可以做到的once 而有时我需要不同的实现来响应我的程序收到的不同输入 换句话说 我需要能够change运行时执行 这可以通过帮助程序对象轻松实现 该对象将
  • 根据行数据更新 DatagridView 单元格背景颜色

    您好 我有一个 DatagridView 我希望它根据每行中的数据更改背景颜色 Ex 人 1 人 2 人 3 100 200 150 300 100 50 在第一行中 我希望它使 100 具有红色背景颜色和 200 绿色 或者 最低值 红色
  • Python 中连接字符串的最有效方法

    在问这个问题时 我正在使用Python 3 8 当我说高效时 我只是指字符串连接的速度 或者用更专业的术语来说 我问的是时间复杂度 而不是考虑空间复杂度 目前我能想到的唯一方法是以下 3 种 a start b end Method 1 r
  • 如何从 .cab 文件安装 mscomct2.ocx 文件(Excel 用户表单和 VBA)

    我有一个 Excel 电子表格 其中包含使用日历控件的用户表单 它在我的机器上运行良好 但其他人无法使用它 因为他们缺少 mscomct2 ocx 文件 我找到了下载地址 http support microsoft com kb 2973
  • Angular2将数据映射为特定对象类型

    我根据 Angular2 教程创建了一个非常简单的应用程序 首先 我有一个非常简单的 Book 模型 book model export class Book public data constructor param id param t
  • 沿二维图像切片进行插值

    我有一套100相同大小的二维图像切片 我使用 MATLAB 将它们堆叠起来以创建体积数据 虽然二维切片的大小为 480x488 像素 但图像堆叠的方向不够宽 无法在投影时以不同方向可视化体积 我需要沿着切片进行插值以增加可视化的大小 有人可
  • Pandas 将具有 unix 时间戳(以毫秒为单位)的行转换为日期时间

    我需要处理大量 CSV 文件 其中时间戳始终是表示 UNIX 时间戳 以毫秒为单位 的字符串 我还找不到有效修改这些列的方法 这是我想到的 但是这当然只复制了列 我必须以某种方式将它放回原始数据集 我确信在创建时可以完成DataFrame
  • 不同组的不同子布局 ExpandableListView

    我在尝试执行此操作时遇到了问题 我似乎无法做到这一点 我想控制每个父母 该父母的孩子 ExpandableListView一直让我头疼 包评论 public class CommentsExpandableListAdapter exten
  • 对整数的多维向量进行排序?

    不管你信不信 当我搜索这个时 我想出了什么 如何对多维数据进行排序vector of int是在其中一根 柱子 旁边吗 提前谢谢了 C res mysql perform query conn SELECT column1 column2
  • 无法使用 rbenv 安装 RMagick

    我在 Ubuntu 10 04 服务器上使用 rbenv 并且已经安装了 ImageMagick 但无法成功安装 RMagick 我收到以下错误消息 Can t install RMagick 2 13 1 Can t find Magic
  • Microsoft Edge 中的集成 Windows 身份验证

    我正在尝试在 Edge 上实施集成 Windows 身份验证 但它总是提示我输入凭据 而集成 Windows 身份验证适用于 IE Chrome 和 Firefox 我尝试在安全选项中将该站点添加到本地 Intranet 站点并启用自动登录
  • 如何等待所有任务完成而不阻塞 UI 线程?

    在下面的代码中 我在处理任务之前禁用按钮 并希望在所有任务完成后启用它 List
  • 是否有经过充分研究的优化来找到穿过图形中每个加权边的最短路径?

    我一直在四处寻找 但似乎每个人最喜欢的问题都有一个稍微不同的情况 TSP 哈密顿量 欧拉等 我有一个图 由 V 顶点 和 E 边 表示 其中每条边是无向的 并且有一定的遍历成本 我想以最小的成本遍历每一条边 并可能重复 直观上 这个问题感觉