扩展欧几里得算法_A*算法

38b03ccf0ee8f73e485dc57bdbae788b.png

A*(念做:A Star)算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。其于1968年,由Stanford研究院的Peter Hart, Nils Nilsson和Bertram Raphael发表。它可以被认为是Dijkstra算法的扩展。 A* 算法是一种启发式算法,它利用启发信息寻找最优路径。A* 算法需要在地图中搜索节点,并设定适合的启发函数进行指导。通过评价各个节点的代价值,获取下一需要拓展的最佳节点,直至到达最终目标点位置。A* 算法优点在于对环境反应迅速,搜索路径直接,是一种直接的搜索算法,因 此被广泛应用于路径规划问题。其缺点是实时性差,每一节点计算量大、运算时间长,而且随着节点数的增多,算法搜索效率降低,而且A* 算法并没有完全遍历所有可行解,所得到的结果不一定是最优解。

A*算法通过下面这个函数来计算每个节点的优先级。

其中:

·

是节点n的综合优先级。当我们选择下一个要遍历的节点时,我们总会选取综合优先级最高(值最小)的节点。

·

是节点n距离起点的代价。

·

是节点n距离终点的预计代价,这也就是A*算法的启发函数。关于启发函数我们在下面详细讲解。

A*算法在运算过程中,每次从优先队列中选取

值最小(优先级最高)的节点作为下一个待遍历的节点。

另外,A*算法使用两个集合来表示待遍历的节点,与已经遍历过的节点,这通常称之为open_set和close_set。

完整的A*算法描述如下:

* 初始化open_set和close_set;
* 将起点加入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*算法的行为。

· 在极端情况下,当启发函数

始终为0,则将由
决定节点的优先级,此时算法就退化成了
算法。

· 如果

始终小于等于节点n到终点的代价,则A*算法保证一定能够找到最短路径。但是当
的值越小,算法将遍历越多的节点,也就导致算法越慢。

· 如果

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

· 如果

的值比节点n到终点的代价要大,则A*算法不能保证找到最短路径,不过此时会很快。

· 在另外一个极端情况下,如果

相较于
大很多,则此时只有
产生效果,这也就变成了最佳优先搜索。

由上面这些信息我们可以知道,通过调节启发函数我们可以控制算法的速度和精确度。因为在一些情况,我们可能未必需要最短路径,而是希望能够尽快找到一个路径即可。这也是A*算法比较灵活的地方。在实际运用中,比如栅格地图中,需要考虑道路的优先级,不同的道路需要不同的权值,还有就是AGV的特性也有很大的影响,比如有些AGV的转弯代价很高,直行代价很小,所以考虑最短路径的情况下也要考虑AGV不同行走方式的不同代价。综合上面这些因素,和你的选择和设计启发函数和代价函数。

网格形式的图,如果用距离来代表损失则有以下这些启发函数可以使用:

· 如果图形中只允许朝上下左右四个方向移动,则可以使用曼哈顿距离(Manhattan distance)。

· 如果图形中允许朝八个方向移动,则可以使用对角距离。切比雪夫距离

· 如果图形中允许朝任何方向移动,则可以使用欧几里得距离(Euclidean distance)。

本文主要引用了https://paul.pub/a-star-algorithm/

算法的代码 paulQuei/a-star-algorithm

参考资料:

https://www.cs.cmu.edu/~motionplanning/lecture/AppH-astar-dstar_howie.pdf

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值