Які k-кращі алгоритми з найкоротшим шляхом слід враховувати?


13

Я вирішую задачу оптимізації граф-пошуку. Мені потрібно знайти k кращих ациклічних найкоротших шляхів через спрямований зважений графік.

Я знаю, що існує ряд точних та приблизних k-кращих алгоритмів, але, здається, більшість останніх досліджень орієнтовані на дуже великі, дуже рідко пов'язані графіки (наприклад, маршрути доріг та напрямки), і мій графік не має жодного.

Визначні аспекти моєї проблеми:

  • Графік складається приблизно з 160 вершин.

  • Графік майже повністю пов'язаний (двосторонній, тому ~ 160 ^ 2 ~ = 25 кром)

  • k буде зовсім невеликим (можливо, менше 10)

  • Максимальна довжина шляху, ймовірно, буде обмежена і дуже мала (наприклад, 3-5 ребер)

  • Я говорив «ациклічно» вище, але просто ще раз - рішення не повинні включати цикли. Це не проблема для 1-кращого найкоротшого шляху, але це стає проблемою для k-best - наприклад, розгляньте дорогу маршруту - другий найкоротший шлях від A до B може бути таким же, як 1-кращий, з швидка поїздка кудись кварталом. Це може бути математично оптимальним, але не дуже корисним рішенням. ;-)

  • Можливо, нам буде потрібно повторно зважувати кромки під час кожного обчислення. Крайова вартість складається із зваженої суми кількох факторів, і остаточні вимоги (щоразу, коли ми їх отримуємо) можуть дозволити користувачеві визначити власну пріоритетність цих коефіцієнтів зважування, змінюючи ваги крайових. Це порівняно невеликий графік (ми повинні бути в змозі представити його в декількох сотнях КБ), тому, ймовірно, розумно клонувати графік в пам'яті, застосувати повторне зважування та виконати пошук на клонованому графіку. Але якщо є більш ефективний метод виконання пошуку під час обчислення ваг на ходу, мені цікаво.

Я розглядаю алгоритми, описані в Сантосі (алгоритми найкоротшого шляху K), Eppstein 1997 (Пошук k найкоротших шляхів) та інших. Алгоритм Йєна представляє інтерес насамперед через існуючу реалізацію Java . Мені не страшно читати наукові роботи, але я подумав, що варто викинути деталі моєї проблеми та попросити покажчиків заощадити трохи часу на читання.

А якщо у вас є вказівники на реалізацію Java, ще краще.


+1, тому що мені цікаві пропозиції людей, і це схоже на точний тип запитань, про який робився цей сайт.
KChaloux

Чи не означає ваш ациклічний стан, що будь-який інший шлях від початку до мети створив би цикл першим шляхом? І якщо і старт, і мета в сліпому алеї, кожен шлях повинен використовувати ці два краї.
user470365

Можливо, мені було не ясно. Ациклічне обмеження поширюється лише на один шлях - природно, будь-які 2 окремі траси від А до В утворюватимуть цикл.
AaronD

@AaronD: тож, ким ти користувався врешті-решт?
dagnelies

@arnaud: Я не впевнений, що я вже зупинився на алгоритмі; Я додам оновлення до цього питання, коли у мене з'явиться. Я усунув Eppstein, тому що він не гарантує ациклічних (відомих як «простих») рішень. Наразі я працюю з алгоритмом Йєна, але ще не доклав детального профілювання чи оптимізації, тому, можливо, мені доведеться замінити його на інший. Я оновлюсь у найближчі тиждень-два.
AaronD

Відповіді:


2

Щоб частково відповісти на моє власне питання:

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

Алгоритм Йєна і більшість інших, які я розглядав, залежать від серії найкращих пошуків; більшість використовують Dijkstra для цих проміжних пошуків. Dijkstra не підтримує негативні ваги, але ми можемо замінити Беллмана-Форда на його місце (принаймні, в Єні; імовірно, також у Лоулера або Еппштейна). Я розробив модифікацію Беллмана-Форда з обмеженням довжини шляху (в краях) і чіткої перевірки циклу під час пошуку (замість стандартного детектування циклу після пошуку). Комп'ютерна складність гірша, але все ж простежується для моїх вимог. Я відредагую цю відповідь і посилаюсь на технічний звіт, якщо отримаю дозвіл на його публікацію.


1

Я б сказав, що це питання може бути легко гугл, а також є дублікатом:

Як було сказано, я вже використовував і впроваджував Еппштейн і рекомендую його. Я вважав це досить елегантним. Якщо я пам'ятаю правильно, це може бути і оптимальним, і наступний документ пояснює це дуже добре:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf


По-перше, дякую за рекомендацію Еппштейна. Я там більше загляну. Я б заперечував, що це не точний дублікат, а також не просто в Google; легко знайти k-кращий алгоритм, але не так просто розумно вибрати між ними. Я думаю, що я хотів би мати зовсім інший алгоритм для малопов'язаного графа мільйонів вершин, ніж я для цієї проблеми. Мені б подбати набагато більше про складність в k, якби я хотів 1000-кращий замість 10-кращий. І хоча постійні фактори не так важливі при публікації робіт, вони, безумовно, є при виробництві коду виробництва.
AaronD

@AaronD: тільки для вашої інформації, я думаю, що алгоритм дуже ефективний у будь-якому випадку. Можливо, є особливі випадки, коли евристичний керований пошук перемагає це, але для загального випадку я думаю, що це дуже добре. Точна ефективність буде, ймовірно, більше залежати від того, наскільки точно ви її реалізуєте, ефективності вашої структури даних та наскільки вона підібрана до вашої проблеми.
dagnelies

@arnaud Привіт, чи можна поділитися реалізацією вашого епштейна? У мене є подібне запитання тут: math.stackexchange.com/questions/1661737/…
Tina J
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.