Ford – Fulkerson algoritması - Ford–Fulkerson algorithm

Ford-Fulkerson yöntemi veya Ford – Fulkerson algoritması (FFA) bir Açgözlü algoritma hesaplayan maksimum akış içinde akış ağı. Kalan bir grafikte artırma yollarını bulma yaklaşımı tam olarak belirtilmediğinden bazen "algoritma" yerine "yöntem" olarak adlandırılır.[1] veya farklı çalışma sürelerine sahip birkaç uygulamada belirtilir.[2] Tarafından 1956'da yayınlandı L. R. Ford Jr. ve D. R. Fulkerson.[3] "Ford – Fulkerson" adı da sıklıkla Edmonds-Karp algoritması Ford-Fulkerson yönteminin tam olarak tanımlanmış bir uygulamasıdır.

Algoritmanın arkasındaki fikir şu şekildedir: kaynaktan (başlangıç ​​düğümü) havuza (uç düğüm) giden bir yol olduğu sürece, yoldaki tüm kenarlarda kullanılabilir kapasite ile, yollardan biri boyunca akış göndeririz. Sonra başka bir yol buluruz ve bu böyle devam eder. Kullanılabilir kapasiteye sahip bir yol, artırma yolu.

Algoritma

İzin Vermek bir grafik olun ve her bir kenar için sen -e v, İzin Vermek kapasite ol ve akış ol. Kaynaktan maksimum akışı bulmak istiyoruz s lavaboya t. Algoritmadaki her adımdan sonra aşağıdakiler korunur:

Kapasite kısıtlamalarıBir kenar boyunca akış, kapasitesini aşamaz.
Çarpık simetriNet akış sen -e v net akışın tersi olmalıdır v -e sen (Örneğe bakın).
Akışın korunmasıBir düğüme giden net akış, akışı "üreten" kaynak ve akışı "tüketen" havuz dışında sıfırdır.
Değer (f)Ayrılan akış s gelen akışa eşit olmalıdır t.

Bu, ağdaki akışın bir yasal akış algoritmadaki her turdan sonra. Biz tanımlıyoruz artık ağ kapasitesi olan ağ olmak ve akış yok. Bir akışın olabileceğine dikkat edin v -e sen orijinal ağda izin verilmese de artık ağda izin verilir: eğer ve sonra .

Algoritma Ford-Fulkerson
Girişler Bir Ağ Verilen akış kapasitesi ile c, bir kaynak düğüm sve bir havuz düğümü t
Çıktı Bir akış hesaplayın f itibaren s -e t maksimum değer
  1. tüm kenarlar için
  2. Bir yol varken p itibaren s -e t içinde , öyle ki tüm kenarlar için :
    1. Bul
    2. Her kenar için
      1. (Yol boyunca akış gönder)
      2. (Akış daha sonra "iade edilebilir" olabilir)
  • "←", Görev. Örneğin, "en büyükeşya"değerinin en büyük değerindeki değişiklikler eşya.
  • "dönüş"algoritmayı sonlandırır ve aşağıdaki değeri verir.

2. adımdaki yol, örneğin a enine arama (BFS) veya a derinlik öncelikli arama içinde . Birincisini kullanırsanız, algoritmaya Edmonds-Karp.

2. adımda başka yol bulunamadığında, s ulaşamayacak t artık ağda. Eğer S erişilebilen düğümler kümesidir s kalan ağda, ardından orijinal kenar ağındaki toplam kapasite S geri kalanına V bir yandan bulduğumuz toplam akışa eşittir s -e tve diğer yandan bu tür tüm akışlar için bir üst sınır görevi görür. Bu, bulduğumuz akışın maksimum olduğunu kanıtlıyor. Ayrıca bakınız Maksimum akış Min-kesim teoremi.

Grafik birden çok kaynağa ve havuza sahipse, aşağıdaki gibi davranıyoruz: ve . Yeni bir kaynak ekleyin kenarlı itibaren her düğüme kapasite ile . Ve yeni bir lavabo ekle kenarlı her düğümden -e kapasite ile . Ardından Ford-Fulkerson algoritmasını uygulayın.

