【问题标题】:Finding the shortest path to visit all non-blocked squares on a grid找到访问网格上所有非阻塞方格的最短路径
【发布时间】:2011-02-21 23:44:15
【问题描述】:

假设你有一个这样的网格(随机制作):

现在假设您有一辆随机从其中一个白框出发的汽车,通过每个白框的最短路径是什么?您可以根据需要多次访问每个白框,并且不能跳过黑框。黑匣子就像墙壁。简而言之,您只能从白盒移动到白盒。

你可以向任何方向移动,甚至是对角线。

两个子问题:

  1. 假设您在移动之前知道所有黑框的位置。
  2. 假设您只有在与黑框相邻的白框中才知道黑框的位置。

【问题讨论】:

  • “通过每个白框的最短路径是什么”?你在这里问什么?你的意思是“去每一个白盒子”吗?
  • 是的..你只需要遍历所有的白框。
  • 要找到最短路径,您必须进行蛮力搜索。你是否知道前面的黑匣子并不重要。
  • 暴力破解?快点! @Rubys 不,它不是重复的..

标签: algorithm path-finding traveling-salesman


【解决方案1】:

虽然基于 TSP 的启发式方法是一种合理的方法,但尚不清楚它是否给出了最佳答案。问题(正如 Moron 指出的那样)是跨越路径问题,在评论中提供的链接中,有许多特殊情况存在线性时间最优解。使 OP 的问题与引用论文中使用的网格图公式不同的一个问题是对角线遍历的能力,这极大地改变了游戏。

【讨论】:

    【解决方案2】:

    Doc 已经知道了。我要补充一点,黑盒子只会改变所有白盒子对之间的距离。进一步阐述 - 如果在任何两个白框之间的对角线上有一个黑框(很容易检查),您需要计算最短路径以获得距离。一旦你有了一个距离矩阵,然后在创建一个到所有其他节点的长度为零的虚拟节点之后通过求解一个 TSP 来求解一个 TSP 或哈密顿路径。

    关键是,为了制定和解决 TSP(或任何与此相关的问题),您必须从一个距离矩阵开始。距离矩阵在开始时没有指定,因此必须从头开始开发。

    【讨论】:

      【解决方案3】:

      您应该将问题建模为一个完整的图形,其中两个节点(白框)之间的距离是这些节点之间最短路径的长度。这些路径长度可以通过Floyd-Warshall 算法计算。然后,您可以将其视为"Traveling salesman",就像glowcoder 写的那样。

      编辑:为了更清楚:您可以通过一系列不同白框来描述迷宫中每条“有趣”的路径。因为如果您有访问每个白盒的任意路径,您可以将其拆分为子路径,每个子路径都以一个迄今为止未访问过的新白盒结束。从白盒 A 到 B 的每个子路径都可以替换为从 A 到 B 的最短子路径,这就是您需要所有节点对之间最短路径矩阵的原因。

      【讨论】:

      • 这很复杂。 TSP 直接适用。为什么要通过 Floyd-Warshall? -1,直到您进一步详细说明。
      • @Moron:来自维基百科,第一句话:“任务是找到一个最短的游览路线,恰好访问每个城市一次”。这就是我的建议所做的:允许将问题视为此类 TSP 问题,即使您必须多次访问每个广场。
      • @Doc:我明白你在说什么。我将删除-1。不过还是挺纠结的。我删除了一个空格以允许我撤消 -1。
      • @Moron:如果你有更好的想法让它“不那么复杂”,请告诉我。
      • @Doc:即使我们找到了最终 TSP 的确切最优解,我们是否真的有原始问题的最优解?为了减少复杂性,至少对于近似算法,存在一些简单的算法,例如最小生成树的欧拉轨迹。这一定是一个经过充分研究的问题。如果您有参考表明您的方法有效,那就太好了!
      【解决方案4】:

      这似乎是一个 NP 完全问题。

      网格图中的哈密顿路径是 NP-Complete 已在此处显示:Hamilton Paths in Grid Graphs

      注意网格图 = 完整网格的子图。

      当然,我没看过那篇论文,所以先确认一下,尤其是允许对角线移动的部分。

      【讨论】:

      【解决方案5】:

      这类似于 Knights Tour 问题,其中一个典型的解决方案是评估从起始广场出发的所有可能路线。当无法完成巡视时,回溯用于返回以备份先前的决定。您的问题更轻松,因为您可以多次访问广场。 Knights tour 和 Traveling Saleman 问题通常要求每个广场只访问一次。

      http://en.wikipedia.org/wiki/Knight's_tour

      【讨论】:

      • 如果您可以多次访问广场,您如何确定何时无法完成游览(因此是时候开始回溯了)?通常这是在所有附近的广场都已被访问时确定的 - 但如果您可以访问它们两次,则不再适用 :-)
      • 您可以进行从正方形到正方形的可达性分析 ​​- 例如评估从源方块到目标方块的所有路径。在这里,你避免了循环,我们只需要一条路径,所以每个方块只被访问一次。举个例子,考虑一块板,中间的黑色方块将它分成两半。你开始的那一半的方格是可以到达的,另一半的方格不是。
      【解决方案6】:

      尝试将其构建为图形(每个节点最多有 8 个其他节点)并将其视为 http://en.wikipedia.org/wiki/Travelling_salesman_problem

      【讨论】:

      • -1 事实上,它可以简化为一个 NP 完全问题(你甚至没有展示),这比告诉他暴力破解没有帮助。
      • @BlueRaja:只是因为你不喜欢这个答案,没有错。我会给glowcoder-1,因为他的回答忽略了TSP通常需要每个城市都被访问一次这一事实,这不是这里的合适模型,因为一个人需要多次访问一些白盒子。
      • TSP 不要求每个都被访问一次。它只关心两个城市之间的最短路径,而不管它是否经过它已经沿途经过的城市。无论您如何切片,这都是一个 NP 难题,我相信最好使用与 TSP 相同的方法来处理它。
      • @BlueRaja,@Doc Brown。网格图(网格的子图)中的生成轨迹(每个顶点至少一次)是 NP 完全的。这是链接:citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.3040。 @DocBrown:在一般图中找到至少访问每个顶点一次的最短路径也是NP-Complete,很容易证明。试试看。
      • @glowcoder:NP 中的任何问题(以及 P 中的问题)都可以通过 TSP 建模,因此可以使用 TSP 算法解决,所以这个答案没有帮助(仍然可能存在这个问题的有效解决方案)。 有帮助的是表明这个问题的有效解决方案将为 TSP 提供一个有效的解决方案,从而证明它是 NP 完全的(在这种情况下,这个解决方案和你一样好)重新获得)。我相信是这样,但这里还没有人展示过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多