网上有关A*算法的文章已经非常丰富了,各种语言各种思路都有,本来我实在不想再写一篇,,但因为最近工作动荡因此专门抽空又看了一下,然后就想写个文章防止以后印象模糊,好歹看自己写的东西可以很快回忆起来。如果是初次接触A*算法的朋友可以先看看这篇参考文章,我这边只是做一个总结,然后先贴上我之前的笔记吧:
二维数组map数据:
0=可通过的格子,S=起点,E=终点,B=障碍物
基础定义:G=目标点到起点的步长总和 H=目标点到终点的步长总和(曼哈顿距离),F=两总和之和
定义:OpenList,CloseList,current,adjacentCube,g(步长,这个例子假定为1)
1.将起点A加入到OpenList中,遍历OpenList,每次取最小F值的item,将其赋值给current,随后将这个item从OpenList中删除,加入到CloseList(例子中在这里遍历CloseList中是否存在目标点,有的话则立刻break,我个人觉得没必要每次都遍历,直接判断取到的current是否目标路径即可)。
2.获取到该item四周的item(需要判断map该位置是否为"0"或"E",否则过滤,因为障碍物和边缘不能加入寻路OpenList中),设置X和Y并insert入adjacentCube中。
3.遍历adjacentCube,检查每个item是否已存在于OpenList中,两种情况:
(1.)已存在OpenList中,则判断如果current的G值+g步长和大于这个item的G值的话,则将这个item的parent置为current,同时将这个item的G值更新为current父物体的G值+g步长(主要是找一个相对最短的路径,因为最短路径最终需要从终点通过parent回溯,而不是正向寻找一遍就结束了)。
(2.)未存在OpenList中,则设置这个item的各种属性值(G,H,F)以及parent,然后将其insert入OpenList中。
4.重复以上步骤,直到找到目标点则break随后开始回溯输出。回溯的过程比较简单,因为之前有记录parent,所以当前current的parent已经记录了一条最短的路径。
然后如果你看过原文章的代码的话可能会发现那个变量g会有问题,源码每次OpenList遍历一次g值就会+1,但是有可能会有一种情况就是顺着一个格子C的周围的其中一条路径走了一段发现是错误的(即F值不再是OpenList中最小的),这时需要继续从OpenList中重新找最小F值的item继续找