当前位置:编程学习 > C/C++ >>

经典算法研究系列:一之续、A*,Dijkstra,双向BFS算法性能比较及A*算法的应用

 本文,即以演示图的形式,比较它们各自的寻路过程,让各位对它们有一个清晰而直观的印象。
    我们比较,以下五种算法:
        1. A* (使用曼哈顿距离)
        2. A* (采用欧氏距离)
        3. A* (利用切比雪夫距离)
        4. Dijkstra
        5. Bi-Directional Breadth-First-Search(双向广度优先搜索)

    咱们以下图为例,图上绿色方块代表起始点,红色方块代表目标点,紫色的方块代表障碍物,白色的方块代表可以通行的路径。
    下面,咱们随意摆放起始点绿块,目标点红块的位置,然后,在它们中间随便画一些障碍物,
    最后,运行程序,比较使用上述五种算法,得到各自不同的路径,各自找寻过程中所覆盖的范围,各自的工作流程,并从中可以窥见它们的效率高低。


A*、Dijkstra、BFS算法性能比较演示:
    ok,任意摆放绿块与红块的三种状态:
一、起始点绿块,与目标点红块在同一条水平线上:\


各自的搜寻路径为:
        1. A* (使用曼哈顿距离)\

        2. A* (采用欧氏距离)\

        3. A* (利用切比雪夫距离)\

        4. Dijkstra 算法.//很明显,Dijkstra 搜寻效率明显差于上述A* 算法。(看它最后找到目标点红块所走过的路径,和覆盖的范围,即能轻易看出来,下面的比较,也是基于同一个道理。看路径,看覆盖的范围,评价一个算法的效率)。

\ 

       5. Bi-Directional Breadth-First-Search(双向广度优先搜索) \

 

二、起始点绿块,目标点红块在一斜线上:

\

各自的搜寻路径为:
        1. A* (使用曼哈顿距离)\

        2. A* (采用欧氏距离)\

        3. A* (利用切比雪夫距离)\

        4. Dijkstra 算法。 //与上述A* 算法比较,覆盖范围大,搜寻效率较低。

 \

        5. Bi-Directional Breadth-First-Search(双向广度优先搜索)\ \

 

三、起始点绿块,目标点红块被多重障碍物阻挡:

\

各自的搜寻路径为(同样,还是从绿块到红块):
        1. A* (使用曼哈顿距离)\

        2. A* (采用欧氏距离)..\

        3. A* (利用切比雪夫距离)\

        4. Dijkstra....\

        5. Bi-Directional Breadth-First-Search(双向广度优先搜索)  //覆盖范围同上述Dijkstra 算法一样很大,效率低下。\\


A*搜寻算法的高效之处
      如上,是不是对A*、Dijkstra、双向BFS算法各自的性能有了个总体大概的印象列?由上述演示,我们可以看出,在最短路径搜寻效率上,一般有A*>Dijkstra、双向BFS,其中Dijkstra、双向BFS到底哪个算法更优,还得看具体情况。
      由上,我们也可以看出,A*搜寻算法的确是一种比较高效的寻路算法。

      A*算法最为核心的过程,就在每次选择下一个当前搜索点时,是从所有已探知的但未搜索过点中(可能是不同层,亦可不在同一条支路上),选取f值最小的结点进行展

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,