数据结构课设题目——求第K短的最短路径

(1) 问题描述
最短路径问题是图论中的一个经典问题,主要研究成果有Dijkstra、Floyd等优秀算法,Dijkstra算法一直被认为是图论中的好算法。但这两个算法有一个共同的缺陷:这里的最短路径指两点之间最短的那一条路径, 不包括次短、再次短等等路径。实际上,在使用咨询系统或决策支持系统时,希望得到最优的决策参考外,还希望得到次优、再次优等决策参考。这同样反映在最短路径问题上,如一个交通咨询系统,除了希望得到最短路径以外,由于交通堵塞等问题,可能需要获知次短、第K短的最短路径。因此,有必要将最短路径问题予以扩充,能求出第K短最短路径。形式的表述就是想要在图中求出从起点到终点的前k短的路径(最短、第2短、第3短……第k短),并且需要这些路径都是无环的。
常见的较好的求解前k短无环路径的算法是Yen算法(以发明者名字命名的)。现在简要地描述一下Yen算法。设Pi为从起点s到终点t的第i短的无环路径。一开始是P1,也就是从s到t的最短路径,可以通过Dijkstra、Bellman-Ford或BFS等算法轻易地求出。接下来要依次求出P2,P3……Pk。可以将P1~Pi看成一棵树,称为Ti,它的根节点是s,所有叶节点都是t。例如假设s = 1,t = 5,求出的P1~P5为,P1:1->2->3->5;P2:1->3->2->5;P3:1->3->5;P4:1->4->5;P5:1->4->3->5。此时的T5就是如图6-65所示的一棵树。

定义devi为Pi的偏离点(deviation node),定义为在Ti上,Pi对应的那一分枝中,第1个(按从s到t的顺序)不在Ti - 1上的点(i > 1)。为描述的方便,设dev1为P1的第2个点。因此,在图1中,dev1~dev5的编号分别为2、3、5、4和3。显而易见,devi至少是Pi的第2个点。接下来是Yen算法的核心部分,即每当求出一个Pi时,都可以从Pi上发展出若干条候选路径。发展的方法是这样的,对于Pi上从devi的前一个点到t的前一个点这一段上的每个点v,都可以发展出一条候选路径。用Pi sv表示Pi上从s到v的子路径,用Pi vt表示从v到t的满足下列条件的最短路径:condition 1:设点v在Ti上对应的点为v',则Pi vt上从点v出发的那条边不能与Ti上从点v'出发的任何一条边相同。condition 2:Pi vt上,除了点v,其它点都不能出现在Pi sv上。如果找得出Pi vt,则把Pi sv和Pi vt连起来就组成了一条候选路径。其中condition 1保证了候选路径不与P1~Pi重复;condition 2保证了候选路径无环。

数据结构课设题目——求第K短的最短路径_第1张图片


以图6-65中的例子为基础,可以举一个发展候选路径的例子。在求出了P5之后,要在P5上发展候选路径。P5的偏离点是3号点。因此v的范围是{4, 3}。

当v = 4时,Pi sv = 1 -> 4,因此,根据condition 2,在Pi vt上不能出现1号点。找到P5上的4号点在T5上对应的那一点,也就是图6-中位于阴影3号点上面的4号点,在T5上从它出发的有(4, 5)和(4, 3)这两条边,因此,根据condition 1,在Pi vt上不能出现这两条边。假设在这样的情况下,求出了从4号点到t的最短路径为4 -> 2 -> 5,它就是Pi vt。此时发展出的候选路径就是1 -> 4 -> 2 -> 5。 

当v = 3时,Pi sv = 1 -> 4 -> 3,因此,根据condition 2,在Pi vt上不能出现1号点和4号点。找到P5上的3号点在T5上对应的那一点,也就是图6-66中阴影的3号点,在T5上从它出发的只有(3, 5)这一条边,因此,根据condition 1,在Pi vt上不能出现边(3, 5)。假设在这样的情况下,我们求出了从3号点到t的最短路径为3 -> 2 -> 5,它就是Pi vt。此时发展出的候选路径就是1 -> 4 -> 3 -> 2 -> 5。
数据结构课设题目——求第K短的最短路径_第2张图片

显而易见,在从Pi发展出的所有候选路径中,只有当v是devi的前一个点时,条件1才有可能阻挡掉2条或2条以上边。当v不是devi的前一个点时,条件1只会阻挡掉1条边,那就是本身位于Pi上,从v出发的那条边。不仅从Pi,从之前的P1~Pi - 1,我们都发展过若干条候选路径。从候选路径的集合中取出最短的一条,就是Pi + 1。把Pi + 1从候选路径的集合里删掉;然后再从它发展新的候选路径,添加到候选路径的集合里,如此循环,直到求出Pk为止。如果在求到Pk之前,候选路径的集合就空了,那么说明Pk不存在。
(2) 课程设计目的
学习、掌握、编程实现Yen算法,知道如何求解第K短最短路径。
(3) 基本要求
① 给定一个加权图,编程实现Yen算法,依次输出所有的无环最短路径。
② 候选路径集合用堆存储实现,方便快速选取最短的一条。
③ 分析Yen算法的时间复杂性。
(4) 实现提示
在Yen算法中会调用Dijkstra算法,图可用邻接矩阵表示。

你可能感兴趣的:(数据结构,编程,算法,存储,咨询,交通)