A* Algorithm

是一种搜索算法,广泛用于最短路径搜索和图遍历,在多个“节点”之间寻找路径。 由于其性能和准确性得到广泛使用。

算法描述

是一种知情(informed)搜索算法,或者最佳优先搜索,意味着它是根据加权图表制定的:从图的特定起始节点开始,给定目标节点的路径成本条件下,找到具有最小成本的路径(最少行驶距离,最短时间,最省油等)。 通过维护一棵源自起始节点的路径树并且一次一个地延伸那些路径直到满足终止标准。

在其主循环的每次迭代中,需要确定扩展哪条路径。 它是根据下一节点的路径成本和将路径延伸到目标节点所需成本的估计来实现的。 具体来说,选择最小化的路径:

其中是路径上的下一个节点,是从起始节点到的路径成本,而是一个启发函数用于估计从到目标节点的最低成本。 当它选择扩展的路径是从开始到目标的最低成本路径或者已无路径可扩展时,终止。

启发函数(距离函数)视具体问题而定

  1. 如果启发式函数是可接受的(味着它永远不高估目标的实际成本),那么保证从开始到目标返回一条最低成本路径。但是当的值越小,算法需要遍历的节点越多,算法越慢。

  2. 如果完全等于节点到终点的代价,则算法将找到最佳路径,并且速度很快。可惜的是,并非所有场景下都能做到这一点。因为在没有达到终点之前,很难确切算出距离终点还有多远。

  3. 如果的值比节点到终点的代价要大,则算法不能保证找到最短路径,不过此时会很快,结果是次优的。

算法描实现

的典型实现使用优先级队列来执行重复选择的最小(估计)成本节点以进行扩展。 此优先级队列称为开集或边缘。 在算法的每个时间步长中,从队列中删除具有最低值的节点,相应地更新其相邻的和值,并将这些相邻值添加到队列中。 算法继续迭代,直到目标节点的值低于队列中的任何节点(或直到队列为空)。 然后,目标的值是最短路径的成本,因为在可接受的启发函数中,目标的为零。

伪代码

* 将起点加入open_set中,并设置优先级为0(优先级最高);
* 如果open_set不为空,则从open_set中选取优先级最高的节点n:
    * 如果节点n为终点,则:
        * 从终点开始逐步追踪parent节点,一直达到起点;
        * 返回找到的结果路径,算法结束;
    * 如果节点n不是终点,则:
        * 将节点n从open_set中删除,并加入close_set中;
        * 遍历节点n所有的邻近节点:
            * 如果邻近节点m在close_set中,则:
                * 跳过,选取下一个邻近节点
            * 如果邻近节点m也不在open_set中,则:
                * 设置节点m的parent为节点n
                * 计算节点m的优先级
                * 将节点m加入open_set中

你可能感兴趣的:(A* Algorithm)