BFS、Dijkstra、A*、Hybrid A*
做个正直的人
1、符号说明
C:closed list,里面存储的是所有已经处理过的节点
O:open list,里面存储的是所有已经发现但是还没有被放进closed list中的节点
U(x):表示所有可以对x采取的动作的集合,其返回结果是x的相邻节点
predecessor:父节点
2、宽度优先搜索BFS
BFS发表于1961年,它是工作在无权图或者等权图上的搜索算法。所以,图中的每一个边的权重都是相等的,那么影响一条路径长短的就只剩下边的个数了,也就是BFS中的层数。很明显,既然是宽度优先,那么BFS找到的路径一定是最优的。
它的步骤描述如下:
- 设置 C 和 O 为空集,设置起点 x s t a r t x_{start} xstart的predecessor 为null
- 将 x s t a r t x_{start} xstart压入O,BFS的O是一个先入先出的队列
- 弹出O的首节点x,并将x压入C
- 对x的下一个相邻节点 x s u c c x_{succ} xsucc
- 如果 x s u c c x_{succ} xsucc∈C,换下一个相邻节点;否则转6
- 如果 x s u c c x_{succ} xsucc∈O,换下一个相邻节点,否则转7
- 把 x s u c c x_{succ} xsucc的predecessor设为x;如果 x s u c c = x g x_{succ}=x_g xsucc=xg,到达目标,算法结束,否则转8
- 把 x s u c c x_{succ} xsucc压入O;如果x的相邻节点已经处理完,转3;否则转4
很明显,BFS必须遍历所有的节点之后才能够找到最优的路径,并且BFS只能工作在等权图上。
3、Dijkstra 算法
我们知道BFS是工作在等权图上,但是这种图真的是很少见。Dijkstra算法算是对BFS算法的一种改进,虽然Dijkstra算法的发表比BFS还早了两年,1959。
Dijkstra是工作在有权图上的一种最短路径算法。Dijkstra算法把所有的节点分成了三类:扩展过的、正在扩展的、未扩展的。
Dijkstra算法的步骤描述如下:
- 设置 C 和 O 为空集,设置起点 x s t a r t x_{start} xstart的predecessor 为null
- 将 x s t a r t x_{start} xstart