浅谈 A*算法

来源:互联网 发布:冋花顺炒股软件 编辑:程序博客网 时间:2024/06/05 14:56

        对于接触过人工智能的人来说,A*算法并不陌生,最近在做路径规划,很多文章都提到了A*算法,但是之前学过一点,但是都已经忘了,最近又好好拿出来研究一下,具体过程如下:

        先来个公式:f(N) = g(N)+h(N)

特殊情况:(特殊情况这里不多说)

  当f(x) = g(x)   时,为宽度优先搜索
  当f(x) = 1/g(x)时,为深度优先搜索
  当f(x) = h(x)   时,为全局优先搜索

        对于A*算法来说,整个过程都是在求f(N),设在我们的研究中有初始节点S和目的节点T,在我们搜索过程中走过的点记为N,这里g(N)表示从初始节点S到N的实际代价,h(N)表示从N到T的估计的代价。注意:这里是代价,不是距离哦!(特殊情况可能为距离)

       A*算法的好坏就是看h(N)的好坏,h(N)取的好,A*算法效果就好(这么说应该没什么毛病)。说到这里就好办了,老用文字描述也不好理解,用个例子来看看吧!

红色方块为起点,绿色方块为终点,这里我们想从红色方块到绿色方块,我们不妨令f(N) =h(N),这是上面提到的全局优先搜索。那么h(N)是啥?上面说过,h(N)为估计的代价,既然是估计的代价,那肯定不是一个固定的了,我们令h(N) =距离目标位置水平距离和垂直距离之和,好了,什么都有了,开始A*之路。 

        这里方格中的数字为h(N),所以A*算法会沿着数字小的方向走。

算好距离


红色方块为第一个节点


扩展出三个节点,继续


沿着距离短的方向走,找到终点。这里我们可以看到,找到的路径并不是最佳路径,我们换个思路。

思路2:设f(N) = g(N)+h(N),  这里h(N) =距离目标位置水平距离和垂直距离之和,继续:

    

沿着f(N)最小的找,左下角的8+1最小


至此,整个A*算法结束,因此,A*算法主要还是看评估函数取的好坏。

具体算法如下:

Step1:   把初始节点S0放入OPEN表中;
Step2:   若OPEN表为空,则搜索失败,退出.
Step3:   移出OPEN中第一个节点N放入CLOSED表中, 并标以顺序号n;
Step4:   若目标节点Sg=N, 则搜索成功,结束.
Step5:   若N不可扩展, 则转Step2;
Step6:  扩展N, 生成一组子节点, 对这组子节点作如下处理后, 放入OPEN表, 按评价函数的升序重新排序OPEN表, 转 Step2;


注:部分内容为自己理解,如有不对请批评指正。

1 0