Eppstein의 알고리즘으로 k 개의 최단 경로 찾기


16

백서 의 Eppstein 알고리즘에 따른 경로 그래프 P ( G )P(G) 의 작동 방식과 해당 힙 구성 H ( G )를 사용하여 s 에서 t 까지 k 개의 최단 경로를 재구성하는 방법을 알아 내려고 노력 중 입니다.kstH(G)

지금까지:

O U t ( V )out(v) 정점 떠나는 모든 모서리 포함 Vv 그래프에서 GG 의 최단 경로에 포함되지 않은 G를G . 이 경로는 가장 짧은 경로의 가장자리 대신이 가장자리를 사용할 때 δ ( e ) 라는 "시간 낭비"에 따라 힙 순서가 지정됩니다δ(e). Dijkstra를 적용하여 t 에서 모든 꼭지점까지의 최단 경로를 찾습니다t.

모서리의 길이 + (헤드 정점의 값 (직접 에지가 가리키는 위치)-꼬리 정점의 값 (직접 에지가 시작되는 위치)을 취하여이를 계산할 수 있습니다. > 0 인 경우) 최단 경로에 있지 않은 경우 = 0이면 최단 경로에 있습니다.>0=0

이제 2 최소 힙 구축 H O U t ( V ) 에지들의 집합을 heapifying 의해 O를 U t ( V ) 자신에있어서 δ ( E ) 임의의 용 V V 루트, O u는 t는 r에 O O t ( v ) 에는 하위 항목이 하나만 있습니다 (= 하위 트리).Hout(v)out(v)δ(e)vVoutroot(v)

H T ( v ) 를 만들기 위해 터미널 정점 t 에서 시작하는 H T ( n e x t T ( v ) )에 o u t r o o t ( v ) 를 삽입 합니다. 삽입하는 동안 정점을 만질 때마다 * 로 표시됩니다 .HT(v)outroot(v)HT(nextT(v))t

Now I can build HG(v)HG(v) by inserting the rest of Hout(w)Hout(w) in HT(v)HT(v). Every vertex in HG(v)HG(v) contains either 22 children from HT(v)HT(v) and 11 from Hout(w)Hout(w) or 00 from the first and 22 from the second and is a 3-heap.

With HG(v)HG(v) I can build a DAG called D(G)D(G) containing a vertex for each -marked vertex from HT(v)HT(v) and for each non-root vertex from Hout(v)Hout(v).

The roots of HG(v)HG(v) in D(G)D(G) are called h(v)h(v) and they are connected to the vertices they belong to according to out(v)out(v) by a "mapping".

So far, so good.

이 논문은 I 구축 수 있다고 P ( G를 ) 루트 삽입하여 R = R ( S )을 하고,이 연결 H ( S ) 과 함께 inital 가장자리 δ ( H ( S ) ) . D ( G ) 의 꼭짓점은 P ( G ) 에서 동일 하지만 가중치는 없습니다. 가장자리 길이가 있습니다. 그런 다음 각 방향 모서리 ( u , v ) D ( G )P(G)r=r(s)h(s)δ(h(s))D(G)P(G)(u,v)D(G) the corresponding edges in P(G)P(G) are created and weighted by δ(v)δ(u)δ(v)δ(u). They are called Heap Edges. Then for each vertex vP(G)vP(G), which represents an edge not in a shortest path connecting a pair of vertices uu and ww, "cross edges" are created from vv to h(w)h(w) in P(G)P(G) having a length δ(h(w))δ(h(w)). Every vertex in P(G)P(G) only has a out going degree of 44 max.

P(G)P(G)'s paths starting from rr are supposed to be a one-to-one length correspondence between ss-tt-paths in GG.

In the end a new heap ordered 4-Heap H(G)H(G) is build. Each vertex corresponds to a path in P(G)P(G) rooted at rr. The parent of any vertex has one fewer edge. The weight of a vertex is the lenght of the corresponding path.

To find the kk shortest paths I use BFS to P(G)P(G) and "translate" the search result to paths by using H(G)H(G).

Unfortunately, I don't understand how I can "read" P(G)P(G) and then "translate" it through H(G)H(G) to receive the kk shortest paths.


6
Did you check the various implementations at ics.uci.edu/~eppstein/pubs/p-kpath.html ?
Radu GRIGore

답변:


25

It's been long enough since I wrote that, that by now my interpretation of what's in there is probably not much more informed than any other reader's. Nevertheless:

I believe that the description you're looking for is the last paragraph of the proof of Lemma 5. Basically, some of the edges in P(G) (the "cross edges") correspond to sidetracks in G (that is, edges that diverge from the shortest path tree). The path in G is formed by following the shortest path tree to the starting vertex of the first sidetrack, following the sidetrack edge itself, following the shortest path tree again to the starting vertex of the next sidetrack, etc.


1
As a side note, this algorithm seems to have been recently outperformed. The details can be found here
Carlos Linares López

David, I really need an implementation of your algorithm, best in Java. Can you point me where I can find one?
Tina J

1
The implementations that I know about are linked from the bottom of ics.uci.edu/~eppstein/pubs/p-kpath.html — but I haven't checked the off-site ones recently so there may be some deadlinks.
David Eppstein

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.