*搜索gydF4y2Ba
A*(发音为“A星”)是一台计算机gydF4y2Ba算法gydF4y2Ba广泛应用于寻路和gydF4y2Ba图gydF4y2Ba遍历。该算法有效地在图上的多个节点(或点)之间绘制出一条可行走的路径。gydF4y2Ba
在有许多障碍的地图上,寻径从点开始gydF4y2Ba 来gydF4y2Ba 是很困难的。例如,一个机器人,如果没有太多其他的方向,就会继续前进,直到遇到障碍,就像下面左边的寻路例子一样。gydF4y2Ba
然而,A*算法引入了一个gydF4y2Ba启发式gydF4y2Ba变成一个规则的图搜索算法,本质上是提前规划每一步,以便做出更优的决策。有了A*,机器人会以类似下图的方式找到一条路径。gydF4y2Ba
A*是的扩展gydF4y2Ba迪杰斯特拉算法gydF4y2Ba具有gydF4y2Ba广度优先搜索(BFS)gydF4y2Ba.gydF4y2Ba
内容gydF4y2Ba
A *算法gydF4y2Ba
与Dijkstra一样,A*的工作原理是创造一条成本最低的路径gydF4y2Ba树gydF4y2Ba从开始节点到目标节点。A*的不同之处在于,对于每个节点,A*都使用一个函数gydF4y2Ba 这给出了使用该节点的路径的总开销的估计。因此,A*是一个启发式函数,它不同于算法,因为启发式更多的是一个估计,不一定是可证明的正确。gydF4y2Ba
A*通过使用这个函数扩展已经比较便宜的路径:gydF4y2Ba
在哪里gydF4y2Ba
=通过节点的路径的总估计成本gydF4y2Ba
=到节点为止的花费gydF4y2Ba
的估计费用gydF4y2Ba 目标。这是成本函数的启发式部分,它就像一个猜测。gydF4y2Ba
在上面的网格中,A*算法从开始(红色节点)开始,并考虑所有相邻的单元格。一旦相邻的单元格列表被填充,它就会过滤掉那些无法访问的单元格(墙壁、障碍、越界)。然后它选择最低的单元格gydF4y2Ba成本gydF4y2Ba,即估计f(n)。这个过程递归地重复,直到找到到目标(蓝色节点)的最短路径。的计算gydF4y2Ba 是通过启发式来完成的,通常会得到很好的结果。gydF4y2Ba
的计算gydF4y2Ba 可以通过多种方式实现:gydF4y2Ba
的gydF4y2Ba曼哈顿距离gydF4y2Ba(在下面解释)从节点gydF4y2Ba 对目标经常使用。这是网格的标准启发式。gydF4y2Ba
如果gydF4y2Ba = 0时,A*为Dijkstra算法,保证能找到最短路径。gydF4y2Ba
启发式函数必须是gydF4y2Ba容许gydF4y2Ba这意味着它永远不会高估实现目标的成本。曼哈顿的距离和gydF4y2Ba = 0是可接受的。gydF4y2Ba
启发式gydF4y2Ba
使用良好的启发式对于确定性能非常重要gydF4y2Ba .的价值gydF4y2Ba 理想情况下等于到达目的地的确切成本。然而,这是不可能的,因为我们甚至不知道路径。然而,我们可以选择一种方法,在某些时候会给我们准确的值,比如在没有障碍物的直线旅行时。这将导致一个完美的表现gydF4y2Ba 在这种情况下。gydF4y2Ba
我们希望能够选择一个函数gydF4y2Ba 这比达到我们目标的成本还低。这将允许gydF4y2Ba 为了准确地工作,如果我们选择的值gydF4y2Ba 它将导致更快但更不准确的性能。因此,通常情况下我们选择angydF4y2Ba 这比实际成本要低。gydF4y2Ba
曼哈顿距离启发法gydF4y2Ba
这种计算方法gydF4y2Ba 被称为曼哈顿方法,因为它是通过计算从当前方格移动到目标方格的水平和垂直方格总数来计算的。我们忽略了对角线移动和任何可能在路上的障碍。gydF4y2Ba
只要路径是直线,这个启发式就成立。也就是说,gydF4y2Ba 会发现直线运动的组合路径。有时我们可能更喜欢沿着直线直接到达目的地的路径。gydF4y2Ba
欧氏距离启发式gydF4y2Ba
这个启发式比曼哈顿的启发式稍微准确一些。如果我们试图在同一个迷宫中同时运行这两种路径,欧几里得寻径器倾向于沿着直线运行。这更准确,但也更慢,因为它必须探索更大的区域来找到路径。gydF4y2Ba
深度优先搜索在可接受的启发式下是否总能扩展至少和A*搜索一样多的节点?gydF4y2Ba
答案是否定的,但是深度优先搜索可能,有时,幸运的是,扩展的节点比gydF4y2Ba 使用可接受的启发式进行搜索。gydF4y2Ba如gydF4y2Ba..从逻辑上讲,有时,如果运气好,深度优先搜索可以直接到达目标而不回溯。gydF4y2Ba
的主要缺点gydF4y2Ba 算法和任何最佳优先搜索的关键是它的内存需求。由于至少要保存整个开放列表,A*算法在实际中受到严重的空间限制,在当前机器上并不比最佳优先搜索算法更实用。gydF4y2Ba
实现gydF4y2Ba
A*算法的伪代码是用类似python的语法表示的。gydF4y2Ba
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18gydF4y2Ba |
|
的时间复杂度gydF4y2Ba 这取决于启发式。在最坏的情况下,扩展的节点数是解(最短路径)长度的指数级,但当搜索空间是树时,它是多项式级。gydF4y2Ba
例子gydF4y2Ba
使用A*找到从绿色方块到下面网格中黄色方块的最短路径。gydF4y2Ba
让我们从选择一个可接受的启发式开始。对于这种情况,我们可以使用曼哈顿启发式。然后我们继续到起始单元。我们称之为我们的gydF4y2Ba
当前单元格gydF4y2Ba
然后我们继续看它所有的邻居并计算gydF4y2Ba 对于每一个。然后我们选择最低的邻居gydF4y2Ba 成本。这是我们新的gydF4y2Ba当前单元格gydF4y2Ba
然后我们重复上面的过程。(填充邻居并进行计算gydF4y2Ba ,gydF4y2Ba 而且gydF4y2Ba 选择最低的)。我们一直这样做,直到到达目标单元格。下图演示了如何进行搜索。在每个单元格中各自的gydF4y2Ba ,gydF4y2Ba 而且gydF4y2Ba 值显示。还记得gydF4y2Ba 到达细胞和的过程中产生的成本是多少gydF4y2Ba 曼哈顿到黄色格子的距离是多少gydF4y2Ba 是和gydF4y2Ba 而且gydF4y2Ba .gydF4y2Ba
参考文献gydF4y2Ba
- 帕特尔。gydF4y2Ba介绍一个*gydF4y2Ba.检索于2016年4月29日gydF4y2Bahttp://theory.stanford.edu/~amitp/GameProgramming/concave1.pnggydF4y2Ba
- 帕特尔。gydF4y2Ba介绍一个*gydF4y2Ba.检索于2016年4月29日gydF4y2Bahttp://theory.stanford.edu/~amitp/GameProgramming/concave2.pnggydF4y2Ba