A *"特殊情况"

时间:2015-05-03 15:55:05

标签: algorithm

我根据此视频实施了4路A *算法 https://www.youtube.com/watch?v=KNXfSOx4eEE

但是我的情况略有不同:首先,我有两张地图,目标是可以从一块瓷砖移动到另一块瓷砖的播放器单元,所以我无法静态节点并预先计算它们的启发式(至少我不是我想我可以根据我对这个算法的了解而做。我还做了一个4路工具,想知道我是否需要一个G值,或者启发式是否足够。

现在您有了一个想法: 根据视频a"特殊情况"必须在打开列表中的节点上运行,但检查对我没有任何意义,因为我无法想到案例何时会证明是真的,特别是在我的工具中。情况是当一个节点在开放列表中时,你必须检查节点A在哪里是你所在的节点而节点B是列表中的节点,然后你检查A的成本+运动是否少于比B的G费用,如果是,你重申B是A的孩子。作为参考,这个解释从7:20开始。

这种情况会发生在什么情况下?如果我使用4向Taxicab Geometric实现,那么我还应该计算移动成本吗?在这种情况下,我非常确定我的f值将取决于我的h值。

我忘了也问,但是在优化的情况下,我可以在确定要移动到哪个节点后将节点从打开的列表中删除吗?

1 个答案:

答案 0 :(得分:1)

从一开始就要清楚:A *是一种算法,它可以找到静态环境中从固定目标到固定目标的最短路径。在这个答案的最后,我将讨论一些动态问题的替代方案。

当您到达之前访问过的节点时,会发生您对此感到好奇的检查。检查的必要性取决于您的启发式。让我们假设启发式是曼哈顿到目标的距离,节点之间的移动成本一直是1。

B成为您之前访问过的邻居的开放列表中的节点,A当前处理的节点(B的邻居)和{{1} } C的当前父级。然后,考虑以下场景,其中灰色单元格是可步行的:

Scenario

您从B开始,然后使用S向下传播到C。你发现你撞墙并尝试了另一条路径,最终到达g(C)=4, h(C)=2 A。现在,您分析已在打开列表中的g(A)=2, h(A)=4。当然,从BS的路径通过B比通过A更短。所以你需要更新。

如果您从打开的列表中选择要访问的节点,则从打开的列表中删除此节点并将其添加到关闭列表中。

动态目标并不容易理解。一种选择是使用A *获取从CS的路径,当您到达T时,计算新位置的新路径。您还可以在移动时更新路径(例如,每秒计算一个新路径)。

还存在动态路径查找算法。大多数执行多次A *迭代并重用以前迭代中的结构。查看this paper以获取一些参考资料(尤其是第3章)。边缘检索A *看起来像一个可行的候选人。