【科技前沿】什么是 A* 搜索算法?

32 篇文章 1 订阅
11 篇文章 0 订阅

945aeef983be4e3fb922a1b6cdc5ed75.png

智力是人类的力量;我们利用它来改善我们的生活。然后,我们创造了人工智能的概念来增强人类智力,并以前所未有的方式发展和繁荣文明。A* 搜索算法就是这样一种算法,它是为了帮助我们而开发的。在本博客中,我们将进一步了解人工智能中 A* 算法的含义、人工智能中 A* 搜索算法所涉及的步骤、它在 Python 中的实现等。

人工智能帮助我们解决各种复杂的问题。路径搜索问题等计算问题可以用人工智能解决。搜索问题需要找到从一个点到另一个点的路径,例如从点 A 到点 B。有时你需要通过将这些问题映射到图形中来解决它,其中节点代表所有可能的结果。A* 算法可以解决这些问题。

A* 是 Shakey 项目的一部分,该项目旨在构建一个具有人工智能来规划其行动的移动机器人,它最初被设计为一种通用的图遍历算法。它广泛用于解决视频游戏中的寻路问题。由于其灵活性和多功能性,它可以在广泛的环境中使用。A* 由加权图构成,这意味着它可以找到距离和时间成本最小的最佳路径。这使得人工智能中的 A* 算法成为最佳优先搜索的明智搜索算法。让我们详细了解 A* 的各个方面。

什么是 A* 搜索算法?

89d144444ceb4a019852e622bc6a8b54.png

A* 搜索算法是一种与其他遍历技术不同的算法。这使得 A* 变得智能,并使其远远领先于传统算法。 

让我们尝试理解基本 AI 概念并理解 A* 算法的工作原理。想象一个巨大的迷宫,它太大了,手动到达终点需要几个小时。一旦你步行完成它,你就需要去另一个。这意味着你最终会投入大量时间和精力来寻找这个迷宫中的可能路径。现在,你想让它不那么耗时。为了更容易,我们将把这个迷宫视为一个搜索问题,并尝试将其应用于我们可能在适当的时候遇到的其他可能的迷宫,只要它们遵循相同的结构和规则。

作为将这个迷宫转换成搜索问题的第一步,我们需要定义这六个事物。

  1. 我们可能处于的一系列未来状态
  2. 开始和结束状态
  3. 判断我们是否已经到达终点的方法
  4. 针对可能的方向/路径改变的一组操作
  5. 为我们提供操作结果建议的函数 
  6. 在不同状态/移动路径中发生的一组成本

为了解决这个问题,我们需要将交点映射到节点(用红点表示)以及我们可以向边缘移动的所有可能方式(用蓝线表示)。A
表示起点,B 表示终点。我们分别在节点 A 和 B 处定义起点和终点。
如果我们使用无知搜索算法,这就像寻找一条盲目的路径,而搜索问题的知情算法会选择让你更接近目的地的路径。例如,考虑魔方;它有许多你可能处于的预期状态,这使得解决方案非常困难。这需要使用引导搜索算法来找到解决方案。这解释了 A* 的重要性。  
与其他算法不同,A* 仅在其功能令人信服且合理的情况下才决定采取一步。这意味着它从不考虑任何非最佳步骤。这就是为什么 A* 是复制现实世界的 AI 系统的热门选择——例如视频游戏和机器学习。 

3ac61de633634e71b3dd9b255fb92613.png

A* 搜索算法步骤

步骤 1:将起始节点添加到打开列表
步骤 2:重复以下步骤

在打开列表中,找到 F 成本最低的方格,即当前方格。现在我们转到关闭方格。

考虑当前方格相邻的 8 个方格,如果它在封闭列表中或不可行,则忽略它。如果可行,请执行以下操作。

检查它是否在打开列表中;如果不在,则添加它。您需要将当前方格设为此方格的父方格。现在您将记录方格的不同成本,例如 F、G 和 H 成本。 

如果它在开放列表中,则使用 G 成本来衡量更好的路径。G 成本越低,路径越好。如果此路径更好,则将当前方格设为父方格。现在您需要重新计算其他分数——该方格的 G 和 F 分数。 

 你将停止:

如果找到了路径,则需要检查封闭列表并将目标方格添加到其中。

如果开放列表为空并且你找不到目标方格,则没有路径。

步骤3:现在你可以保存路径并反向操作,从目标方格开始,从你经过的每个方格到父方格,直到它带你到起始方格。你现在已经找到了你的路径。  

为什么首选 A* 搜索算法? 

让物体运动起来很容易。但寻路并不简单。这是一项复杂的练习。以下情况解释了这一点。 

