AStar算法笔记

来源:互联网 发布:胜科金仕达数据系统 编辑:程序博客网 时间:2024/05/16 12:33

听说这个很久了,今天是第一次实现该算法


原理不算难,弄明白很容易

实现起来也还可以,根据网上的一些讲解,代码之类的勉强也完成了一个实现

一个简单的实现......


Node类:节点的数据类,负责保存G = F + H的数据,位置,父节点,是否是障碍,提供一个排序的比较方法

  • G(方块的和值):这个就是到达这个节点的消耗量和估算的剩余消耗的和
  • F(起点到该点的消耗):该数据在计算过程中会不断更新,因为有可能有其他路径到达这一点比之前的的消耗更新,这时就需要更新数据了
  • H(估算的剩余消耗) :常见的算法有曼哈顿算法(据说曼哈顿的街道是平行且垂直的),计算两个节点间的水平垂直距离的和,或是直接计算连个节点的距离也行.......


    Grid类:网格生成和维护类,横向纵向的网格数目,网格大小,在unity中还可以在该类里用OnGizmosDraw显示辅助线

    同时,该类也负责添加临近网格,和将网格的坐标数据和网格数据的索引之间转化的工作


    NodeArray:节点的列表类,push,remove,firstNode,GetLength,FirstNode等方法

    AStar类:A*的具体类,维护两个节点的列表,一个openList,一个closeList,将每次计算周围点的和值最小的节点放入ClosedList,其余的放入openList,然后选择最小和值的节点,计算计算周围的节点,如果没在openList当中,就添加,已经存在的重新计算和值,看是否可以取得更小的到达开始点的值

    应该包含计算估算值H的方法

    寻路过程


    传入两个节点,一个是起始点,一个是目标点

    先将起始点加入到开放列表OpenList中,计算起始点的H值,F值为0

    循环遍历开放列表OpenList,取得列表中的firstNode(node的排序是根据H值来排序的)

    只要firstNode不是目标点,继续,否则,计算路径,寻路完成了

    便利邻居节点(可以是四方向或者8方向)

    如果closeList不包含邻居节点,计算邻居节点到fistNode的G值,计算另据节点到目标点的G值

    邻居节点的父节点为firstNode,

    将其加入到openList当中

    所有的邻居节点都算完之后,把openList中的firstNode(经过排序,最小H值的节点被放在first)

    放入到closeList当中, 从OpenList里面删除掉

    然后重复上面的过程,知道fisrtNode与目标点相同,结束寻路,返回路径




    写的不好...

    大家还是看我学习时候的参考文章吧.........

    http://www.raywenderlich.com/zh-hans/21503/a星寻路算法介绍

  • F(方块的和值):左上角
  • G(从A点到方块的移动量):左下角
  • H(从方块到B点的估算移动量): 右下角
  • 0 0
    原创粉丝点击