A星算法

A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法。

注意是最有效的直接搜索算法。之后涌现了很多预处理算法(ALTCHHL等等),在线查询效率是A*算法的数千甚至上万倍。

公式表示为: f(n)=g(n)+h(n),

其中 f(n) 是从初始点经由节点n到目标点的估价函数,

g(n) 是在状态空间中从初始节点到n节点的实际代价,

h(n) 是从n到目标节点最佳路径的估计代价。

保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:

估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。并且如果h(n)=d(n),即距离估计h(n)等于最短距离,那么搜索将严格沿着最短路径进行,此时的搜索效率是最高的。



然后我们通过图文结合的形式来解释下,如下图:




图中有这么几个要点先需要了解

1
、类似迷宫图,分开始节点(start)、障碍物、结束节点(end),我们需要从start节点探寻一条到end节点的路线

2
、对于探寻的每一步,都会以当前节点为基点,扫描其相邻的八个节点 

3
、计算当前节点与start节点及到end的距离

4
、计算出最短路径


如果明白了上面的场景描述,下面就可以进行分析了。

A*算法中,核心思想是一个公式,上面已经提到过:f(n)=g(n)+h(n)

仅通过文字可能有些朋友不是很了解,下面我们就举例说明:

start节点为例,探寻相邻的八个节点,且只能上下左右移动,每移动到邻近的单元格,我们认为行走了一个距离。

比如从start移动到A节点,就移动了两个距离,从A节点移动到end节点(此时忽略障碍,仅计算距离)

这时公式中的g(n)就可以理解为g(A)=2h(n)就理解为h(A)=6, 

f(n)
就是start节点到end节点的实际距离,公式描述为:f(A)=g(A)+h(A)=8

于是就有了A节点的数字描述——f(n)位于左上方,g(n)位于左下方,h(n)位于右下方。

同理,可计算出f(B) = g(B) + h(B) = 1+ 5 = 6 

这时start相邻的其它节点变都可以计算出来了

现在理念明白了,该如何实现呢?

可以通过对相邻节点的便利及父节点的不断嵌套来形成一条路径。

比如我们把start相邻的所有节点进行便利比较,选出f(n)最小的一个节点(我们称为X节点),并设置X节点的父节点为start节点,并以X节点为当前节点,再判断X节点周围的有效节点(如障碍物完全可以忽略),选出f(n)最小的节点后设置X节点为其父节点,依次类推,就形成了一条节点线,这个算法也就完成了。 

 

 

 

 

 

 

 搜索过程中设置两个表:OPEN和CLOSED。OPEN表保存了所有已生成而未考察的节点就是当前点的子节点,CLOSED表中记录已访问过的节点,就是最优的点。算法中有一步是根据估价函数重排OPEN表。这样循环中的每一步只考虑OPEN表中状态最好的节点。具体搜索过程如下:

 

  1)初始状态:

      OPEN=[A5];           CLOSED=[];

  2)估算A5,取得所有子节点,并放入OPEN表中;

      OPEN=[B4, C4, D6];        CLOSED=[A5]

  3)估算B4,取得所有子节点,并放入OPEN表中;

      OPEN=[C4, E5, F5, D6];      CLOSED=[B4, A5]

  4)估算C4;取得所有子节点,并放入OPEN表中;

      OPEN=[H3, G4, E5, F5, D6]     CLOSED=[C4, B4,A5]

  5)估算H3,取得所有子节点,并放入OPEN表中;

      OPEN=[O2, P3, G4, E5, F5, D6];  CLOSED=H3C4, B4,A5]

  6)估算O2,取得所有子节点,并放入OPEN表中;

      OPEN=[P3, G4, E5, F5, D6];    CLOSED=[O2, H3,C4, B4, A5]

  7)估算P3,已得到解;

 

 

Me:先计算A5附近最优的点,得到那个就放到closed,若一样也放入。

结算最优的点附加的最优点1,得到那个就放到closed,若一样也放入。一次类推

得到最佳路径。

在计算估值得时候可以使用2点之间的直线距离来计算。

 

 

 

 

 

 

  看了具体的过程,再看看伪程序吧。算法的伪程序如下:

 

  Best_First_Search()

  {

    Open = [起始节点];

    Closed = [];

    while ( Open表非空 )

    {

      从Open中取得一个节点X, 并从OPEN表中删除.

      if (X是目标节点)

      {

        求得路径PATH;

        返回路径PATH;

      }

      for (每一个X的子节点Y)

      {

        if( Y不在OPEN表和CLOSE表中 )

        {

          求Y的估价值;

          并将Y插入OPEN表中; //还没有排序

        }

        else if( Y在OPEN表中 )

        {

          if( Y的估价值小于OPEN表的估价值 )

            更新OPEN表中的估价值;

        }

        else //Y在CLOSE表中

        {

          if( Y的估价值小于CLOSE表的估价值 )

          {

            更新CLOSE表中的估价值;

            从CLOSE表中移出节点, 并放入OPEN表中;

          }

        }

        将X节点插入CLOSE表中;

        按照估价值将OPEN表中的节点排序;

      } //end for

    } //end while

  } //end func

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
近年来,人们对于A算法进行了不断的探索和改进。而MATLAB也成为了改进A算法的常用工具之一。 首先,MATLAB可以利用其优越的可视化功能使得A算法的结果更加清晰明了。通过绘制出地图、障碍物、起点、终点等元素,可以更加直观地理解A算法的执行过程和结果。同时,MATLAB还可以进行数据可视化,通过可视化的方式展示A算法在不同场景下的效果和缺陷,进而指导改进方向和方式。 其次,MATLAB可以加速A算法的执行过程。具体而言,MATLAB中提供了复杂矩阵运算的优化算法,可以有效提高算法的效率;此外,MATLAB还拥有多线程运算和并行计算等功能,可以进一步加快算法的执行速度。因此,借助MATLAB进行A算法改进,不仅能够提高算法的可读性和可视化效果,而且可以提升算法的效率和速度。 最后,MATLAB还可以与其他优秀的算法和库集成,进而提高A算法的精度和效果。例如,可以利用MATLAB内置的计算机视觉库进行图像识别和分类,从而精确的确定机器人在地图上的位置和路线;同时,还可以结合深度学习和强化学习等算法对A算法进行改进,从而实现更加优秀的机器人路径规划。 综上所述,借助MATLAB进行A算法的改进具有很大的优势,能够提高算法的可视化、效率、精度和效果,可望在智能机器人等领域发挥越来越重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值