【问题标题】:Minimum distance between start and end by going through must visit points in a maze必须经过迷宫中的点的起点和终点之间的最小距离
【发布时间】:2014-10-15 22:56:08
【问题描述】:

所以,假设我有一个迷宫,它有一个起点和一个终点,分别用橙色和红色标记,我的目标是找到它们之间的最小距离。阻塞路径用黑色表示,开放路径用白色表示。不过这里做了两处修改。

  1. 有一些必须访问的单元格,以灰色标记。
  2. 任何单元格都可以被访问任意次数(包括开始、结束和必须访问的点)

对于前- B=黑色,W=白色,G=灰色,R=红色,O=橙色

         BBBBBB                 BBBBB
         BBGBBB                 BWGGB
MAZE1 => BOWGRB     MAZE2  =>   BOBBB
         BBGBBB                 BWWRB
         BBBBBB                 BBBBB

在这种情况下,ans 将是

MAZE1 => M[2][1] => [2][2] => [1][2] => [2][2] => [3][2] => [2][2] => [2][3] => [2][4]  = 7
MAZE2 => M[1][1] => [1][2] => [2][2] => [3][2] => [3][3] => [3][2] => [2][2]            = 6

如你所见,节点出现多次

首先我想到了使用递归技术(回溯),但无法找到算法。和

所以我想到了用这种方式。

  1. 我将跟踪所有必游点、起点和终点的坐标
  2. 找到每个节点之间的距离(就像在选择排序中我们比较每个术语一样,我们得到每个节点之间的最小距离(使用 BFS))
  3. 然后应用一些最小距离算法。我想到了 TSP,但它说节点必须只访问一次。这里可以是多次。我发现了中国邮递员的问题,但不知道是否可以在这里应用。 Floyd warshall 算法是存在的,但它并不包括每一点

我应该如何进行,有什么想法吗?

【问题讨论】:

  • 这个问题最近好像很有名,我至少看过3个关于这个的问题。请问您是从哪里得到这个问题的?
  • 有名吗?我刚刚抄袭了最初的迷宫问题。但是现在,当我想到它时,它在机器人技术中可能非常有用。这些问题以前有回答吗?可以分享一下链接吗:)
  • 比如thisthis应该和你的问题一样
  • 好的,所以我在正确的轨道上,它实际上是一个 TSP 扯掉
  • another two 最近提出的问题非常相似。

标签: algorithm shortest-path path-finding maze traveling-salesman


【解决方案1】:

好的,所以也许我会尝试下次解决这个问题。上次,我没有注意到您可以尽可能多次访问一个点,因此该方法可能是错误的。

首先,假设Start、End和Gray节点的总和为N,Start为0,End为N-1,Gray节点从1到N-2。

我们可以看到,我们可以用(mask, index)表示任意时刻的state,其中index表示我们当前所在的节点,mask表示我们已经访问过的所有节点(0

一开始状态是(1,0)或者(00000 ... 1,0),也就是说只访问了0号城市,我们的目标是达到状态(2^N - 1, N - 1 ) 这意味着访问了所有节点,我们在节点 N - 1 结束旅程。

因此,至此,我们可以很容易地看到,我们已经将原始问题转换为状态图,我们的目标是找到从状态 0 (1,0) 到状态结束 (2^ N - 1, N - 1),因此,对这个新图应用 Dijkstra 最短路径算法,我们就有了答案。

注意:答案是基于一个假设 N

另一个注意事项:对于机器人而言,最短路径不一定是最佳路径,因为机器人在转弯和直线运行时的速度是不同的。

【讨论】:

  • Djikstras 不是很贪心,而且可能不是最好的。我什至不明白整个面具的事情。我猜掩码将由一个整数表示,整数是 32 位。所以应该是 2^32 吧?你有一些我可以参考的链接,或者如果你能解决迷宫2。 N 只有 4。这种情况下的距离矩阵 {{0,2,3,3}, {2,0,1,5}, {3,1,0,6}, {3,5,6, 0}}。谢谢:)
  • @zeroinfinity 你应该先学习位掩码技术,例如,如果你已经访问了城市 0 和 2,那么掩码是 3,或者二进制是 0101(只设置了位 0 和 2),类似,如果访问了所有城市,则掩码为15,即二进制1111(所有4位都设置)。 Dijkstras 是贪婪的,但在这种情况下,它总是返回最佳值。请注意,Dijkstra 的图表不仅仅是城市到城市,而是 (mask, city) 到 (mask, city)。
  • 节点(掩码,城市)和(掩码,城市)之间的权重是多少。那么城市之间的距离对吗?在上述问题中,最初,我们将有 4 个节点全部初始化为掩码 0,除了(起始节点为 1)。然后我们找到最小距离,进入那个状态并更新它的掩码值和它的最小距离(或节点值或顶点值,不管我们怎么说),我们这样做,直到我们达到 (2^(N-1), N-1)。我的理解是正确的还是应该是别的东西
  • @zeroinfinity 正确,这就是想法 :) 很高兴你理解它!剩下的工作就是实现一个正确的 Dijkstra 算法
  • @zeroinfinity 你可以使用二维数组dist[1<<N][N] 轻松存储距离(1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2016-09-23
  • 2015-10-16
相关资源
最近更新 更多