A*算法学习总结

1、把开始节点放进开放列表,遍历开始节点所有的相邻节点(不管是否是无效地形),并将它们也加进开放列表,并设定它们的父节点。
2、把开始节点放进封闭列表(存放的是不用去考虑的节点)。
循环执行:
3、遍历计算相邻节点中的F值,F=G+H,G指的是从起点沿着已生成的路径到一个指定节点的移动开销,H指的是计算通过水平和垂直方向的平移到达目的地所经过的节点数乘以10(计算H值时不考虑任何障碍物)。
4、选取F值最小的节点,放进封闭列表,遍历该节点的所有的相邻节点(忽略那些不可通过的或者已经在封闭列表里的),如果这个相邻节点不在开放列表中,就把它添加进去,并设定它们的父节点。
5、如果某个相邻方格已经在开放列表中了,就看看有没有到达那个方格的更好的路径(G值更小的节点)。
循环结束条件:
当终点节点被加入到开放列表作为待检验节点时, 表示路径被找到,此时应终止循环;
或者当开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环。
6、从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径。
相关教程:http://bbs.9ria.com/forum.php?mod=viewthread&tid=11026,很详细
作者的总结
A*算法总结
1.
将开始节点放入开放列表(开始节点的F和G值都视为0);
2.
重复一下步骤:
            i.
在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;
           ii.
把当前节点从开放列表删除, 加入到封闭列表;
         iii.
对当前节点相邻的每一个节点依次执行以下步骤:
1.
如果该相邻节点不可通行或者该相邻节点已经在封闭列表中,则什么操作也不执行,继续检验下一个节点;
2.
如果该相邻节点不在开放列表中,则将该节点添加到开放列表中, 并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;
3.
如果该相邻节点在开放列表中, 则判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.
        iv.
循环结束条件:
当终点节点被加入到开放列表作为待检验节点时, 表示路径被找到,此时应终止循环;
或者当开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环;
3.
从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径;

你可能感兴趣的:(A*算法)