En kısa


14

Let bir grafiktir olabilir ve izin s ve t , iki köşe olması , G . S ve t arasındaki tüm en kısa yollar kümesinden en kısa s - t yolunu rastgele ve bağımsız olarak etkin bir şekilde örnekleyebilir miyiz ? Basitlik için, G'nin basit, yönlendirilmemiş ve ağırlıksız olduğunu varsayabiliriz .GstGststG

Birçok kısıtlanmış grafikte bile, ve t arasındaki en kısa yolların sayısı G boyutunda üssel olabilir . Bu nedenle, doğal olarak en kısa s - t yollarının tümünü hesaplamaktan kaçınmak isteriz . Genel durum hakkında bir fikrim yok, ama bana öyle geliyor ki bazı özel grafik sınıfları için bunu başarabiliriz.stGst

Bu, birinin daha önce düşünmesi gereken bir şey gibi geliyor. Bu konuda mevcut herhangi bir araştırma var mı, yoksa genel grafikler için bile bunu yapmak basit mi?


Güzel soru Juho. Bir yanıtı düşünürken, "st yolu rastgele rastgele örnekleyerek" tam olarak ne anlıyorsunuz? Eğer s ve t'nin rastgele toplanması yeterliyse soru önemsizdir, bu yüzden en kısa yoldaki tüm düğümlerin tekdüze bir dağılımı takip eden bir frekansla (yani olasılık) göründüğünü kastediyorum. Yoksa başka bir tanım var mı? Özellikle, iki taraflı grafikler için sorunuz çok kolay görünüyor, değil mi?
Carlos Linares López

1
@ CarlosLinaresLópez Elmas grafiği düşünün ve "dikey kenar" ın sağ tarafında ve t sol tarafta olduğunu söyleyin . Şimdi s ve t arasında 2 kısa yol var . Algoritma, bu iki yoldan biriyle eşit olasılıkla dönmelidir. Yani s ve t "rastgele toplanmaz", ancak girdi olarak verilir. Bu anlaşılır mı? Bu anlamda, sorunun iki taraflı grafikler için gerçekten kolay olup olmadığından emin değilim. ststst
Juho

1
@ CarlosLinaresLópez Başka bir deyişle, bir grafiği ve iki köşe s , t V ( G ) verilir . S , s ve t arasındaki tüm en kısa yolların kümesi olsun . S elemanını rastgele düzgün bir şekilde çıktılar. Gs,tV(G)SstS
Juho

Yanıtlar:


6

Bu cevabın doğru olduğundan% 100 emin değilim, ama işte gidiyor:

Ben eşit olarak rasgele herhangi bir-yolları, bu azaltabilir düşünmek , tek bir kaynaktan ve tek bir lavabo DAG.st

Bir grafik G

  1. Yeni bir boş digraph, Make .H
  2. Birincisi: başlayarak Dijkstra'nın en kısa-yolunun BFS bölümünü çalıştırmak onların kısa mesafeli-dan-tüm düğümleri işaretlemek, s .ss
  3. Let arasındaki mesafe en az olmak s - v ; Dijkstra'nın en kısa yol algoritmasının BFS adımından biliyoruz.d(s,v)sv
  4. Daha sonra, en kısa yolu elde, Dijkstra en kısa yol algoritması sonraki adım saklayın (geriye doğru giderek ton için s ).pts
  5. Şimdi aşağıdaki döngüyü başlatın; yorumlarda ve aşağıda genişleme:
    • q0={t}
    • Süre q0
      • q1=
      • İçin uq0
        • Bu yüzden t - u ' dan bu en kısa-alt yol için tüm olası sonraki düğümleri bulmak istiyoruztu
        • Tüm için d ( s , v ) < d ( s , u )edge(u,v)Gd(s,v)<d(s,u)
          • , daha az d ( s , ) olan komşu bir düğümdür( 1 daha azolacaktır)vd(s,)1
          • Bu nedenle, en kısa yoldaki alt yol olabilir.tuv
          • Koyun vH,di-edge(u,v)H
          • Şimdi bir sonraki turda küçük komşularını kontrol etmeliyiz .v
          • Koyun vq1
      • ila q 1'i ayarlayın : q0q1
        • q0q1

Esasen, en kısa yolda kullanılabilecek tüm olası düğümleri topluyorum ve bunları yerleştiriyorum .H

Bunun nasıl çalıştığı hakkında daha fazla bilgi:

Dijkstra'nın en kısa yol algoritması önce bir BFS çalıştırarak ve tüm düğümleri işaretleyerek çalışır s - v'den en kısa yollarıyla. Bir sonraki adım, t - s'den geri gitmekve en az komşu düğümleri geri takip etmektir.vGsvts

