A*(A-Star)搜索算法 入门详解

A*(A-Star)搜索算法

  • A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。
  • 它的实现基于最朴素的BFS搜索,却通过估价函数优化使得搜索效率大大提升。

最短路模型

  • 设一个优先队列 Q Q ,初始放入起点,
  • 设估价函数 F ( x ) = G ( x ) + H ( x ) F(x)=G(x)+H(x) ,其中 G ( x ) G(x) 为起点到 x x 点已移动的实际距离 H ( x ) H(x) x x 点到重点至少需要移动的估算代价(后面详细介绍),则 F ( x ) F(x) 表示总距离。
  • 每次从 Q Q 中取出 F F 值最小的点,进行增广,
  • 再算出走到的点的 F F 值,加入 Q Q 中。
  • 这样当第一次走到终点是,终点的 G G 值则为最短路。.

实际应用

  • 很显然,实现最短路是不需要用A*这样的搜索算法的(可以用SPFA,dijkstra等)
  • 所以,最短路只是相当于一个模型,用于介绍A*算法, 更便于理解。
  • 一般用于搜索中,通过若干次操作使状态 S S 变成目标状态 T T ,求最小操作数,
  • G ( x ) G(x) 表示到当前状态的实际操作数,
  • H ( x ) H(x) 是到目标状态的估算代价,因为我们还没有到达目标状态,不知道其实际代价,只能通过估计,
  • 然后找到 F ( x ) = G ( x ) + H ( x ) F(x)=G(x)+H(x) 最小,即估算出来的总代价最小的状态进行转移,一定程度上能够优化普通的搜索。
  • F ( x ) F(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 ( n ) H(n) d大于实际代价,那么搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。

模型模板

猜你喜欢

转载自blog.csdn.net/qq_39565901/article/details/104299607