如何处理A *寻路中的障碍以达到“次佳”目标?

时间:2012-10-25 14:49:56

标签: path-finding a-star

我正在为基于网格的自上而下游戏进行A *寻路。我遇到的问题可能最容易理解,如下图所示。星号是玩家/ NPC。黄色星号是当前想要通往X的NPC。红色星号是NPC,在这种情况下是障碍物。黄色细胞是墙壁,白色细胞是地板。虽然目标的整个路径确实无法到达,但我仍然希望获得到下一个最佳位置的路径(在这种情况下,编号为8的点)。

我可以轻松地绕过障碍物,但不知道如何完全按照我的描述进行操作。如果我一旦遇到障碍就停止它,它在3点停止时无法正常运行。如果我重新开始到距离最终目标最低距离的关闭列表中的图块,如果最终目标在另一个目标上以墙的一面为例,它可能会使事情变得非常糟糕。

有什么建议吗?我觉得我错过了一些其他明显的东西,所以请在这里原谅一个白痴。

enter image description here

谢谢, 添

2 个答案:

答案 0 :(得分:6)

这是一个基于problem relaxation的想法:

首先,解决没有NPC的图的所有顶点的最短路径问题。您可以从目标节点开始使用Dijkstra's algorithm的单个应用程序来获取到达/来自每个顶点的目标的最短路径。

然后尝试在完整问题中找到最短路径。使用A *获取运行Dijkstra作为启发式获得的最短路径信息;它是可以接受的,因为NPC问题中的最短路径始终至少与松弛问题中的最短路径一样长。跟踪到目前为止的最佳路径,并在搜索空间耗尽时返回(正如我在评论中发布的那样)。

如果你觉得这很贵,那么你就会意识到你只需要经营Dijkstra一次;您可以在同一图表上重复使用为每次A *运行获得的信息。

(警告:我没有尝试过任何一项。)

答案 1 :(得分:0)

一种方法是计算从源到目的地的路径,而不考虑阻塞NPC,然后检查路径上是否有任何阻塞NPC。如果是这样,请考虑路径上的第一个阻止NPC,然后再次计算路径。冲洗并重复,直到无法再到达目的地。发生这种情况时,您可以将最后一个成功路径上最新阻止NPC之前的点作为“次佳”目的地。

这应该适用于您的示例,但如果目的地有两个被阻挡的入口,则此方法将用于更远的入口。此外,在最坏的情况下,您必须运行最短路径算法的次数与NPC一样多。

larsmans提出的方法比这更好,因为你只需要运行Dijkstra和A *一次。我只是把它作为你可以采取的各种方法的想法。