任务是将您在图底部看到的单元带到图顶部。您可以看到,没有任何迹象表明该物体不应该走用粉色线表示的路径。所以它选择朝那个方向移动。当它到达顶部时,由于“U”形障碍物,它必须改变方向。然后它改变方向,绕过障碍物到达顶部。与此相反,A* 会扫描物体上方的区域并找到一条短路径(用蓝线表示)。因此,像 A* 这样的寻路算法可以帮助您规划事情,而不是等到您发现问题。它们主动采取行动,而不是对情况做出反应。缺点是它比其他算法慢一点。您可以将两者结合使用以获得更好的结果 - 寻路算法提供更大的画面和长路径,障碍物变化缓慢,而移动算法提供局部画面和短路径,障碍物变化更快。 

让物体运动起来很容易。但寻路并不简单。这是一项复杂的练习。以下情况解释了这一点。 

任务是将您在图底部看到的单元带到图顶部。您可以看到,没有任何迹象表明该物体不应该走用粉色线表示的路径。所以它选择朝那个方向移动。当它到达顶部时,由于“U”形障碍物,它必须改变方向。然后它改变方向,绕过障碍物到达顶部。与此相反,A* 会扫描物体上方的区域并找到一条短路径(用蓝线表示)。因此,像 A* 这样的寻路算法可以帮助您规划事情,而不是等到您发现问题。它们主动采取行动,而不是对情况做出反应。缺点是它比其他算法慢一点。您可以将两者结合使用以获得更好的结果 - 寻路算法提供更大的画面和长路径,障碍物变化缓慢,而移动算法提供局部画面和短路径,障碍物变化更快。 

A* 搜索算法及其基本概念

A* 算法基于启发式方法,这有助于实现最优性。A* 是最佳优先算法的另一种形式。最优性使算法能够找到问题的最佳解决方案。此类算法还提供完整性;如果现有问题有任何可能的解决方案,算法一定会找到它。  

当 A* 进入问题时,它首先计算前往邻近节点的成本,并选择成本最低的节点。如果 f(n) 表示成本,则 A* 选择 f(n) 值最低的节点。此处“n”表示邻近节点。该值的计算如下所示:

f(n)=g(n)+h(n)f(n)=g(n)+h(n)
g(n) = 显示从起始节点到节点 n 的最短路径的值
h(n) = 节点值的启发式近似值

启发式值对于 A* 算法的效率起着重要作用。为了找到最佳解决方案,您可能需要根据问题的类型使用不同的启发式函数。然而,创建这些函数是一项艰巨的任务,这是我们在 AI 中面临的基本问题。 

什么是启发式函数?

84a7edecca674cc0baf33d967a95754d.png

启发式算法简称为启发式函数,它有助于对搜索算法中每个步骤给出的替代方案进行排序。它可以单独产生结果,也可以与给定算法结合产生结果。本质上,启发式函数可帮助算法更快、更有效地做出最佳决策。此排序基于最佳可用信息,可帮助算法决定要遵循的最佳分支。可接受性和一致性是启发式函数的两个基本属性。

启发式函数的可接受性

如果启发式函数能够有效估计节点“n”与末端节点之间的实际距离,则该函数是可接受的。它绝不会高估;如果高估,则用“d”表示,这也表示解决方案的准确性。

启发式函数的一致性

如果给定启发式函数的估计值等于或小于目标 (n) 与邻居之间的距离以及计算出的到达该邻居的成本,则启发式函数是一致的。

A* 确实是一种非常强大的算法,可用于提高人工智能的性能。它是人工智能中最流行的搜索算法之一。当谈到这种算法的潜力时,天空才是极限。然而,A* 算法的效率在很大程度上取决于其启发式函数的质量。想知道为什么这种算法在许多软件系统中受到青睐和使用吗?人工智能的每一个方面都应用了 A* 算法。从搜索优化到游戏、机器人和机器学习,A* 算法是智能程序不可或缺的一部分。

使用 Python实现

在本节中,我们将了解如何使用 A* 搜索算法来查找图中最具成本效益的路径。考虑下面的图表。

b26690f84cd64be4b477cee7e188cded.png

边上的数字表示节点之间的距离,而节点上的数字表示启发式值。让我们使用 A* 算法找到从起始状态 A 到最终状态 G 的最经济有效的路径。

我们从节点 A 开始。由于 A 是起始节点,因此 A 的 g(x) 值为零,从图中我们得到 A 的启发式值为 11,因此 

g(x)+ h(x)= f(x)
0+ 11 =11
因此对于 A,我们可以写
答:11
现在我们可以从 A 点到达 B 点或 E 点,因此我们为每个点计算 f(x)
A→B=2+6=8
A→E=3+6=9
由于 A → B 的成本较小,我们沿着这条路径前进并计算 B 子节点的 f(x)
由于 C 和 G 之间没有路径,因此启发式成本设置为无穷大或非常高的值
A→B→C = (2 + 1) + 99 = 102
A→B→G=(2+9)+0=11
这里路径 A → B → G 的成本最小,但仍然高于 A → E 的成本,因此我们进一步探索这条路径
A→E→D=(3+6)+1=10
将 A → E → D 的成本与我们目前得到的所有路径进行比较,由于这个成本最小,所以我们继续沿着这条路径前进。并计算 D 的子节点的 f(x)
A→E→D→G=(3+6+1)+0=10
现在比较所有到达目标的路径,我们得出结论:A→E→D→G 是从 A 到 G 最具成本效益的路径。

