0


A*算法的介绍

提示:文章写完后,目录可以自## 标题动生成,如何生成可参考右边的帮助文档

文章目录


一、A*算法的由来及应用背景

在这里插入图片描述

二、A*算法的基本原理

1.基本数学原理

A*算法作为启发式搜索算法,其更新估值F来进行搜索

      F 
     
    
      = 
     
    
      G 
     
    
      + 
     
    
      H 
     
    
   
     F=G+H 
    
   
 F=G+H

 
  
   
   
     F 
    
   
  
    F 
   
  
F: 当前节点的总代价

 
  
   
   
     G 
    
   
  
    G 
   
  
G: 开始节点到当前节点的移动距离(实际代价)

 
  
   
   
     H 
    
   
  
    H 
   
  
H: 从当前节点到终点的估计移动距离(估计代价)

计算G代价为从起点到当前节点经过的所有边的距离之和。
计算H代价的启发函数h包括曼哈顿距离、对角距离(切比雪夫距离)、欧几里德距离。

注意点
1.计算H时,要忽略路径中的障碍物。这是对剩余距离的估算值,而不是实际值,因此H代价为估计代价。

2.在进行全局地图路径规划时,将环境信息转化为一个网格地图,其中每个网格表示环境的一个区域,障碍物的区域可以标记为障碍物网格,因此障碍物节点是已知的。

3.已知A*算法保证能够找到最短路径的条件是满足以下两个条件:
(1)启发函数h(n)必须满足单调性(即估计的代价不会超过从节点n到目标节点的实际代价),
(2)地图必须是可行的,即不存在无法通过的障碍物或无法到达的区域。

2.启发函数的选择

2.1曼哈顿距离

曼哈顿距离:

     D 
    
   
     = 
    
   
     ∣ 
    
    
    
      x 
     
    
      2 
     
    
   
     − 
    
    
    
      x 
     
    
      1 
     
    
   
     ∣ 
    
   
     + 
    
   
     ∣ 
    
    
    
      y 
     
    
      2 
     
    
   
     − 
    
    
    
      y 
     
    
      1 
     
    
   
     ∣ 
    
   
  
    D=|x_{2}-x_{1}|+|y_{2}-y_{1}| 
   
  
D=∣x2​−x1​∣+∣y2​−y1​∣,如下图:

粗=曼哈顿距离
如果图形中只允许朝上下左右四个方向移动,则可以使用曼哈顿距离。计算从当前栅格横向或纵向移动到达目标所经过的方格数。
在这里插入图片描述
例如在上图中中心节点可以朝着上下左右拓展,这时采用曼哈顿距离作为启发函数更有效。当拓展节点存在障碍物时:
在这里插入图片描述
A*算法会根据地图中的网格来判断每个节点的状态,即是否为障碍物节点。当算法扩展节点时,如果该节点是障碍物节点,则不会将其加入到待扩展节点集合中,从而避免沿着该节点继续搜索,这样就能够有效地避免穿越障碍物。

2.2对角距离(切比雪夫距离)

对角距离(切比雪夫距离):

     D 
    
   
     = 
    
   
     m 
    
   
     a 
    
   
     x 
    
   
     ( 
    
   
     ∣ 
    
    
    
      x 
     
    
      2 
     
    
   
     − 
    
    
    
      x 
     
    
      1 
     
    
   
     ∣ 
    
   
     + 
    
   
     ∣ 
    
    
    
      y 
     
    
      2 
     
    
   
     − 
    
    
    
      y 
     
    
      1 
     
    
   
     ∣ 
    
   
     ) 
    
   
  
    D=max(|x_{2}-x_{1}|+|y_{2}-y_{1}|) 
   
  
D=max(∣x2​−x1​∣+∣y2​−y1​∣),如下图:

对角距离
如果图形中允许朝八个方向移动,则可以使用对角距离。对角距离更适合处理允许斜向移动的情况,因为它考虑了斜向移动时的额外距离,使得估算更加准确。
在这里插入图片描述
当拓展节点存在障碍物时:
在这里插入图片描述

2.3欧几里德距离

欧几里德距离:

     D 
    
   
     = 
    
    
     
     
       ( 
      
      
      
        x 
       
      
        2 
       
      
     
       − 
      
      
      
        x 
       
      
        1 
       
      
      
      
        ) 
       
      
        2 
       
      
     
       + 
      
     
       ( 
      
      
      
        y 
       
      
        2 
       
      
     
       − 
      
      
      
        y 
       
      
        1 
       
      
      
      
        ) 
       
      
        2 
       
      
     
    
   
  
    D=\sqrt{(x_{2}-x_{1})^2+(y_{2}-y_{1})^2} 
   
  
