基于搜索的路径规划算法总结
一般而言,全局路径规划都是假设全局地图是完全已知的,然后就可以根据已知的全局信息进行全局规划。当然,也存在假设全局地图是部分未知的或完全未知的规划算法,如D*算法,这部分在本文中暂且不涉及。本文涉及的全局规划算法包括:
- 广度优先算法(Breadth-first Searching,bfs)
- 深度优先算法(Depth-first Searching,dfs)
- Dijkstra算法
- 最佳优先搜索算法(Best-first Searching,BFS)
- A*算法
1.概述
为什么要对上述算法做总结呢?因为我在用MATLAB对上述算法做编程实现时,发现它们的程序绝大部分是完全相同的,仅在于部分程序有所区别。
首先,上述规划算法都依赖于两张表格,即OPEN
和CLOSED
。前者表示算法即将检查的节点,后者表示算法已经完成检查的节点。依赖于这两张表格,算法可以实现对地图上部分节点或全部节点的代价检查,然后搜索到一条代价最小的路径。
所谓代价,即cost
,表示起点到检查节点的距离(距离的表示多种多样,可根据实际情况选择),常常用字母g
表示;除此之外,常常还会涉及另外一个代价,被称为启发代价,一般表示为检查节点到终点的距离,常常用字母h
表示。
以上都是上文提到的所有算法都需要的部分,那么它们的区别在哪里呢?根据OPEN
,算法可以知道应该对哪些节点进行检查,但问题是该优先检查OPEN
中的哪个节点呢?
- bfs算法认为应该优先检查
OPEN
中最先放入的节点(first-in-first-out),即应该先检查所有的父节点,然后再去检查以这些父节点延伸出来的子节点。也就是所谓的广度优先,这个广度可以看作是从起点开始到被检查节点所经过的节点的个数,若个数越少,则优先度越高; - dfs算法认为应该优先检查
OPEN
中最后放入的节点(last-in-first-out),即应该先检查以一个父节点延伸出来的一条可能的路径,若这条路径不行,再去检查另一个父节点。也就是所谓的深度优先,这个深度可以看作是从起点开始到被检查节点所经过的节点的个数,若个数越多,则优先度越高; - Dijkstra算法认为应该优先检查
OPEN
中代价(g
)最小的节点; - BFS算法认为应该优先检查
OPEN
中启发代价(h
)最小的节点; - A*算法认为应该优先检查
OPEN
中总代价(f=g+h
)最小的节点;
虽然上述算法的优先搜索顺序的标准各不相同,但需要注意的一点是,在进行节点检查时,它们都是以g
值为标准的,总体g
值小的路径被认为是最优路径。也就是说,不考虑那些未被检查的节点,至少在被检查过的所有节点(即在CLOSED
中的节点)中,这个标准可以让算法在最后得到的路径代价最小。
换句话说,如果可以遍历所有节点,那么基于g
值的检查可以保证算法得到一条最优路径;如果只能遍历部分节点,那么基于g
值的检查可以保证算法至少在这些已被检查的节点中得到一条最优路径。
2.算法对比
本文实现的所有算法都是在MATLAB R2019b
上运行的。基本设置如下:
- 地图大小设置为20*20,起点为[1,1],终点为[20,20],地图上会随机生成80个障碍物
2.1.广度优先搜索算法
2.2.深度优先搜索算法
2.3.Dijkstra算法
2.4.最佳优先搜索算法
2.5.A*算法
以上都是基于我的个人理解,若是哪里有问题,还请各位不吝赐教。