A*

写了一篇关于jump point search,想着不写一篇A*,似乎不对。

首先关于A*需要了解的几个概念:

  • manhattan 曼哈顿距离,两个点在水平方向和垂直方向的距离,并且把这两个距离相加,结果就是曼哈顿值。
  • start 起始点
  • end 结束点
  • G '起始点start'到'当前点'产生的移动消耗
  • H 它只是计算出'当前点'到'结束点end'的曼哈顿距离值,当然,你也可以用其他算距离的方法,例如euclidean(欧几里得距离),octile距离,chebyshev(切比雪夫距离)。
  • F F = G + H
  • openlist 待检索的列表,此列表需要根据元素的F值自动排序
  • closelist 不需要检索的列表
  • openedlist 已检索的列表

demo

说完了这些,我们还是往常一样,来个demo。

A*

图中的黄线上的绿色点为起点,红色点为终点。
搜索过程:

  • 1、 把起始点s压入openlist,并将起始点放进openedlist。

  • 2、 从openlist中弹出一个点,以这个点为当前节点。并把这个点放进closelist。

  • 3、 获得当前点附近可以走的所有点。算出这些点各自的F值,并把这些点放进一个openlist中,同时也需要放进openedlist。

  • 4、 取出openlist中f指最小的点作为当前点,并且放进closelist,此处是图中的1点,接着再获取1点周围的附近可以走的,未在关闭列表的点,判断此邻点是否是结束点,如果是,那么Ok, 我们可以根据这些节点的父节点倒推出路径了,就结束啦;如果不是,那么需要判断此邻点是否已经在openedlist,如果是,那么就需要判断此邻点当前路径的G值是否小于已经保存的G值,是的话那么就需要更新在openlist中此邻点的G值,并且把此邻点的父节点设置为1点(就是我们当前所在的点),如果不在openedlist,那么就需要把其加入openedlist,并加入openlist。

  • 5、 经过第4步的更新,我们就可以继续重复2-4。跟着找到2,3,4直到找到结束点为止。

好了, A* 搜索的过程其实就这些,接下来,各位同学去找个实际的代码demo看下,加深下理解吧!go !