zoukankan      html  css  js  c++  java
  • A*(A-Star)搜索算法 入门详解

    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大于实际代价,那么搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。

    模型模板

    哈哈哈哈哈哈哈哈哈哈
  • 相关阅读:
    groovy的效率问题
    强大的模板引擎开源软件NVelocity
    每个人应该知道的NVelocity用法
    NVelocity语法常用指令
    CS0016: 未能写入输出文件“c:WINDOWSMicrosoft.NETFramework.。。”--“拒绝访问
    C# 数组基础知识
    c#中的 数组
    网络编程之webclient和httpwebrequest的使用
    HttpWebRequest和WebClient的区别
    C#如何使用SplitContainer控件实现上下分隔
  • 原文地址:https://www.cnblogs.com/LZA119/p/13910044.html
Copyright © 2011-2022 走看看