Ефективна вибірка найкоротших - шляхів рівномірно та незалежно навмання


14

Нехай граф, і нехай і т дві вершини G . Чи можемо ми ефективно вибирати найкоротший шлях s - t рівномірно та незалежно навмання з набору всіх найкоротших шляхів між s та t ? Для простоти можна припустити, що G простий, непрямий і невагомий.G s t G s t s t GGstGststG

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

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


Добре запитання Юхо. Розглядаючи відповідь, що ви точно розумієте під "вибірковою вибіркою випадкового шляху рівномірно"? Якщо для s і t достатньо підібрати випадковим чином, питання тривіальне, тому я гадаю, що ви маєте на увазі, що всі вузли на найкоротшому шляху з'являються з частотою (тобто ймовірністю), яка слідує за рівномірним розподілом. Або є якесь інше визначення? Зокрема, для двосторонніх графіків ваше питання здається дуже простим, чи не так?
Карлос Лінарес Лопес

1
@ CarlosLinaresLópez Поміркуйте, скажіть, діамантовий графік , і скажіть, що s праворуч від "вертикального краю", а t - з лівого боку. Зараз є 2 найкоротших шляху між s та t . Алгоритм повинен повернути з однаковою ймовірністю будь-який з цих двох шляхів. Отже, s і t не "підбираються випадковим чином", але вони задаються як вхідні дані. Це дає зрозуміти? У цьому сенсі я не впевнений, чи справді проблема двосторонніх графіків проста. ststst
Juho

1
@ CarlosLinaresLópez Іншими словами, нам дають графік G і дві вершини s , t V ( G ) . Нехай S - сукупність усіх найкоротших шляхів між s і t . Виведіть елемент S рівномірно випадково. Gs,tV(G)SstS
Juho

Відповіді:


6

Я не на 100% впевнений, що ця відповідь правильна, але ось що:

Я думаю, ви можете звести це до рівномірно випадкових будь-яких шляхів, починаючи з s - t , у DAG з єдиним джерелом та однією раковиною.st

Дано графік GG

  1. Створіть новий порожній орграф, H .H
  2. По- перше: запустити BFS частина найкоротшого шляху Дейкстри, починаючи з х , позначити всі вузли з їх найкоротшим відстанню-from- сек .ss
  3. Нехай d ( s , v ) - мінімальна відстань від s - v ; що ми знаємо з кроку BFS алгоритму найкоротшого шляху Діжкстри.d(s,v)sv
  4. Потім виконайте наступний крок алгоритму найкоротшого шляху Діжкстри, отримайте найкоротший шлях, збережіть його в p (рухаючись назад від t до s ).pts
  5. Тепер почніть наступний цикл; розширення в коментарях та нижче:
    • q 0 = { t }q0={t}
    • Тоді як q 0q0
      • q 1 = q1=
      • Для u q 0uq0
        • Тож ми хочемо знайти всі можливі наступні вузли для цього найкоротшого підпутника від t - utu
        • Для всіх ребер ( u , v ) G таких, що d ( s , v ) < d ( s , u )edge(u,v)Gd(s,v)<d(s,u)
          • v - сусідній вузол, менший d ( s , ) (буде на 1 менше)vd(s,)1
          • Тому t - u - v можливий підпункт по найкоротшому шляху.tuv
          • Поставте v H , di-edge ( u , v ) HvH,di-edge(u,v)H
          • Тепер нам потрібно перевірити наступні черги v з меншими сусідами.v
          • Покладіть v q 1vq1
      • Встановіть q 0 до q 1 : q0q1
        • q 0q 1q0q1

За суті, я збирати всі можливі вузли , які можуть бути використані в найкоротшому шляху, і розміщення їх в H .H

Детальніше про те, як це працює:

Алгоритм найкоротшого шляху Діжкстри працює, спершу запустивши BFS і позначивши всі вузли v G своїми найкоротшими шляхами від s - v . Наступним кроком є ​​повернення з t - s та слідування найменш сусідніх вузлів назад.vGsvts

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

Тепер ви швидко задумаєтесь, але е, чому їх перерахувати експоненціально, а мій шлях - ні?

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

Тепер у нас є DAG, який ми можемо пройти будь-яким способом від t - s і отримати найкоротший зворотний шлях від s - t . Графік повинен мати t як єдине джерело, а s - як єдину раковину.tsstts


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

Надайте кожному вузлу в DAG вагу вузла; вага вузла буде кількістю шляхів від цього вузла до s . Назвемо це w ( v ) .sw(v)

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

Отримавши вагу вузла, ми можемо рівномірно вибрати шлях шляхом:

  • Макет DAG як структура рівня (для візуалізації)
  • На кожному рівні вибирайте довільне впорядкування між вузлами, тобто. поняття «зліва направо».
  • Перехід DAG: на кожному кроці i , i [ 1 , | р | ] (де || означає розмір, у цьому випадку довжину найкоротшого шляху): ii[1,|p|]||
    • Нехай u я - поточний вузол (починаючи з t )uit
    • Складіть всі ваги дітей u i , використовуючи RNG, виберіть один дочірній вузол, v i , рівномірно між зваженими дітьми.uivi
    • Встановіть u i + 1 = v i і перейдіть до наступного крокуui+1=vi