Ayrıca, bir düğüm sen kapasite kısıtlaması var bu düğümü iki düğümle değiştiriyoruz ve bir kenar kapasite ile . Ardından Ford-Fulkerson algoritmasını uygulayın.

Karmaşıklık

Akış artırma yolunu grafikte önceden oluşturulmuş akışa ekleyerek, grafikte daha fazla akış artırma yolu bulunamadığında maksimum akışa ulaşılacaktır. Bununla birlikte, bu duruma ulaşılacağına dair bir kesinlik yoktur, bu nedenle garanti edilebilecek en iyi şey, algoritma sona erdiğinde cevabın doğru olacağıdır. Algoritmanın sonsuza kadar çalışması durumunda, akış maksimum akışa yakınlaşmayabilir bile. Ancak bu durum sadece irrasyonel akış değerlerinde meydana gelir.[kaynak belirtilmeli ] Kapasiteler tam sayı olduğunda, Ford-Fulkerson'ın çalışma süresi şunlarla sınırlanır: (görmek büyük O notasyonu ), nerede grafikteki kenarların sayısıdır ve grafikteki maksimum akıştır. Bunun nedeni, her artırma yolunun şurada bulunabilmesidir: zamanı ve akışı en az bir tamsayı miktarı kadar artırır üst sınırla .

Ford-Fulkerson algoritmasının garantili sonlandırma ve maksimum akış değerinden bağımsız bir çalışma süresine sahip bir varyasyonu, Edmonds-Karp algoritması hangi koşuyor zaman.

İntegral örnek

Aşağıdaki örnek, 4 düğümlü bir akış ağında Ford-Fulkerson'ın ilk adımlarını göstermektedir, kaynak ve batmak . Bu örnek, algoritmanın en kötü durum davranışını göstermektedir. Her adımda sadece bir akış ağ üzerinden gönderilir. Bunun yerine genişlik-ilk-arama kullanılırsa, yalnızca iki adım gerekli olacaktır.

YolKapasiteOrtaya çıkan akış ağı
İlk akış ağıFord-Fulkerson örneği 0.svg
Ford-Fulkerson örneği 1.svg
Ford-Fulkerson örneği 2.svg
1998'den sonra daha fazla adım ...
Nihai akış ağıFord-Fulkerson örneği final.svg

Akışın nasıl "geri itildiğine" dikkat edin. -e yolu bulurken .

Sonlandırıcı olmayan örnek

Ford-Fulkerson forever.svg

Sağda gösterilen akış ağını düşünün. , lavabo , kenar kapasiteleri , ve sırasıyla , ve ve diğer tüm kenarların kapasitesi bir tamsayı . Sabit öyle seçildi ki . Aşağıdaki tabloya göre artırma yolları kullanıyoruz, burada , ve .

AdımArtırma yoluGönderilen akışArtık kapasiteler
0
1
2
3
4
5

Adım 1'den sonra ve adım 5'ten sonra, kenarların kalan kapasitelerinin , ve formda , ve sırasıyla, bazıları için . Bu, artırma yolları kullanabileceğimiz anlamına gelir , , ve sonsuz sayıda kez ve bu kenarların artık kapasiteleri her zaman aynı biçimde olacaktır. 5. adımdan sonra ağdaki toplam akış . Yukarıdaki gibi artırma yollarını kullanmaya devam edersek, toplam akış . Ancak, bir değer akışı olduğuna dikkat edin , göndererek boyunca akış birimleri Boyunca 1 birim akış , ve boyunca akış birimleri . Bu nedenle, algoritma hiçbir zaman sonlanmaz ve akış maksimum akışa yakınlaşmaz bile.[4]

Sonlandırılmayan başka bir örnek, Öklid algoritması tarafından verilir Backman ve Huynh (2018), Ford-Fulkerson algoritmasının bir ağdaki en kötü çalışma süresinin içinde sıra sayıları dır-dir .

Python uygulaması Edmonds-Karp algoritma