44b85557e669401baa5bcf4aed8ad514.png

接下来我们用Python编写一个程序,利用a-star算法找到最具成本效益的路径。

首先,我们创建两个集合,即开放集合和关闭集合。开放集合包含已访问过的节点,但其邻居尚未被探索。另一方面,关闭集合包含已访问过的节点及其邻居。

def aStarAlgo(start_node, stop_node):
         
        open_set = set(start_node) 
        closed_set = set()
        g = {} #store distance from starting node
        parents = {}# parents contains an adjacency map of all nodes
 
        #ditance of starting node from itself is zero
        g[start_node] = 0
        #start_node is root node i.e it has no parent nodes
        #so start_node is set to its own parent node
        parents[start_node] = start_node
         
         
        while len(open_set) > 0:
            n = None
 
            #node with lowest f() is found
            for v in open_set:
                if n == None or g[v] + heuristic(v) < g[n] + heuristic(n):
                    n = v
             
                     
            if n == stop_node or Graph_nodes[n] == None:
                pass
            else:
                for (m, weight) in get_neighbors(n):
                    #nodes 'm' not in first and last set are added to first
                    #n is set its parent
                    if m not in open_set and m not in closed_set:
                        open_set.add(m)
                        parents[m] = n
                        g[m] = g[n] + weight
                         
     
                    #for each node m,compare its distance from start i.e g(m) to the
                    #from start through n node
                    else:
                        if g[m] > g[n] + weight:
                            #update g(m)
                            g[m] = g[n] + weight
                            #change parent of m to n
                            parents[m] = n
                             
                            #if m in closed set,remove and add to open
                            if m in closed_set:
                                closed_set.remove(m)
                                open_set.add(m)
 
            if n == None:
                print('Path does not exist!')
                return None
 
            # if the current node is the stop_node
            # then we begin reconstructin the path from it to the start_node
            if n == stop_node:
                path = []
 
                while parents[n] != n:
                    path.append(n)
                    n = parents[n]
 
                path.append(start_node)
 
                path.reverse()
 
                print('Path found: {}'.format(path))
                return path
 
 
            # remove n from the open_list, and add it to closed_list
            # because all of his neighbors were inspected
            open_set.remove(n)
            closed_set.add(n)
 
        print('Path does not exist!')
        return None
         
#define fuction to return neighbor and its distance
#from the passed node
def get_neighbors(v):
    if v in Graph_nodes:
        return Graph_nodes[v]
    else:
        return None
#for simplicity we ll consider heuristic distances given
#and this function returns heuristic distance for all nodes
def heuristic(n):
        H_dist = {
            'A': 11,
            'B': 6,
            'C': 99,
            'D': 1,
            'E': 7,
            'G': 0,
             
        }
 
        return H_dist[n]
 
#Describe your graph here  
Graph_nodes = {
    'A': [('B', 2), ('E', 3)],
    'B': [('C', 1),('G', 9)],
    'C': None,
    'E': [('D', 6)],
    'D': [('G', 1)],
     
}
aStarAlgo('A', 'G')

输出:

找到的路径:[‘A’,‘E’,‘D’,‘G’]

与 A* 搜索算法相关的常见问题解答

A*算法如何工作?

A* 算法通过图中的顶点进行工作,从对象的起点开始,然后重复检查下一个未检查的顶点,并将其顶点添加到将要检查的顶点集合中。 

A* 和 AO* 算法有什么区别?

A* 是一种用于寻找单一解决方案的“或”图算法,而 AO* 算法是一种用于通过对多个分支进行“与”运算来寻找多个解决方案的“与-或”图算法。

A*算法为什么受欢迎?

A* 算法之所以流行,是因为它是一种用于查找路径和图形遍历的技术。许多基于网络的地图和游戏都使用此算法。

A* 比 Dijkstra 更好吗?

A* 通常被认为比 Dijkstra 更好,因为它执行的是知情搜索而不是无知搜索。它扩展了更有希望的顶点。

Google 地图使用 A* 算法吗?

不。Google Maps 使用 Dijkstra 算法。

为什么 A* 是最优的?

A* 算法是最优的。它依靠开放和封闭列表来寻找一条通往目标的最佳且完整的路径。

A* 算法中如何处理高估?

当启发式估计值高于最终路径的实际成本时,就会发生高估。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月下独码

你的打赏是我精心创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值