Чи існує оптимальний алгоритм пошуку найдовшого найкоротшого шляху в мережі?


13

У мене великий набір лінійних мереж, і я хотів би знайти два кінці кожної мережі, які є найбільш віддаленими один від одного вздовж мережі (на зображенні нижче це було б D до K). Вирішення цієї проблеми грубою силою - обчислити найкоротший шлях по мережі для кожної пари походження, але у мене сотні мереж з тисячами кінців, тому обчислення кожного можливого шляху є досить важким.

Чи існує оптимальний спосіб обчислити це без використання грубої сили? Чи можу я виключити деякі пункти на основі деяких розумних правил?

Як ефективно знайти червоний шлях?

EDIT: Я додав ілюстрацію найдовшого шляху, про який згадував @Alex Tereshenkov, щоб уточнити моє запитання. Чорний шлях є результатом алгоритму найдовшого шляху (найдовший шлях без повторення вершин). У моєму випадку уявіть, що ви входите в мережу з будь-якого з літер і вам потрібно якнайшвидше переїхати на інший лист. Які дві букви найскладніше з'єднати? введіть тут опис зображення


божевільна фарба skillz!
Адам

Відповіді:


6

Я думаю, ви можете шукати діаметр діаграм вашої мережі. Є кілька питань щодо stackexchange, які згадують цю тему, наприклад:

Більшість алгоритмів пропонують спершу обчислити "найменші короткі шляхи" та вибрати найдовший із них, але я знайшов повідомлення в блозі Кушика Нараянана, який пропонує альтернативний підхід, який може бути більш оптимальним (я не перевіряв), який повторюється над кожною вершиною і знаходить її найвіддаленішу пару:

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


дякую, діаметр графіка був саме тим, що я шукаю, а псевдодіаметр євристичний у моєму випадку. Я щойно там навчився нових слів!
radouxju

7

Згідно зі сторінкою Вікіпедії Найдовша проблема шляху , ця проблема

... є важким NP, що означає, що його не можна вирішити в поліноміальний час для довільних графіків, якщо P = NP. Відомі також більш сильні результати твердості, що показують, що їх важко наблизити. Однак він має лінійне часове рішення для спрямованих ациклічних графіків, яке має важливе застосування у пошуку критичного шляху в задачах планування.

Якщо ви працюєте з (або можете представити ваш графік як DAG ), networkxпакет Python дозволить вам його обчислити. Шукайте функцію dag_longest_path.

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


дякує за відповідь, вже + 1 через інформацію. Однак я шукаю найдовший КРАСНИЙ ШЛЯХ в мережі (на моєму прикладі, жодного об’їзду до B чи H). Тому ваше рішення не є саме тим, що я шукаю, навіть якщо воно натякає на те, що "груба сила" - це, мабуть, єдине рішення.
radouxju

@radouxju, ах я бачу. Що ж, давайте подивимось, чи помітить це ген , у нього багато досвіду роботи з графіками, можливо, у нього є якісь яскраві ідеї.
Олексій Терешенков
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.