【问题标题】:A* path finding: backed into a corner, now what?A* 寻路:陷入困境,现在怎么办?
【发布时间】:2012-10-02 05:29:02
【问题描述】:

我正在编写一个塔防游戏,我正在实现教程中的 A* 寻路算法等等,但是我遇到了一个我无法编写代码的情况!考虑下图。青色节点代表目前发现的最短路径,紫色节点代表已检查节点,深灰色节点代表一堵墙。

根据我对A*算法的了解,为下面的情况计算路径,它...

  1. 从“start”开始并检查上层节点是否可用。这是。它计算其 G 和 H 分数。它对右侧、下部和左侧节点执行相同的操作。
  2. 发现右节点的 F 分数最低 (F = G + H)。然后它重复与步骤 #1 相同的方法来查找下一个节点,将“开始”节点标记为父节点。
  3. 继续这种模式并落在“C 陷阱”中心的节点上,因为该节点的 F 分数目前最低。
  4. 发现上、右、下、左节点都是闭合的。 A* 然后将此节点标记为已关闭并重新开始,理解不要理会此节点。

#4 之后立即发生什么? A* 是否会沿着同一条路径重新检查 G 和 H 分数,跳过那个新关闭的节点?另外,当用this SWF绘制这个场景时,表示发现了更多的节点来弥补陷阱,如suggested here。为什么?

【问题讨论】:

  • 你真的想让我点击一个名为8bitboobs.com的链接吗?好吧,无论如何,它让我发笑。
  • "now what" - 现在算法尝试其他路径,并且正确处理了这种情况。我不明白这里的问题是什么 - 如果您的实现无法正常工作,我们需要查看一些代码来了解原因。
  • 算法的下一步是什么?我认为它会从原点重新开始。从那里,它将检查哪些节点?从生成的 SWF 图形来看,它似乎正在检查“两个节点”之外的节点,但我不确定如何以及为什么 :)

标签: path-finding shortest-path a-star


【解决方案1】:

您似乎缺少的是,A* 不像单个单元沿着网格移动,并且在撞到墙上时回溯;它更像是一个观察者在查看图表周围的各个节点,总是考虑下一个“最有可能”在最短路径中的节点。

所以,上面的第 4 步永远不会发生。当 A* 确定它不能成为最佳路径的一部分时,它不会将节点标记为已关闭 - 它只是将它访问的每个节点都放在 closed 列表中,只要它访问它。而且它永远不会“重新开始”——它总是查看下一个“最有可能”的节点,其中“最有可能”是指由f(x) 排序的priority queue 的前面。

因此,在上面的示例中,A* 接下来将跳转到其中一个蓝色节点,因为它们都在 open 列表中,并且都具有相同的 f(x) 值。虽然它在技术上可以考虑接下来的任何一个,但如果您使用correct tie-breaking criteria,它将采用最接近结尾的两个之一。

【讨论】:

  • 啊,好吧,所以我不应该循环“路径”,而是循环考虑 F 分数最低的节点!这现在更有意义了。这也意味着 SWF(绘制了我的“陷阱”)会查看左侧的更多节点,因为它们的 F 值等于“越过”“陷阱”所需的值。这听起来对吗?
  • 太棒了!今晚我会在我的游戏中实现这个行为,然后告诉你它是怎么回事!
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多