我正在写一个塔防游戏,我正在从教程中实现A *路径查找算法,但是我遇到了一个我无法编码的情况!考虑下面的图形。青色节点代表到目前为止发现的最短路径,紫色节点代表被检查的节点,深灰色节点代表一个墙。
根据我对A *算法的了解,为了计算下面情况的路径,它......
#4后会立即发生什么? A *会重新检查同一路径上的G和H分数,跳过新关闭的节点吗?此外,在使用this SWF绘制此方案时,它表示发现了更多节点来弥补陷阱,如suggested here。为什么呢?
答案 0 :(得分:1)
你似乎缺少的是A *不像是沿着网格移动的单个单元,而是当它撞到墙壁时回溯;它更像是观察图周围各个节点的观察者,总是考虑下一个节点“最有可能”处于最短路径。
所以,上面的第4步永远不会发生。当A *确定它不能成为最佳路径的一部分时,它不会将节点标记为已关闭 - 只要它访问它就会将每个节点放在closed
列表中。并且它永远不会“重新开始” - 它始终关注下一个“最有可能”的节点,其中“最有可能”意味着由f(x)
排序的priority queue的前端。
因此,在上面的示例中,A *将跳转到其中一个蓝色节点,因为它们都在open
列表中,并且都具有相同的f(x)
值。虽然从技术上讲它可以考虑其中任何一个,但如果你使用correct tie-breaking criteria,它将采用最接近结尾的两个中的一个。