Рівень-структура та поняття зліва направо були частиною моєї первісної спроби просто генерувати r [ 0 , w ( t ) ) і вибрати шлях таким шляхом, але я цього не зрозумів, так ви можете сміливо їх ігнорувати. r[0,w(t))
Realz Slaw

1
Ця відповідь виглядає чудово! Я люблю ідеї! Я спробував написати це дещо по-іншому (у своїй відповіді), як перевірку мого розуміння. У будь-якому випадку, я просто хотів поділитися вдячністю за цю прекрасну відповідь!
DW

5

Ось рішення, що базується на ідеях у відповіді Реалза Слау. В основному це повторне викладення його ідей, які можуть бути зрозумілішими або легшими слідувати. План полягає в тому, що ми будемо діяти у два етапи:

  1. По- перше, ми будемо будувати граф S з наступним властивістю: будь-який шлях від S до т в S являє собою найкоротший шлях від S до т в G , і кожен найкоротший шлях від S до т в G також присутній в S . Таким чином, S містить саме найкоротші шляхи в G : всі найкоротші шляхи, і більше нічого. Як це відбувається, S буде DAG.SstSstGstGSSGS

  2. Далі, ми будемо пробувати рівномірно випадковим чином з усіх шляхів від х до т в S .stS

Цей підхід узагальнює довільно спрямований графік G до тих пір, поки всі ребра мають позитивну вагу, тому я поясню свій алгоритм у цих термінах. Нехай w ( u , v ) позначає вагу на межі u v . (Це узагальнює задане, яке ви подали. Якщо у вас незважений графік, просто припустіть, що кожен край має вагу 1. Якщо у вас є ненаправлений графік, розглядайте кожен непрямий край ( u , v ) як два спрямовані ребра u v і v у .)Gw(u,v)uv(u,v)uvvu


Крок 1: екстракт S . S Запустіть алгоритм найкоротших шляхів з одним джерелом (наприклад, алгоритм Дейкстри) на G , починаючи з джерела s . Для кожної вершини v в G нехай d ( s , v ) позначає відстань від s до v .GsvGd(s,v)sv

Тепер визначте графік S таким чином. Він складається з кожного ребра u v таким, що (1) u v - це край у G , а (2) d ( s , v ) = d ( s , u ) + w ( u , v ) .SuvuvGd(s,v)=d(s,u)+w(u,v)

Графік S має деякі зручні властивості:S

  • Кожен найкоротший шлях від s до t у G існує як шлях у S : найкоротший шлях s = v 0 , v 1 , v 2 , , v k = t у G має властивість d ( s , v i + 1 ) = d ( s , v i ) + w ( v i , v istGSs=v0,v1,v2,,vk=tG+ 1 ), такребро v я v я + 1 присутня вS.d(s,vi+1)=d(s,vi)+w(vi,vi+1)vivi+1S

  • Кожен шлях в S з S до т є найкоротшим в G . Зокрема, розглянемо будь-який шлях у S від s до t , скажімо, s = v 0 , v 1 , v 2 , , v k = t . Його довжина визначається сумою ваг його ребер, а саме k i = 1 w ( v i - 1 , v i )SstGSsts=v0,v1,v2,,vk=tki=1w(vi1,vi), але за визначенням S ця сума дорівнює k i = 1 ( d ( s , v i ) - d ( s , v i - 1 ) , що телескопи до d ( s , t ) - d ( s , s ) = d ( s , t ) . Тому цей шлях - найкоротший шлях від s до t в GSki=1(d(s,vi)d(s,vi1)d(s,t)d(s,s)=d(s,t)stG.

  • Нарешті, відсутність ребер з нульовою вагою в G означає, що S - даг.GS

Крок 2: вибірка випадкового шляху. Тепер ми можемо викинути ваги по краях в S , і зразок випадкового шляху від ї до т в S .SstS

To help with this, we will do a precomputation to compute n(v)n(v) for each vertex vv in SS, where n(v)n(v) counts the number of distinct paths from vv to tt. This precomputation can be done in linear time by scanning the vertices of SS in topologically sorted order, using the following recurrence relation:

n(v)=wsucc(v)n(w)

n(v)=wsucc(v)n(w)

where succ(v) denotes the successors of v, i.e., succ(v)={w:vw is an edge in S}, and where we have the base case n(t)=1.

Next, we use the n() annotation to sample a random path. We first visit node s. Then, we randomly choose one of the successors of s, with successor w weighted by n(w). In other words:

choosesuccessor(v):
    n = 0
    for each w in succ(w):
        n = n + n(w)
    r = a random integer between 0 and n-1
    n = 0
    for each w in succ(w):
        n = n + n(w)
        if r < n:
            return w

To choose a random path, we repeatedly iterate this process: i.e., v0=s, and vi+1= choosesuccessor(vi). The resulting path is the desired path, and it will be sampled uniformly at random from all shortest paths from s to t.

Hopefully this helps you understand Realz Slaw's solution more easily. All credit to Realz Slaw for the beautiful and clean solution to this problem!


The one case this doesn't handle is the case where some edges have weight 0 or negative weight. However, the problem is potentially not well-defined in that case, as you can have infinitely many shortest paths.


Glad you took the time to fully get my answer; I wasn't sure it is correct. Now I am vindicated :D.
Realz Slaw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.