D=(x2​−x1​)2+(y2​−y1​)2​,如下图:

欧几里得距离
允许朝任何方向移动则可以使用欧几里德距离。欧几里德距离直接计算两点之间的距离,更符合实际情况.。

注意:
启发函数跟拓展方式没有一定的捆绑关系,上述只是建议在哪种拓展节点的方式用何种启发函数。选择哪种启发函数取决于应用场景的具体情况,可以根据实际情况进行选择或者结合多种启发函数进行综合考虑。上述部分内容由ChatGPT-plus4.0给出,如有错误请大家自行判断。

三、A*算法的程序实现

1.算法逻辑

1.初始化开始节点S,最终节点G,初始化列表open,closed,初始化全局地图(网格地图)
2.从开始节点S出发,把S作为一个待检查的方格,放入open列表
3.寻找开始节点S周围可以到达的方格(最多八个),将它们放入open列表,并设置它们的父节点为S
4.从“open列表”中删除开始节点S,并将S放入到closed列表中
5.计算每个周围方格的F值 F=G+H
6.从open列表中选择F值最小的方格a,将其从open列表放入到closed列表中
7.检查a所有邻近的方格
1)障碍物和close列表中的方格不考虑
2)如果这些方格不在open列表中,将它们加入open列表,计算这些方格的F值,并设置父节点为a
3)如果某相邻的方格c已经在open列表中,计算新的路径从S到达方格c(即经过a的路径), 判断是否需要更新父节点和F值:如果新节点c的G值更低,则修改父方格为方格a,重新计算F值,H值不需要改变(因为方格到达目标点的预估代价是固定的),如果新节点c的G值比较高,则说明新的路径代价更高,则值不做改变(G值不变也不更新)
8.继续从open列表中找出F值最小的,从open列表中删除,添加到close列表,再继续找出周围可以到达的方块,如此循环
9.结束判断:当open列表中出现目标方块G时,说明路径已找到;当open列表中没有了数据,说明没有合适路径。

2.实验结果

     20 
    
   
     ∗ 
    
   
     20 
    
   
  
    20*20 
   
  
20∗20的栅格地图中,障碍物自定产生,启发函数h分别采用曼哈顿距离和欧几里德距离,每个节点可以朝四个方向扩展。得到的路径规划如左图。其中阴影部分为加入过列表(或搜索过)的方格。

在这里插入图片描述当我们增大网格地图,此时利用A*进行路径规划又会得到怎么的结果呢
在这里插入图片描述

      200 
     
    
      ∗ 
     
    
      200 
     
    
   
     200*200 
    
   
 200∗200的栅格地图中,障碍物随机产生,障碍物覆盖率占地图的20%,启发函数h分别采用曼哈顿距离和欧几里德距离,得到的路径规划如左图。

A*算法的启发式搜索过程中启发函数的估计值越接近真实值,规划效率越高。
在网格地图中,每个节点可以朝八个方向扩展,此时曼哈顿距离更能准确地反映两个节点之间的距离。相比之下,欧几里德距离计算的H值偏小,同时其需要进行开方运算,耗时较长。

在这里插入图片描述有小伙伴需要程序的可以私我。


四、A*算法的总结

A*算法的优缺点

优点:
1.最优性:在满足一定条件下, A算法能够保证找到最短路径。
2.快速性:相对于其他搜索算法, A
算法的搜索速度较快,因为它能够通过启发式函数来减少搜索的路径数。这使得A算法在处理大规模的搜索问题时非常高效。
3.适用性广泛: A
算法可以用于解决各种路径搜索问题,例如在计算机游戏中寻找最佳路径、在机器人导航中寻找最短路径等等。

缺点:
1.启发式函数不易设计: A算法需要使用启发式函数来估算每个节点到目标节点的距离,但是启发式函数2.的设计并不是一件容易的事情。如果启发式函数设计不好,那么搜索效率将会受到很大的影响。
存储空间占用较大: A
算法需要存储搜索过程中的节点信息,因此当搜索的状态空间较大时,它需要占用较大的存储空间。
3.可能陷入局部最优解:虽然A算法能够保证找到最短路径,但是当启发式函数不够好时, A算法可能会陷入局部最优解,而无法找到全局最优解。


本文转载自: https://blog.csdn.net/m0_51951660/article/details/129794499
版权归原作者 CL雾岚 所有, 如有侵权,请联系我们删除。

“A*算法的介绍”的评论:

还没有评论