A* PathFinding AStart 算法 一
AStar pathfinding
介绍 😃
寻找从点A(绿色)到点B(红色)之间的路径,蓝色的区域代表这一面墙,无法通过。
寻找路径
- 从点A开始,把他添加到 ** Open List ** 。这个容器里包含的点可能落在了我们寻找的路径上,也许不会。
- 检查与开始点相邻或者可以到达开始点的所有点,忽略墙和一些水或者非法的区域。将他们添加到 ** Open List ** 中。把点A设置为这些被保存点的 ** 父节点 ** 。
- 把点A从 ** Open List ** 中删除,添加到 ** closed list ** 中,这里面的点代表了不需要再进行查找了。
如上图所示,中点的四边形(点),就是此时的开始点A,现在已经被加入到了 closed list,而和他相邻的八个四边形(点)被加入到open list中,他们的父节点是点A。在Open list中选择那个相邻的点作为下次的起始点的,下面开始讨论
路径评分 👇
依赖下面的公式:
F = G + H
- G 代表从起始点到当前该点的成本(cost),从起始点到该点的路径获取。
- H 从当前该点到目标点(点B)所评估出来的成本(cost)。这个也经常被成为猜测(heuristic)。有各种方法来计算H。
就如上面描述的那样,G是从起始点到当前该点的成本。我们可以将水平和垂直移动的成本设置为 ** 10 ** ,而将对角移动的成本设置为 ** 14 ** 。这里设置为14的原因是对角线移动的距离是2的开平方,大概是水平或者垂直的1.414倍。为了防止开平方所有我们这边只是取个大概值。
H的计算有各种方法,这里我们使用** 曼哈顿(Manhattan) ** 方法。曼哈顿方法是我们计算从当前该点到目标点之间所有水平和垂直点的数量,这时候忽略路径上的对角线移动和障碍物点。将这些然后乘以10。
如上图所示 ☝️ 左上角表示F,左下角数字表示G,右下角数字表示H。
继续 😁
在继续之前我们从8个相邻的点中选择H最小的点,此时被选择出来最小H(40)值的点是起始点右邻的那个点,如上图中边被高亮的那个四边形。可以命名它为 ** C点 ** 。紧接着首先我们将这个点(C点)从open list移除放到closed list中,然后检查他的相邻节点。与之右边相邻的点因为是墙面所以忽略,而左边最相邻的那个点目前因为处于close list中,所以我们也忽略它。
现在这个节点( ** C点 ** )的四个相邻节点已经在open list中了,我们需要检查目前到这四个节点的路径是不是比经过点C然后到达这些点路径会更好呢,我们可以是G值作为一个参考。例如C点正上放那个点( ** D点 ** ) 目前G值是14,如果我们通过 ** C点 ** 到达 ** D点 ** 则G值为20(以为目前C点的G值为10,再上移一次加10)。这个值明显大于14。所以经过 ** C点 ** 到达 ** D点 ** 不是最有的路径。同理遍历其他3个在open list中相邻点,发下没有路径需要进行更新的。
现在让我们继续在只剩下7个点的open list中寻找最小F值的点。发现里面有两个F值为54的点,选择那个呢,其实选择那个都可以,不过我们选择其中最后加入到open list中的那个点(考虑到最后加入的点可能是离目标最近的点)。我们选择的点如下图,选择点命名为 ** 点E ** 👇
这时候我们发现选择点E右边没有点可以选择,同时上面也没有点可以选择。我们此处也忽略墙下面那个点,因为如果要到达那个点需要切掉墙的左下角。你需要首先移动到下面然后再移动到那个点上。(当然是否可以直接移动墙下那个点这个规定是可选的)。在点E下的两个点目前不在open list中,将他们加入到open list中,设置他们的父节点为E点。E点左边那个点检查是否G值比经过E点的而得到的G值会更小。
我们重复以上的步骤,知道我们将目标点加入到了closed list中,结果如下图:
需要注意的是上图的** Q点 ** 的G值和父节点都发生了改变。由原来的28变为了20。这个在我们的搜索路径的过程中是很可能发生的。我们需要找到更合理的路径。
选择我们怎么决定路径的,从目标节点开始,后退选择他们的父节点,知道起始点。这个就是我们要寻找的路径。
posted on 2021-05-28 10:54 Ultraman_X 阅读(229) 评论(0) 编辑 收藏 举报