A *路径发现:支持角落,现在是什么?

时间:2012-10-02 05:29:02

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

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

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

  1. 从“start”开始,检查上层节点是否可用。它是。它计算其G和H分数。它对右,低和左节点也是如此。
  2. 发现正确的节点具有最低的F分数(F = G + H)。然后,它重复与步骤#1相同的方法,以找到下一个节点,将“start”节点标记为父节点。
  3. 继续此模式并落在“C陷阱”中心的节点上,因为此节点到目前为止具有最低的F分数。
  4. 发现上,右,下和左节点都已关闭。然后A *将此节点标记为已关闭并重新开始,理解为保留此节点。
  5. #4后会立即发生什么? A *会重新检查同一路径上的G和H分数,跳过新关闭的节点吗?此外,在使用this SWF绘制此方案时,它表示发现了更多节点来弥补陷阱,如suggested here。为什么呢?

    Graphic of an A* problem

1 个答案:

答案 0 :(得分:1)

你似乎缺少的是A *不像是沿着网格移动的单个单元,而是当它撞到墙壁时回溯;它更像是观察图周围各个节点的观察者,总是考虑下一个节点“最有可能”处于最短路径。

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

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