A*(A-Star)搜索算法
- A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。
- 它的实现基于最朴素的BFS搜索,却通过估价函数优化使得搜索效率大大提升。
最短路模型
- 设一个优先队列 Q Q Q,初始放入起点,
- 设估价函数 F ( x ) = G ( x ) + H ( x ) F(x)=G(x)+H(x) F(x)=G(x)+H(x),其中 G ( x ) G(x) G(x)为起点到 x x x点已移动的实际距离, H ( x ) H(x) H(x)为 x x x点到重点至少需要移动的估算代价(后面详细介绍),则 F ( x ) F(x) F(x)表示总距离。
- 每次从 Q Q Q中取出 F F F值最小的点,进行增广,
- 再算出走到的点的 F F F值,加入 Q Q Q中。
- 这样当第一次走到终点是,终点的 G G G值则为最短路。.
实际应用
- 很显然,实现最短路是不需要用A*这样的搜索算法的(可以用SPFA,dijkstra等)
- 所以,最短路只是相当于一个模型,用于介绍A*算法, 更便于理解。
- 一般用于搜索中,通过若干次操作使状态 S S S变成目标状态 T T T,求最小操作数,
- G ( x ) G(x) G(x)表示到当前状态的实际操作数,
- H ( x ) H(x) H(x)是到目标状态的估算代价,因为我们还没有到达目标状态,不知道其实际代价,只能通过估计,
- 然后找到 F ( x ) = G ( x ) + H ( x ) F(x)=G(x)+H(x) F(x)=G(x)+H(x)最小,即估算出来的总代价最小的状态进行转移,一定程度上能够优化普通的搜索。
- F ( x ) F(x) F(x)在 G ( x ) G(x) G(x)一定时,或多或少会受到 H ( x ) H(x) H(x)的影响,所以 H ( x ) H(x) H(x)会影响到每次的操作的优先顺序,不会像普通的搜索一样按部就班的来。
- 也就是说,并不知道如何操作是最优的,但可以优先选择估计最优的状态进行下一步操作,使得尽可能地先操作更优的状态,使得离真实答案更加接近,达到优化时间的目的。
估算代价
- 现在问题来了,这个所谓的“估算代价”是什么??
- 顾明思义,这是一个估计值,相当于是猜测。
- 用简单的常数级别时间的计算得到的一个值作为 H ( x ) H(x) H(x)。
- 再回到最短路模型中,假设是在一张有障碍的网格图上, H ( x ) H(x) H(x)可以取当前点到终点间的曼哈顿距离,也就是忽略障碍的存在,
- 也就是取一个接近真实,但相比真实可以用更短时间算出来的值作为估算代价。
- 可以理解成转换了操作或限制,使得两种状态间的代价可以直接计算,则这样计算出来的代价作为估算代价,以便用于估价函数的计算。
- H ( x ) H(x) H(x)的取值情况会影响程序的效率:
- 如果 H ( x ) H(x) H(x)小于实际代价,那么搜索的状态多,搜索范围大,效率低。但能得到最优解。
- 如果
H
(
x
)
H(x)
H(x)等于实际代价,那么搜索将严格沿着最优方案进行, 此时的搜索效率是最高的。
如果 H ( n ) H(n) H(n)d大于实际代价,那么搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。