Trovare k Percorsi più brevi con l'algoritmo di Eppstein


16

Sto cercando di capire come funziona il grafico del percorso secondo l'algoritmo di Eppstein in questo documento e come posso ricostruire i k percorsi più brevi da s a t con la corrispondente costruzione di heap H ( G ) .P(G)kstH(G)

Finora:

contiene tutti i bordi lasciando un vertice v in un grafo G che non fanno parte di un cammino minimo in G . Sono ordinati in base allo "spreco di tempo" chiamato δ ( e ) quando si utilizza questo bordo anziché quello su percorsi più brevi. Applicando Dijkstra trovo i percorsi più brevi per ogni vertice da t .out(v)vGGδ(e)t

Posso calcolarlo prendendo la lunghezza del bordo + (il valore del vertice della testa (dove punta il bordo diretto) - il valore del vertice della coda (dove inizia il bordo diretto). Se questo è esso non è su un percorso più breve, se è = 0 è su un percorso più breve.>0=0

Ora a costruire un 2-Min-Heap dal heapifying l'insieme dei bordi o u t ( v ) in base alla loro δ ( e ) per ogni v V , dove la radice o u t r o o t ( v ) ha un solo figlio (= sottostruttura).Hout(v)out(v)δ(e)vVoutroot(v)

Per costruire I inserto o u t r o o t ( v ) in H T ( n e x t T ( v ) ) che inizia in corrispondenza del vertice terminale t . Ogni volta che un vertice viene in qualche modo toccato durante l'inserimento è contrassegnato da un .HT(v)outroot(v)HT(nextT(v))t

Ora posso costruire inserendo il resto H o u t ( w ) in H T ( v ) . Ogni vertice in H G ( v ) contiene sia 2 bambini da H T ( v ) e 1 da H o u t ( w ) o 0 dal primo e 2 dal secondo ed è un 3-mucchio.HG(v)Hout(w)HT(v)HG(v)2HT(v)1Hout(w)02

Con che può costruire un DAG denominato D ( G ) contenente un vertice per ogni * vertice segnata con da H T ( v ) e per ogni vertice non radice da H o u t ( v ) .HG(v)D(G)HT(v)Hout(v)

Le radici di in D ( G ) sono chiamate h ( v ) e sono collegate ai vertici a cui appartengono secondo o u t ( v ) da una "mappatura".HG(v)D(G)h(v)out(v)

Fin qui tutto bene.

Il documento dice che posso costruire inserendo una radice r = r ( s ) e collegandola a h ( s ) da un bordo iniziale con δ ( h ( s ) ) . I vertici di D ( G ) sono gli stessi in P ( G ) ma non sono ponderati. I bordi hanno lunghezze. Quindi per ogni fronte diretto ( u , v ) D ( G )P(G)r=r(s)h(s)δ(h(s))D(G)P(G)(u,v)D(G)i bordi corrispondenti in vengono creati e ponderati da δ ( v ) - δ ( u ) . Si chiamano Heap Edges. Poi per ogni vertice v P ( G ) , che rappresenta un vantaggio non in un percorso più breve che collega una coppia di vertici u e w , "bordi trasversali" sono creati da v a h ( w ) a P ( G ) avente una lunghezza δ ( h ( wP(G)δ(v)δ(u)vP(G)uwvh(w)P(G) . Ogni vertice in P ( G ) ha solo un grado uscente di 4 max.δ(h(w))P(G)4

's percorsi partire da r dovrebbero essere una lunghezza corrispondenza uno-a-uno tra s - t -paths in G .P(G)rstG

Alla fine viene costruito un nuovo heap ordinato 4-Heap . Ogni vertice corrisponde a un percorso in P ( G ) radicato in r . Il genitore di qualsiasi vertice ha un margine in meno. Il peso di un vertice è la lunghezza del percorso corrispondente.H(G)P(G)r

Per trovare i percorsi più brevi uso BFS in P ( G ) e "traduco" il risultato della ricerca in percorsi usando H ( G ) .kP(G)H(G)

Sfortunatamente, non capisco come posso "leggere" e poi "tradurlo" attraverso H ( G ) per ricevere i k percorsi più brevi.P(G)H(G)k


6
Hai controllato le varie implementazioni su ics.uci.edu/~eppstein/pubs/p-kpath.html ?
Radu GRIGore,

Risposte:


25

È passato abbastanza tempo da quando l'ho scritto, che ormai la mia interpretazione di quello che c'è dentro probabilmente non è molto più informata di qualsiasi altro lettore. Tuttavia:

Credo che la descrizione che stai cercando sia l'ultimo paragrafo della dimostrazione di Lemma 5. Fondamentalmente, alcuni dei bordi in P (G) (i "bordi trasversali") corrispondono ai binari laterali in G (cioè bordi che divergere dall'albero del percorso più breve). Il percorso in G si forma seguendo la struttura del percorso più breve verso il vertice iniziale della prima traccia laterale, seguendo lo stesso bordo laterale, seguendo di nuovo la struttura del percorso più breve fino al vertice iniziale della traccia laterale successiva, ecc.


1
Come nota a margine, questo algoritmo sembra essere stato recentemente sovraperformato. I dettagli sono disponibili qui
Carlos Linares López,

David, ho davvero bisogno di un'implementazione del tuo algoritmo, il migliore in Java. Puoi indicarmi dove posso trovarne uno?
Tina J,

1
Le implementazioni che conosco sono collegate dal fondo di ics.uci.edu/~eppstein/pubs/p-kpath.html - ma di recente non ho verificato quelle fuori sede, quindi potrebbero esserci dei deadlink.
David Eppstein,

Grazie. Ma soprattutto, hai un pseudo-codice completo del tuo algoritmo disponibile da qualche parte?
Tina J,

@DavidEppstein Qualcosa di simile a quello di Dijkstra su Wikipedia: en.wikipedia.org/wiki/K_shortest_path_routing
Tina J

4

Gli pseudocodici per l'algoritmo di Eppstein (e la versione pigra degli autori) sono riportati in: VM Jiménez, A. Marzal, Una versione pigra dell'algoritmo dei percorsi più brevi di Eppstein, in: 2 ° Workshop internazionale su algoritmi sperimentali ed efficienti (WEA '03), in: Appunti di lezione in Informatica, vol. 2647, Springer, 2003, pagg. 179-190. https://pdfs.semanticscholar.org/3a31/5a14a2fc773d2d800186121905016de31705.pdf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.