a*寻路分析
定义:
绿色节点为NodeA
红色节点为NodeB
NodeA右边为NodeC
Dst:两个节点的直线距离 (使用两点距离计算公式)
表OpenNodes :储存节点用
节点的上级节点 名为 ParentNode
NodeAttribute_ToA: 节点属性 用于储存与A的距离
下述计算过程定义为 过程1
Strat
计算 NodeC 与 NodeB 的距离Dst 结果为 ToEndVal
计算 NodeC 与 NodeA 的距离Dst 结果为 ToStartVal
F=ToEndVal+ToStartVal
将 NodeC 加入 表Op
NodeC 的 ParentNode = NodeA
NodeC 的 NodeAttribute_ToA = ParentNode 的 NodeAttribute_ToA + NodeC与NodeA的Dst
End
1.将开始节点放入开放列表(开始节点的F和G值都视为0);
2.重复一下步骤:
i.在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;
ii.把当前节点从开放列表删除, 加入到封闭列表;
iii.对当前节点相邻的每一个节点依次执行以下步骤:
1.如果该相邻节点不可通行或者该相邻节点已经在封闭列表中,则什么操作也不执行,继续检验下一个节点;
2.如果该相邻节点不在开放列表中,则将该节点添加到开放列表中, 并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;
3.如果该相邻节点在开放列表中, 则判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.
2.重复一下步骤:
i.在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;
ii.把当前节点从开放列表删除, 加入到封闭列表;
iii.对当前节点相邻的每一个节点依次执行以下步骤:
1.如果该相邻节点不可通行或者该相邻节点已经在封闭列表中,则什么操作也不执行,继续检验下一个节点;
2.如果该相邻节点不在开放列表中,则将该节点添加到开放列表中, 并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;
3.如果该相邻节点在开放列表中, 则判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.
循环结束条件:
当终点节点被加入到开放列表作为待检验节点时, 表示路径被找到,此时应终止循环;
或者当开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环;
从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径;
https://files.cnblogs.com/mattins/aStar.zip
https://www.cnblogs.com/thunder123/archive/2010/08/18/1802199.html