Mesele şu ki, burada en az komşu düğümlerden herhangi birini seçebilirsiniz . Burada ne toplamak olduğunu tüm en küçük komşu düğümler ben hesap araçlarının her adım, tüm kısa-yolları.

Şimdi hızlı bir şekilde düşünüyorsunuz, ama hey, neden onları üstel sayıyorlar, ama benim yolum değil mi?

Cevap, aynı düğümleri iki kez eklemekten kaçınmak için bir set kullandığım için, olası her yol için bunu yeniden hesaplamaktan kaçınırım.

Şimdi t - s'den herhangi bir şekilde geçebileceğimiz bir DAG'ımız varts ve bir kısa-ters-yolu elde . Grafik tek kaynak olarak t ve tek lavabo olarak s olmalıdır .stts


Yukarıdakiler doğruysa, bunu bir adım daha ileri taşıyabilir ve sorunu aşağıdaki gibi çözebiliriz.

DAG'daki her düğüme bir düğüm ağırlığı verin; düğüm ağırlığı, o düğümden giden yolların sayısı olacaktır . Buna w ( v ) diyelim .sw(v)

Bunları hızlı bir şekilde hesaplayabilirsiniz, bkz . G'deki s'den t'ye kadar basit yol sayısını bulan Algoritma .

Düğüm ağırlığına sahip olduktan sonra, eşit olarak bir yol seçebiliriz:

  • DAG'ı bir seviye yapısı olarak düzenleyin (görselleştirme için)
  • Her seviyede, düğümler arasında rastgele bir sıralama seçin. "soldan sağa" kavramı.
  • DAG'da geçiş: Her adımda , i [ 1 , | p | ]ii[1,|p|] (burada boyutu, bu durumda en kısa yolun uzunluğu anlamına gelir): ||
    • İzin Vermek mevcut düğüm (başlangıç t )uit
    • Çocuklarının tüm ağırlıkları ekleyin ve bir RNG kullanarak, ağırlıklı çocuklar arasında eşit olarakbir çocuk düğümü, v i seçin.uivi
    • Set ve sonraki adıma geçinui+1=vi

Seviye yapısı ve soldan sağa kavramı basitçe üretmeye ve bu şekilde bir yol seçmeye yönelik ilk girişimimin bir parçasıydı , ama bunu anlamadım, bu yüzden onları güvenle görmezden gelebilirsiniz. r[0,w(t))
Realz Slaw

1
Bu cevap harika görünüyor! Fikirleri seviyorum! Anlayışımın bir testi olarak biraz farklı bir şekilde (cevabımda) yazmaya çalıştım. Her halükarda, bu güzel cevap için minnettarlığımı paylaşmak istedim!
DW

5

İşte Realz Slaw'ın cevabındaki fikirlere dayanan bir çözüm. Temel olarak, daha net veya takip edilmesi daha kolay olabilecek fikirlerinin yeniden ortaya konmasıdır. Plan, iki adımda ilerleyeceğimizdir:

  1. SstSstGstGSSGS bir DAG olacaktır.

  2. stS .

Gw(u,v)uv(u,v)uvvu .)


SGsvGd(s,v)sv

SuvuvGd(s,v)=d(s,u)+w(u,v)

S

  • stGSs=v0,v1,v2,,vk=tGd(s,vi+1)=d(s,vi)+w(vi,vi+1)vivi+1S

  • SstGSsts=v0,v1,v2,,vk=ti=1kw(vi1,vi) , fakat tanım itibariyleSi=1k(d(s,vi)d(s,vi1)d(s,t)d(s,s)=d(s,t)stG.

  • GS bir dag .

SstS

n(v)vSn(v)vtS

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

succ(v)vsucc(v)={w:vw is an edge in S}n(t)=1

n()sswn(w)

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

v0=svi+1= choosesuccessor(vi)st .

Umarım bu Realz Slaw'ın çözümünü daha kolay anlamanıza yardımcı olur. Bu soruna güzel ve temiz bir çözüm için Realz Slaw'a tüm kredi!


Bunun işlemediği tek durum, bazı kenarların 0 veya negatif ağırlığa sahip olduğu durumdur. Bununla birlikte, bu durumda potansiyel olarak iyi tanımlanmamıştır, çünkü sonsuz sayıda en kısa yolunuz olabilir.


Cevabımı tam olarak almak için zaman ayırdığınıza sevindim; Doğru olduğundan emin değildim. Şimdi haklıyım: D.
Realz Slaw
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.