欢迎使用我的 在线工具

小D

读历史、看小说、写程序都是我所爱。技术不好,头脑不灵光,靠的是兴趣。
随笔 - 35, 文章 - 25, 评论 - 13, 引用 - 0
数据加载中……

A star算法弱弱的小结

搞了N个小时,终于杯具的把A*算法写出来了,这里只能弱弱的小结一下:
A*算法是一种启发式算法:
即每次迭代都进行启发式思考,判断F值:
我们维护两个表,我这只用简单的数组实现。
OPEN表和CLOSE表
OPEN表存储我们待搜索的节点
CLOSE表存储已经搜索好的节点,这些节点都是每次启发时F值最小的。
A为其点
B为终点

F = H + G
G = 从起点A,沿着产生的路径,移动到网格上指定方格的移动耗费。G = 距离(A) * 偏移量
H = 从网格上那个方格移动到终点B的预估移动耗费。这经常被称为启发式的,
    可能会让你有点迷惑。这样叫的原因是因为它只是个猜测。
    我们没办法事先知道路径的长度,因为路上可能存在各种障碍(墙,水,等等)。
    虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。
    H = (列距离(B) + 行距离(B)) * 偏移量
我们选定上一次添加到CLOSE表的节点为当前节点。
然后依次判断当前节点的四个或八个方向的节点。如果这些节点是障碍,或者已经在CLOSE表中,
则不予考虑,否则将这些节点的父节点设为当前节点,这些节点如果也没有在OPEN表中,
则加入OPEN表,如果这些节点编号已经出现在OPEN表中,则判断他们的G值,G值小的留下,G值大的扔掉。
如果G值也相同,保留后出现的。
我们每次把OPEN表F值最小的节点删去加入到CLOSE表中。
但是如果存在两个节点的F值相同呢?随机选一个。
如此反复,直到我们将B点加入CLOSE表。
如何得到我们的路径呢?从B点依靠父节点向上遍历就行了。

注意一点。我们要保持OPEN表的有序就对了,显然我们这里是通过F值来维持OPEN表的次序。
而且每次添加新的节点到OPEN表时都要排序。当然这里是用降序,这样对于数组来说更好操作。

感谢,网上朋友提供的详细的资料。

posted on 2009-12-31 17:21 vagasnail 阅读(399) 评论(0)  编辑  收藏 所属分类: C\C++


只有注册用户登录后才能发表评论。


网站导航: