带有传送器的网格上的*可接受的启发式算法?

tem*_*def 18 algorithm artificial-intelligence heuristics a-star path-finding

假设你有一个2D网格的单元格,其中一些是用墙填充的.角色可以从一个正方形到任何与其一步水平或垂直的正方形,但不能穿过墙壁.

给定起始位置和结束位置,我们可以通过使用具有可允许启发式的A*算法找到从起始位置到结束位置的最短路径.在目前的设置中,曼哈顿距离是可以接受的,因为它永远不会高估到目的地的距离.

现在假设除了墙壁之外,世界上还有成对的传送器.踏上传送器会立即将角色传送到链接的传送器.传送器的存在打破了上面给出的允许启发式,因为通过使用传送器来减少距离,可能比通过最佳曼哈顿距离步行更快地到达目的地.例如,考虑这个线性世界,其中传送器标记为T,开始位置标记为S,结束位置标记为E:

T . S . . . . . . . . . . . . . E . T
Run Code Online (Sandbox Code Playgroud)

在这里,最好的路线是步行到左边的传送器,然后向左走两步.

我的问题是:在带有传送器的网格世界中,A*的一个很好的可接受的启发式算法是什么?

谢谢!

us2*_*012 14

如果您的世界中没有太多的远程传送器,我会尝试以下启发式算法,其中MHD(a,b)是单元格a和之间的曼哈顿距离,b并且T(i)是最靠近单元格的远程传送器i:

h(x,y) = min( MHD(x,y), MHD(x,T(x)) + MHD(T(y),y) )
Run Code Online (Sandbox Code Playgroud)

  • @amit:nhahtdh是对的.可接受性要求*永远不要过高估计*,而不是*永远不要低估*. (3认同)

Vau*_*ato 7

形成传送器的图形:

  • 每个远程传送器都有一个节点,最终位置有一个节点.
  • 您有一个边缘将每个节点连接到每个其他节点,形成一个完全连接的图形.
  • 对于边缘权重,使用每个节点的目标单元格(您进入远程传送器时进入的目标单元格)与所有其他节点之间的曼哈顿距离.

使用Dijkstra算法计算从每个节点到结尾的最短距离.

您现在可以使用特定位置和所有节点之间的距离的最小值加上从节点到结束的预先计算的距离作为启发式函数.Dijkstra算法只需作为预处理步骤运行一次.但是,如果传送器的数量是单元数量的一个较大的百分比,则使用更简单的启发式功能可能无法获得任何好处.

  • 我自己的两分钱:我打算在一个静态的世界中测试它,预先计算是完全合理的.我其实喜欢这种两层方法! (2认同)
  • @WolframH:因为它是一个启发式功能,你只需要确保你永远不要高估实际距离.没有墙壁的距离永远不会大于与墙壁的距离. (2认同)