ithalat koleksiyonlarsınıf Grafik:    "" "Bu sınıf, bitişik matris gösterimini kullanan yönlendirilmiş bir grafiği temsil eder." ""    def __içinde__(kendini, grafik):        kendini.grafik = grafik  # artık grafik        kendini.kürek çekmek = len(grafik)    def bfs(kendini, s, t, ebeveyn):        "" "Kaynak" s "den" t "ye giden bir yol varsa doğru döndürür        artık grafik. Ayrıca yolu saklamak için üst [] 'yi doldurur. "" "        # Tüm köşeleri ziyaret edilmedi olarak işaretle        ziyaret = [Yanlış] * kendini.kürek çekmek        # BFS için bir sıra oluşturun        kuyruk = koleksiyonlar.deque()        # Kaynak düğümü ziyaret edildi olarak işaretleyin ve sıraya koyun        kuyruk.eklemek(s)        ziyaret[s] = Doğru        # Standart BFS döngüsü        süre kuyruk:            sen = kuyruk.popleft()            # Sıradan çıkmış tepe noktasının tüm bitişik köşelerini al u            # Bitişik ziyaret edilmemişse, işaretleyin            # ziyaret etti ve sıraya koy            için ind, val içinde numaralandırmak(kendini.grafik[sen]):                Eğer (ziyaret[ind] == Yanlış) ve (val > 0):                    kuyruk.eklemek(ind)                    ziyaret[ind] = Doğru                    ebeveyn[ind] = sen        # Kaynaktan başlayarak BFS'de havuza ulaşırsak, geri dön        # true, else false        dönüş ziyaret[t]    # Verilen grafikte s'den t'ye maksimum akışı verir    def edmonds_karp(kendini, kaynak, lavabo):        # Bu dizi BFS tarafından doldurulur ve yolu saklamak için        ebeveyn = [-1] * kendini.kürek çekmek        max_flow = 0  # Başlangıçta akış yok        # Kaynaktan havuza giden yol varken akışı artırın        süre kendini.bfs(kaynak, lavabo, ebeveyn):            # Yol boyunca kenarların minimum kalan kapasitesini bulun            # BFS tarafından doldurulan yol. Veya maksimum akışı bul diyebiliriz            # bulunan yol boyunca.            yol_ akışı = yüzer("Inf")            s = lavabo            süre s != kaynak:                yol_ akışı = min(yol_ akışı, kendini.grafik[ebeveyn[s]][s])                s = ebeveyn[s]            # Genel akışa yol akışı ekleyin            max_flow += yol_ akışı            # kenarların ve ters kenarların kalan kapasitelerini güncelleyin            # Yol boyunca            v = lavabo            süre v != kaynak:                sen = ebeveyn[v]                kendini.grafik[sen][v] -= yol_ akışı                kendini.grafik[v][sen] += yol_ akışı                v = ebeveyn[v]        dönüş max_flow

Ayrıca bakınız

Notlar

  1. ^ Laung-Terng Wang, Yao-Wen Chang, Kwang-Ting (Tim) Cheng (2009). Elektronik Tasarım Otomasyonu: Sentez, Doğrulama ve Test. Morgan Kaufmann. pp.204. ISBN  0080922007.CS1 Maint: birden çok isim: yazarlar listesi (bağlantı)
  2. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein (2009). Algoritmalara Giriş. MIT Basın. pp.714. ISBN  0262258102.
  3. ^ Ford, L.R.; Fulkerson, D.R. (1956). "Bir ağ üzerinden maksimum akış" (PDF). Kanada Matematik Dergisi. 8: 399–404. doi:10.4153 / CJM-1956-045-5.
  4. ^ Zwick, Uri (21 Ağustos 1995). "Ford-Fulkerson maksimum akış prosedürünün sona eremeyebileceği en küçük ağlar". Teorik Bilgisayar Bilimleri. 148 (1): 165–170. doi:10.1016 / 0304-3975 (95) 00022-O.

Referanslar

Dış bağlantılar

İle ilgili medya Ford-Fulkerson algoritması Wikimedia Commons'ta