【问题标题】:Algorithm to cover all edges given starting node给定起始节点覆盖所有边的算法
【发布时间】:2013-09-18 14:42:59
【问题描述】:

我正在和朋友一起开发一款游戏的算法,但我们陷入了困境。目前,我们有一个循环无向图,我们正在尝试从起始节点 S 找到覆盖每条边的最快路径。我们不是在寻找旅行,可能会有重复的边缘。

关于算法或近似的任何想法?我确定这个问题是 NP-hard,但我不相信它是 TSP。

【问题讨论】:

  • 只是检查一下,最快的意思是最短的,即边缘最少的吗?
  • 它必须覆盖所有边,但是使用从起始节点开始的最短路径,它是一个类似树的图,所以你可能有死胡同,你必须重复边才能回溯
  • 如果是树就做DFS?
  • 如果我们要搜索目标节点,DFS 会很棒,但我看不出它对确定覆盖所有边的最短路径有何帮助
  • 它真的是一棵树吗?在这种情况下,如果您在访问每个节点之前不停止 DFS,它将至少访问每个边一次。

标签: algorithm graph path shortest-path edges


【解决方案1】:

路线检查

这被称为route inspection problem,它确实有一个多项式解。

基本思想(有关详细信息,请参阅链接)是欧拉路径很容易求解(我们访问每条边一次),但欧拉路径仅适用于某些图。

特别是,一个图必须是连通的并且有 0 或 2 个奇数度的顶点。

但是,可以通过以最便宜的方式添加额外的边来将其推广到其他图,从而生成具有欧拉路径的图。 (请注意,我们添加了更多边,因此我们可能会在原始图中的边上多次移动。)

选择添加额外边的最佳方式是一个最大匹配问题,可以在 O(n^3) 内解决。

附言

顺便说一句,我今天早些时候写了一个简单的演示 (link to game),用于解决平面最大切割问题。这个解决方案原来是基于完全相同的路由检查问题:)

编辑

我刚刚从 cmets 中发现,在您的特定情况下,您的图表可能是一棵树。

如果是这样,那么我相信答案要简单得多,因为您只需要对树进行 DFS,确保首先访问最浅的子树。

例如,假设您有一棵树,其边为 S->A 和 S->A->B。 S 有两个子树,你应该先访问 A,因为它比较浅。

访问的总边数等于完整 DFS 中访问的边数减去最后访问的叶子的深度,这就是为什么要最小化总边数以最大化最后一个叶子的深度,因此访问首先是最浅的子树。

【讨论】:

    【解决方案2】:

    这有点像Eulerian Path。主要区别在于可能存在死胡同,您可以修改算法以满足您的需求。修剪死胡同是一种选择,或者您可以将图形减少为许多连接的组件。

    【讨论】:

      【解决方案3】:

      DFS 将在这里工作。但是,您必须具有良好的评估功能才能尽早修剪分支。否则你不能快速解决这个问题。你可以参考我这里的Java讨论和实现http://www.capacode.com/?p=650

      我的评估函数的详细信息 我的第一个尝试是如果当前路径的长度加上从 U 到 G 的距离不短于我们找到的最小长度(存储在 minLength 变量中),我们将不会访问 U 下一个,因为它不能引导更短的路径。

      实际上,上面的评估函数效率不高,因为它只在我们已经访问了大部分城市的情况下才有效。我们需要更精确地计算所有访问过的城市到达 G 的最小长度。

      假设s是从S到U的长度,从U到访问G并经过所有城市,长度至少为s' = s + ∑minDistance(K) 其中K是未访问城市,与U不同; minDistance(K) 是从 K 到未访问状态的最小距离。基本上,对于每个未访问的州,我们假设我们可以以最短的边到达那个城市。请注意,那些最短的边可能不会构成有效路径。那么,如果 s' ≥ minLength,我们将不会访问 U。

      使用该评估功能,我的程序可以在 1 秒内处理 20 个城市的问题。我还添加了另一个优化以进一步提高性能。在运行程序之前,我使用贪心算法来获得一个好的 minLength 值。具体来说,对于每个城市,我们接下来会访问最近的城市。原因是当我们的 minLength 较小时,我们可以修剪得更多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多