A* 寻路

来源:互联网 发布:图像复原的数据集 编辑:程序博客网 时间:2024/06/01 08:02

定义


寻路步骤

  1. 从起点A开始,把它作为待处理的方格存入到一个开启列表(开启列表就是一个等待检查方格的列表)
  2. 寻找起点A周围可以到达的方格,将它们存入到开启列表,并设置它们的父方格为A
  3. 从开启列表中删除起点A,并把A加入到关闭列表(关闭列表中存放的是不需要再次检查的方格)
  4. 从开启列表中选择 F 值最低的方格,进行移动,把最低的方格设置为当前点,设置当前点的父方格为 A,假设为P
  5. 把点 P 从开启列表中删除,并放到关闭列表中
  6. 检查点 P 所有相邻并且可以到达(障碍物和关闭列表的方格都不考虑)的方格,如果这些方格还不在开启列表中,则将它们加入到开启列表中,再分别计算这些方格的G H F 值,并设置它们的父方格为 P
  7. 如果某个相邻方格 D 已经在开启列表中,检查如果用新的路径(经过P点的路径)到达D的话,G的值是否会更低一些,如果新的 G 值更低,那就把它的父方格改为目前选中的方格 P,然后重新计算它的 F G值;但是如果新的 G 值比较高,就说明经过 P 再到达 D 不是一个正确的选择,此时我们什么也不做;

从开启列表中查找最靠谱的方块,需要通过公式 F=G+H 去计算; G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动).
H 表示从指定的方格移动到终点 B 的预计耗费 (H 有很多计算方法, 这里我们设定只可以上下左右移动).

伪代码

把起始格添加到 "开启列表"do{       寻找开启列表中F值最低的格子, 我们称它为当前格.       把它切换到关闭列表.       对当前格相邻的8格中的每一个       if (它不可通过 || 已经在 "关闭列表" 中)       {                什么也不做.        }        if (它不在开启列表中)        {                把它添加进 "开启列表", 把当前格作为这一格的父节点, 计算这一格的 FGH        if (它已经在开启列表中)        {                if (用G值为参考检查新的路径是否更好, 更低的G值意味着更好的路径)                    {                            把这一格的父节点改成当前格, 并且重新计算这一格的 GF 值.                    }          }} while( 目标格已经在 "开启列表", 这时候路径被找到)如果开启列表已经空了, 说明路径不存在.最后从目标格开始, 沿着每一格的父节点移动直到回到起始格, 这就是路径.

代码分析


启发值设计
具体实现
地图表示

github上有是实现代码,可以下载

0 0
原创粉丝点击