【问题标题】:Shortest path with blocking units and moving units on a grid网格上具有阻塞单元和移动单元的最短路径
【发布时间】:2019-11-23 21:06:34
【问题描述】:

我正在尝试解决从头到尾在网格上移动对象的问题。我很了解 A* 寻路算法,但我对如何修改它以便处理我的问题有点不知所措:

我有一个 WxH 网格。我需要将星形框移动到空框位置(它们始终位于相同的位置:0,0 和 W-1,H-1)。我的出发点是空的 (W-1,H-1) 地方,我走的每一步都是非对角线的。如果我向上移动,我需要将阻挡我前进的盒子向下移动到空白空间,依此类推,直到我到达星星 (0,0),然后我需要开始以同样的方式向我的起点移动它。为方便起见,恒星的运动始终朝着起点的方向,从不偏离起点。我需要找到最短的路线,也就是将星星移动到起始位置所需的最短步数。

这是一个 2x2 网格来说明问题:

这显然是一个最短路径问题(可能是 A*),但我无法弄清楚这里需要进行哪些修改。我不是在寻找解决方案或答案,只是为了一个方向,因为我什至不知道应该从哪里开始。

附:网格也可能有不可移动的盒子,但是一旦我了解了问题本身背后的算法,我就可以处理这个问题

【问题讨论】:

  • 有什么限制? (例如灰色单元格)为什么不使用琐碎的解决方案?
  • 限制是它必须在 1s 下运行(即使对于中等大小的网格),并且可能存在无法移动的“阻塞单元格”。就像我写的那样,只允许对角线移动(但这实际上是一件好事,对我来说选择更少)。什么是简单的解决方案?
  • 如果没有阻塞的单元格(例如灰色单元格),最佳解决方案是8 * n - 11 移动。对于阻塞的单元格,是的,您需要像 A* 这样的搜索算法(PS 是一个重要的事实......不是 PS :D 抱歉)
  • 是的,但即使有被阻塞的单元格,我应该将每个单元格视为我图中的一个节点,还是像答案中建议的人那样,将每个状态视为一个节点?
  • 您编写的简单解决方案也建议宽度=高度。当它们不相等时会发生什么?

标签: java algorithm grid shortest-path


【解决方案1】:

我不是在寻找解决方案或答案,只是为了一个方向,因为我什至不知道应该从哪里开始。

提示:不要将每个块视为图中的一个节点,而是将所有块的整个状态视为一个节点。那么每个节点的邻居就是单步可以到达的状态。

【讨论】:

  • 因此我的图是状态图、所有可能状态及其子状态的排列?从这里找到最短路径(也就是最少的状态)就像 Dijkstra 一样容易。对?但是生成这个状态图需要我使用 DFS 或其他一些递归算法来向下移动
  • @BoazKG:在进行搜索之前,您不需要生成所有可能状态的整个图表。您可以在遇到节点时动态生成节点。
  • 这在大型网格上失败,内存错误。相反,我更改了我的解决方案以使用 Lee 算法 (BFS) 并将星星实际移向门。虽然这可行,但在某些情况下它不是最佳解决方案,我不知道为什么。我仍然坚持这一点,这是当前状态:stackoverflow.com/questions/59230589/…
猜你喜欢
  • 2011-02-21
  • 2021-03-11
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多