A*算法原理

本文详细介绍了A*算法如何通过划分搜索区域、构建openlist和closelist,以及计算F值、G值和H值来找到从起点到终点的最短路径。算法通过考虑实际移动成本和目标位置的估计成本来优化路径规划。
摘要由CSDN通过智能技术生成

1.A*算法原理

原文地址:https://www.gamedev.net/reference/articles/article2003.asp

假设想从 A 点到达 B 点。但是有一堵墙将两点隔开。如下图所示,绿色是起点 A,红色是终点 B,蓝色填充的方块是中间的墙。

我们要做的的第一件事是:将搜索区域划分为一个方形网格来简化搜索区域。这种方法会将搜索区域缩小为一个简单的二维数组。数组中的每个元素都代表网格上的一个方块,其状态记录为可通行或不可通行。通过弄清楚我们应该采取哪些方块从 A 到 B 来找到路径。一旦找到路径,我们就可以从一个方块的中心移动到下一个方块的中心,直到到达目标位置。

这些中心点称为“节点”。节点可以放置在形状内的任何位置 - 中心、边缘,或其他任何地方。但是本文只讨论节点为中心位置的情况。

2.开始搜索

上一章我们将搜索区域简化为可管理的节点数量,下一步就是进行搜索以找到最短路径。我们通过从 A 点开始,检查相邻的方块,然后向外搜索直到找到目标。

大致操作步骤如下:

 1.从起点 A 开始,将其添加到“open list”中。open list就像购物清单。开始时清单上只有一项,稍后会加入更多项目。但是需要注意的是,open list只是待考虑清单,会不断变化。

2.查看与起点 A 相邻的方格 ( 忽略障碍物) ,把其中可走的 (walkable) 或可到达的 (reachable) 方格也加入到 open list 中。把起点 A 设置为这些方格的父级 (parent node 或 parent square) 。当我们在追踪路径时,这些父节点的内容是很重要的。

3.把 A 从 open list 中移除,加入到 close list 中, close list 中的方格暂时不需要再次查看。

此时,如下图所示,中间的深绿色方块是起始方块。它以浅蓝色勾勒出轮廓,表示该方块已添加到 close list 中。所有相邻的方块现在都在要检查的 open list 中,它们以浅绿色勾勒出轮廓。每个都有一个灰色指针,指向其父方,即起始方块A。

接下来,我们在open list中选择一个F值最低的方块,并重复前面的过程。下一节将介绍F值的计算规则。

3.路径评分

确定在规划路径时使用哪些方块的F值的大小

计算F值的公式如下:

        F = G + H

        G = 从起点 A 移动到网格上给定方格的移动成本。

        H = 从网格上的给定方块移动到最终目的地 B 点的估计移动成本。

如上所述,G 是使用生成路径从起点移动到给定正方形的移动代价。在本文中,我们将方块水平与垂直移动分配 10 的成本,对角线移动分配 14 的成本。之所以使用这些数字,是因为对角线移动的实际距离是 2 的平方根,大约是水平或垂直移动成本的 1.414 倍。为了简单起见,我们使用 10 和 14来作为移动成本。

由于我们沿着给定正方形的特定路径计算 G 成本,因此计算该平方的 G 成本的方法是取其父方的 G 成本,然后根据它是对角线还是正交(非对角线)从该父方块相加 10 或 14。

H 可以通过多种方式估算。我们在这里使用的方法称为曼哈顿方法,您可以在其中计算水平和垂直移动以从当前正方形到达目标正方形的正方形总数,忽略对角线移动,并忽略可能阻碍的任何障碍物。然后,我们将总数乘以 10,即水平或垂直移动一个方格的成本。

F 值为 G 和 H 相加。我们搜索的第一步的结果如下图所示。F、G 和 H 分数写在每个方格中。F 印在左上角,G 印在左下角,H 印在右下角。

在有字母的正方形中,G = 10。这是因为它在水平方向上距离起点A只有一个方格。相同的,起点A方格的正上方、下方和左侧的方格都具有相同的 G = 10。对角线正方形的 G = 14。

H 的值是通过估计当前方块到终点方块的距离来计算的,仅计算水平和垂直移动并忽略挡路的墙壁。在不计算对角线移动并忽略障碍物的规则下,起点A右侧的正方形与红色正方形相距 3 个正方形,H =30。这个正方形上方的正方形距离终点 4 个方格,H =40。

同样,每个方格的 F 值为 G 和 H 相加。

4 继续搜索

在第二节时,我们已经得到了open list,要继续搜索,我们只需从 open list 中选择F值最低的方块。

在我们最初的 9 个方格中,在起点A方格切换到 close list 后,我们还剩下 8 个方格在 open list 中。其中,F 成本最低的是起始方格右侧的那个,F 分数为 40。因此,我们选择这个方块作为下一个方块。在下图中,它以蓝色突出显示。

然后,对选定的方块执行以下操作:

1.首先,我们将其从 open list 中删除,并将其添加到 close list 中。然后我们检查相邻的方块。这个正方形右边是墙方块,所以我们忽略它们。左边的是起点A。这在 close list 中,所以我们也忽略。

2.其他四个方格已经在 open list 中,因此我们需要检查使用这个方格到达那里的路径是否更好,使用 G 值作为参考。让我们看一下我们选择的正方形上方的正方形。它目前的 G 分数是 14。如果我们穿过当前的方块到达那里,G 分数将等于 20(从起点A向右移动一格 G=10,接着向上移动一格 G=10+10=20)。G 值 20 高于 14,所以这不是一条更好的路径。从图上很容易看出,从起始方格到达该方格更直接,只需沿对角线移动一个方格即可到达那里,而不是水平移动一个方格,然后垂直移动一个方格。

3.当我们对 open list 中的所有 4 个相邻方格重复此过程时,我们发现没有一个路径通过当前方块得到改善,因此我们没有更改任何内容。所以现在我们检查了所有相邻的方块,并准备移动到下一个方块。

4. open list 中现在减少到 7 个方格,然后我们选择 F 成本最低的方块。但是,在这种情况下,有两个得分为 54 的方块。那么我们选择哪一个呢?为了提高速度,选择添加到 open list 中的最后一个可能会更快。(对关系的不同处理是两个版本的 A* 可能会找到长度相等的不同路径的原因)因此,我们选择正下方和起始方块右侧的那个,如下图所示。

5. 当我们检查相邻的方块时,我们发现右边方块还是墙方块,所以我们忽略了它。上面的那个也是如此。我们也忽略了墙下的方块。因为障碍物让我们无法从对角线穿过,我们需要先往下走,然后再移动到那个方格,这样来绕过墙角。

6.  当前方块下方的另外两个方块尚未在 open list 中,因此我们添加它们,当前方块将成为它们的父方块。在其他三个方块中,有两个已经在封闭列表中(起始方块和当前方块正上方的方块,在图中都以蓝色突出显示),因此我们忽略它们。检查当前方格左侧的方格,看看如果您穿过当前方格到达那里,G 分数是否更低,显然没有。因此准备检查我们 open list 中的下一个方块。

7.我们重复这个过程,直到我们将终点添加到 close list 中,如下图所示:

8 从红色目标方块开始,然后按照箭头从一个方块向后移动到其父方块。直到回到起点,这就是算法得到的路径。它应该如下图所示。从起始方格 A 移动到目标方格 B ,从路径上每个方格(节点)的中心移动到下一个方格的中心,直到到达目标。

到此我们就了解了A*算法的基本实现方法。

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值