Знаходження k найкоротших шляхів з алгоритмом Еппштейна


16

Я намагаюся з'ясувати, як працює Графік шляху згідно алгоритму Еппштейна в цій статті і як я можу реконструювати k найкоротші шляхи від s до t відповідною конструкцією купи H ( G ) .P(G)kstH(G)

Так далеко:

містить всі ребразалишаючи вершину V в графі G , які не є частиною найкоротшого шляху в G . Їх впорядковано "пустотою часу" під назвою δ ( e ) при використанні цього краю замість того, що знаходиться на найкоротших шляхах. Застосовуючи Дейкстру, я знаходжу найкоротші шляхи до кожної вершини від t .out(v)vGGδ(e)t

Я можу обчислити це, взявши довжину ребра + (значення вершини голови (куди спрямований край спрямований) - значення верхівки хвоста (де починається спрямований край). Якщо це це не на найкоротшому шляху, якщо він = 0 - на найкоротшому шляху.>0=0

Тепер я будую 2-Min-Heap шляхом нагрівання набору ребер o u t ( v ) відповідно до їх δ ( e ) для будь-якого v V , де корінь o u t r o o t ( v ) має лише одну дитину (= піддерево).Hout(v)out(v)δ(e)vVoutroot(v)

Для побудови я вставляю o u t r o o t ( v ) в H T ( n e x t T ( v ) ), починаючи з кінцевої вершини t . Кожен раз, коли вершину якимось чином торкається під час вставки, вона позначається символом .HT(v)outroot(v)HT(nextT(v))t

Тепер я можу побудувати , вставивши решту H o u t ( w ) у H T ( v ) . Кожна вершина в H G ( v ) містить або 2 дітей з H T ( v ) і 1 від H o u t ( w ), або 0 з першої і 2 з другої, і це 3-х купи.HG(v)Hout(w)HT(v)HG(v)2HT(v)1Hout(w)02

За допомогою я можу створити DAG під назвою D ( G ), що містить вершину для кожної -позначеної вершини від H T ( v ) і для кожної некореневої вершини з H o u t ( v ) .HG(v)D(G)HT(v)Hout(v)

Коріння в D ( G ) називаються h ( v ), і вони з'єднуються з вершинами, до яких належать згідно з o u t ( v ) , "картографуванням".HG(v)D(G)h(v)out(v)

Все йде нормально.

У статті йдеться про те, що я можу створити , вставивши корінь r = r ( s ) і з'єднавши його з h ( s ) первинним ребром з δ ( 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)відповідні ребра в створюються і зважуються δ ( v ) - δ ( u ) . Їх називають кучами краї. Тоді для кожної вершини v P ( G ) , яка представляє ребро не у найкоротшому шляху, що з'єднує пару вершин u і w , створюються "поперечні ребра" від v до h ( w ) в P ( G ), що мають довжину δ ( год ( шP(G)δ(v)δ(u)vP(G)uwvh(w)P(G) . Кожна вершина в P ( G ) має лише ступінь виходу 4 макс.δ(h(w))P(G)4

шляху «секпочинаючи з т повинні бути взаємно-однозначна відповідність між довжиною S - т -paths в G .P(G)rstG

Врешті-решт будується нова купа, замовлена ​​4-Heap . Кожна вершина відповідає шляху в P ( G ), укоріненому на r . Батько будь-якої вершини має один менший край. Вага вершини - це довжина відповідного шляху.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 ?
Раду ГРИГо

Відповіді:


25

З давніх пір я написав це, що моя інтерпретація того, що там, напевно, не набагато більш обізнана, ніж будь-який інший читач. Тим не менш:

Я вважаю, що опис, який ви шукаєте, є останнім абзацом доказу леми 5. В основному, деякі ребра в P (G) ("поперечні ребра") відповідають бічній смузі G (тобто ребрам, які розходяться з дерева найкоротшого шляху). Шлях у G утворюється шляхом дотримування найкоротшого дерева шляху до початкової вершини першого бокового кону, слідом за самим краєм бічної коси, слідуючи за найкоротшим деревом шляху знову до початкової вершини наступного бічного колу тощо.


1
Як зауваження, цей алгоритм, здається, нещодавно переважав. З деталями можна ознайомитись тут
Карлос Лінарес Лопес

Девіде, мені дуже потрібна реалізація вашого алгоритму, найкраще на Java. Чи можете ви вказати мені, де я можу його знайти?
Тіна J

1
Я знаю про реалізації, пов’язані з нижньої частини ics.uci.edu/~eppstein/pubs/p-kpath.html - але останнім часом я ще не перевіряв їхні сайти, тому можуть виникнути певні зворотні посилання.
Девід Еппштейн

Спасибі. Але що ще важливіше, чи є у вас десь доступний повний псевдо-код вашого алгоритму?
Тіна J

@DavidEppstein Щось схоже на те, що у Dijkstra у Вікіпедії: en.wikipedia.org/wiki/K_shortest_path_routing
Тіна J

4

Псевдокод алгоритму Еппштейна (та ледача версія його авторів) наведений у: В.М. Хіменес, А.Марцал, лінива версія алгоритму найкоротших шляхів Еппштейна, у: ІІ Міжнародному семінарі з експериментальних та ефективних алгоритмів (WEA '03), в: Конспекти лекцій з інформатики, т. 2647, Спрингер, 2003, с. 179–190. https://pdfs.semanticscholar.org/3a31/5a14a2fc773d2d800186121905016de31705.pdf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.