最佳优先搜索
最佳优先搜索可被认为是广度优先搜索的贪婪形式,本质上它是一种贪心算法。
A*算法和B*算法是广泛使用的最短路搜索算法。
Dijkstra算法本质上是一种基于动态规划的BFS,如果我们能够对两个点之间的距离进行比较准确的“估计”,那么就可以使用A*算法来改进!
广度优先搜索是朝向四面八方,而我们往往可以预先知道往哪一个方向最有可能路径较短。
如果我们下从 A 点移动到 B 点,但是这两点之间被一堵墙隔开。如下图,绿色是 A,红色是 B,中间蓝色是墙。
在Dijkstra我们用一个优先队列去维护广度优先搜索的最小代价,在A*算法,代价 F 是一个基于我们认识的改进:F = G + H。
G 是从起点 A 移动到指定方格的移动代价,而 H 是通过估算该点到终点 ( 红色方格 ) 的 Manhattan 距离得到的(比如下图就可以选择 Manhattan 距离)。这样,广度优先搜索就会优先考虑我们主观上认为会更近的一些位置。 这里的 H 被视作是Heuristics Function,被认为是一种试探。越接近真实距离,那么A*算法的表现就会越好。
B*算法是对A*的一点小变动,它根本不考虑所谓的“接近真实距离的启发式函数”,直接使用两点之间的直线距离。结果就是我们最终得到的“最短路”是直接从起点走到终点,如果遇到障碍物就绕过去。这样做的好处是减少计算代价,因此B*算法被广泛应用在游戏中,一群怪物需要接近用户角色,所以在打 DNF 的时候,会发现怪物都是喜欢绕墙走的hh。
参考资料: