• 聪明的搜索算法’ A*算法


    A*算法

        是一种启发式的搜索算法。

        了解BFS、DFS或者Dijkstra算法的人应该知道。这些算法都是一种向四周盲目式搜索的方法。

     

    启发式搜索:

        启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。不同的估价可以有不同的效果。因此,A*算法的关键就在于如何建立这个启发函数。

       公式表示为:f(n)=g(n)+h(n),

      f(n) 是从初始点经由节点n到目标点的估价函数,

       g(n) 是在状态空间中从初始节点到n节点的实际代价,

       h(n) 是从n到目标节点最佳路径的估计代价。

     

    A* 算法与广度、深度优先和 Dijkstra 算法的联系:

       1、g(n) = 0 时:该算法类似于DFS。

        2、h(n) = 0 时:该算法类似于BFS。

        3、如果h(0) = 0,只需求出g(n)(即起点到任意点n的最短路径)时,则转化成单源最短路径问题。

     

    A*算法浅析:

    A*算法与其他搜索路径的算法的最大区别在于其估计函数的设计,也就是公式:f(n)=g(n)+h(n)中h(n)的设计

    一般计算h(n)的方法有下面几种:

    1、曼哈顿距离: |x1-x2| + |y1-y2|。

    2、欧式距离:  两点之间的直线距离。

    3、切比雪夫距离:max(|x2-x1|,|y2-y1|)。

     这幅图中绿色的线代表欧式距离,其他均为曼哈顿距离

    该图中,F6E2切比雪夫距离为:4

    接下来的分析中,我们的h(n)为曼哈顿距离,g(n)为欧式路径

    假设我们需要搜索的情况如下:

    绿色为起始点,红色为目标,蓝色为障碍物,黑色为可通行路径。

     

    F的值是G和H的和。第一步搜索的结果可以在下面的图表中看到。F,G和H的评分被写在每个方格里。正如在紧挨起始格右侧的方格所表示的,F被打印在左上角,G在左下角,H则在右下角

     

     

    接下来我们来讲讲A*算法的流程:

    1,把起始格添加到开启列表。

    2,重复如下的工作:

          a) 寻找开启列表中F值最低(最佳估值)的格子,把它切换到关闭列表。

          b) 对相邻的格中的每一个格子进行判断

              * 如果它不可通过或者已经在关闭列表中,略过它。反之如下。

              * 如果它不在开启列表中,把它添加进去。把当前格作为这一格的父节点。记录这一格的F,G,和H值。

              * 如果它已经在开启列表中,用G值为参考检查新的路径是否更好。更低的G值意味着更好的路径。如果是这样,就把这一格的父节点改成当前格,并且重新计算这一格的G和F值。如果你保持你的开启列表按F值排序,改变之后你可能需要重新对开启列表排序。

          c) 停止,当你

              * 把目标格添加进了关闭列表(注解),这时候路径被找到,或者

              * 没有找到目标格,开启列表已经空了。这时候,路径不存在。

    3.保存路径。从目标格开始,沿着每一格的父节点移动直到回到起始格。这就是你的路径。

     

    下篇文章,我将使用A*算法解决一个经典的八数码问题。

    from: http://blog.csdn.NET/cyh_24/article/details/8018752

  • 相关阅读:
    数据汇总计算和分析的反思
    排名算法计算
    仿Spring读取配置文件实现方案
    xml 配置文件规范 校验
    批量插入数据(基于Mybatis的实现-Oracle)
    shallow copy 和 deep copy 的示例
    引用对象的使用和易产生bug的示例
    codis安装手册
    Redis安装手册
    map和list遍历基础
  • 原文地址:https://www.cnblogs.com/KingIceMou/p/7000871.html
Copyright © 2020-2023  润新知