[MIT6.006] 18. Speeding up Dijkstra 加速Dijkstra算法

在之前的课我们讲过了Dijkstra算法,先回顾下,如下图:

那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)目标方向搜索(Goal-Directed Search)

一、 双向搜索(Bi-Directional Search)

在正式介绍双向搜索方式前,需要介绍下一个它的双向概念是什么样的,如下图所示:

总结来说就是forward和backward方向上分别定义各自的图变量(例:当前最小路径权重和df, db 当前点的predecessor∏f, ∏b, 当前点的优先队列Qf, Qb)。

那么,现在有两个问题:

(1)双向搜索的中止条件是什么

答:在前向和后向搜索时,点被处理(即从各自优先队列中删去)。

(2)怎么找到点s到t的最短路径

答:如果点w都第一次在优先队列Qf, Qb中被处理掉,那么在前向图上,找到点s到w的最短路径在后向图上,找到t到w的最短路径。之后将它们相加即可得到图(不含负权重)的最短路径。但这个会有个问题:w有可能不在最短路径上。我们来看个例子,就能很好的理解这个问题是为什么了,请见下图:

所以,我们能发现如果单纯按上面方法找最短路径,最后可能找到的会是最短长度路径,而非最短权重路径。该问题的解决方法很简单,如下图所示,就是找到一个x点,它是df(x) + db(x)的最小值即可。

二、目标方向搜索(Goal-Directed Search)

假设我们有个图,点s到v1的权重是5,点s到v2的权重也是5,那么有没有什么办法能让我们知道哪条路径是最小路径的可能性会大些?答:有。只要根据下图所示的函数重新修改edge上的权重,我们就能更方便的找到最小路径的方向了。

猜你喜欢

转载自www.cnblogs.com/alvinai/p/12766543.html