使用Eppstein算法找到k条最短路径


16

我试图找出如何路径图形P(G)在此根据Eppstein的算法作品,以及如何我可以重建k从最短路径st与相应的堆结构H(G)

至今:

out(v)包含离去一个顶点的所有边v中的曲线图G其不是在最短路径的一部分G。使用此边缘而不是最短路径上的边缘时,它们由称为的“时间浪费”按堆排序δ(e)。通过应用Dijkstra,我找到了从到每个顶点的最短路径t

我可以通过边的长度+(头顶点的值(有向边指向的位置)-尾点的值(有向边开始的位置)来计算,如果>0,则为不在最短路径上,如果=0,则在最短路径上。

现在我建立一个2最小堆Hout(v)由heapifying边集out(v)根据它们的δ(e)对于任何vV,其中,所述根outroot(v)只有一个孩子(=子树)。

为了构建 i插入ö ü - [R ö ø v ħ ŤÑ Ë X Ťv 在终端顶点开始。每次在插入时以某种方式触摸顶点时,都会用*标记。HT(v)outroot(v)HT(nextT(v))t

现在我可以建立通过插入的其余部分ħ Ò ù 瓦特ħ Ťv 。在每个顶点ħ ģv 包含任一2从儿童ħ Ťv 1ħ Ò ù 瓦特0由第一和2从第二和是3堆。HG(v)Hout(w)HT(v)HG(v)2HT(v)1Hout(w)02

借助我可以构建一个称为D G 的DAG,其中包含一个顶点,该顶点来自H Tv )的每个带*标记的顶点,以及每个来自H o u tv )的非根顶点。HG(v)D(G)HT(v)Hout(v)

的根d ģ 被称为ħ v 和它们连接到它们所属的顶点到根据ö û v 由一个“映射”。HG(v)D(G)h(v)out(v)

到目前为止,一切都很好。

纸说我可以建立通过插入根- [R = - [R 小号和该连接到ħ 小号由inital边缘与δ ħ 小号D G 的顶点在P G )中相同,但未加权。边缘有长度。然后,对于每个有向边Û v d ģ P(G)r=r(s)h(s)δ(h(s))D(G)P(G)(u,v)D(G)在相应的边缘创建和由加权δ v - δ Û 。它们称为堆边缘。然后,对于每个顶点v P g ^ ,其表示不能在最短路径连接一对顶点的边缘ü瓦特,“交叉边缘”是从创建vħ 瓦特P g ^ 具有长度δ h wP(G)δ(v)δ(u)vP(G)uwvh(w)P(G)P G )中的每个顶点的向外度最大为 4δ(h(w))P(G)4

假设从 r开始的 P G 路径是 G中s - t路径之间一一对应的长度。P(G)rstG

最后,将构建一个新的有序的4堆堆。每个顶点对应于以r R )为根的P G )中的路径。任何顶点的父级都少了一条边。顶点的权重是相应路径的长度。H(G)P(G)r

为了找到最短路径,我使用BFS到P G 并通过使用H G 将搜索结果“转换”为路径。kP(G)H(G)

不幸的是,我不了解如何“读取” 然后通过H G “翻译”它以接收k条最短路径。P(G)H(G)k


6
您是否在ics.uci.edu/~eppstein/pubs/p-kpath.html中检查了各种实现?
Radu GRIGore 2011年

Answers:


25

自从我写那本书以来已经足够长的时间了,到目前为止,我对其中内容的解释可能比其他任何读者都了解得多。不过:

我相信,您要查找的描述是引理5的证明的最后一段。基本上,P(G)中的某些边缘(“交叉边缘”)对应于G中的边线(即,与最短路径树分叉)。G中的路径是通过沿着最短路径树到达第一个侧轨的起始顶点,跟随侧轨边缘本身,再次遵循最短路径树到下一个侧轨的起始顶点等而形成的。


1
顺便提一下,该算法最近似乎表现不佳。可以在这里
卡洛斯·利纳雷斯·洛佩斯

大卫,我真的需要用Java最好的算法来实现您的算法。您能指出我在哪里可以找到一个人吗?
蒂娜·J

1
我知道的实现是从ics.uci.edu/~eppstein/pubs/p-kpath.html的底部链接的,但是我最近没有检查过异地的实现,因此可能存在一些死链接。
大卫·埃普斯坦

Thanks. But more importantly, do you have a complete pseudo-code of your algorithm available somewhere?
Tina J

@DavidEppstein Something similar to Dijkstra's one at Wikipedia: en.wikipedia.org/wiki/K_shortest_path_routing
Tina J

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.