Floyd – Warshall algoritması - Floyd–Warshall algorithm

Floyd – Warshall algoritması
SınıfTüm çiftler en kısa yol problemi (ağırlıklı grafikler için)
Veri yapısıGrafik
En kötü durumda verim
En iyi senaryo verim
Ortalama verim
En kötü durumda uzay karmaşıklığı

İçinde bilgisayar Bilimi, Floyd – Warshall algoritması (Ayrıca şöyle bilinir Floyd'un algoritması, Roy – Warshall algoritması, Roy – Floyd algoritması, ya da WFI algoritması) bir algoritma bulmak için en kısa yollar içinde ağırlıklı grafik pozitif veya negatif kenar ağırlıkları olan (ancak negatif döngüleri olmayan).[1][2] Algoritmanın tek bir çalıştırılması, tüm köşe çiftleri arasındaki en kısa yolların uzunluklarını (toplam ağırlıkları) bulacaktır. Yolların ayrıntılarını döndürmese de, algoritmada basit değişikliklerle yolları yeniden yapılandırmak mümkündür. Algoritmanın sürümleri ayrıca Geçişli kapatma bir ilişkinin veya (ile bağlantılı olarak Schulze oylama sistemi ) en geniş yollar ağırlıklı bir grafikteki tüm köşe çiftleri arasında.

Tarih ve adlandırma

Floyd – Warshall algoritması şunlara bir örnektir: dinamik program, ve şu anda tanınan biçiminde yayınlandı Robert Floyd 1962'de.[3] Ancak, esasen daha önce yayınladığı algoritmalarla aynıdır. Bernard Roy 1959'da[4] ve ayrıca Stephen Warshall 1962'de[5] bir grafiğin geçişli kapanışını bulmak için,[6] ve yakından ilgilidir Kleene algoritması (1956'da yayınlandı) deterministik sonlu otomat içine Düzenli ifade.[7] Algoritmanın iç içe geçmiş üç döngü olarak modern formülasyonu ilk kez yine 1962'de Peter Ingerman tarafından tanımlandı.[8]

Algoritma

Floyd – Warshall algoritması, her bir köşe çifti arasındaki olası tüm yolları grafik üzerinden karşılaştırır. Bunu ile yapabiliyor bir grafikte karşılaştırmalar, en fazla grafikte kenarlar ve her kenar kombinasyonu test edilir. Bunu, tahmin optimal olana kadar iki köşe arasındaki en kısa yolda bir tahmini aşamalı olarak iyileştirerek yapar.

Bir grafik düşünün köşelerle 1 ile numaralandırılmış. Ayrıca bir işlevi düşünün mümkün olan en kısa yolu döndüren -e sadece setteki köşeleri kullanma yol boyunca ara noktalar olarak. Şimdi, bu işlev verildiğinde, amacımız her birinden en kısa yolu bulmaktır. her birine kullanma hiç tepe noktası .

Bu köşe çiftlerinin her biri için, Ya olabilir

(1) geçmeyen bir yol (yalnızca kümede köşeleri kullanır .)

veya

(2) içinden geçen bir yol (kimden -e ve sonra -e her ikisi de yalnızca ara köşeleri kullanarak)

En iyi yol olduğunu biliyoruz -e sadece köşeleri kullanan vasıtasıyla tarafından tanımlanır ve daha iyi bir yol olsaydı açık ki -e -e , o zaman bu yolun uzunluğu, en kısa yolun -e (yalnızca ara köşeleri kullanarak ) ve en kısa yol -e (yalnızca ara köşeleri kullanarak).

Eğer köşeler arasındaki kenarın ağırlığı ve , tanımlayabiliriz aşağıdakiler açısından yinelemeli formül: temel durum

ve yinelemeli durum

.

Bu formül Floyd-Warshall algoritmasının kalbidir. Algoritma ilk hesaplamayla çalışır hepsi için çiftler için , sonra , ve benzeri. Bu süreç şu tarihe kadar devam eder: ve herkes için en kısa yolu bulduk herhangi bir ara köşeyi kullanarak çiftler. Bu temel sürüm için sözde kod şu şekildedir:[orjinal araştırma? ]

İzin Vermek dist be a | V | × | V | ∞ (sonsuz) olarak başlatılan minimum mesafeler dizisiher biri için kenar (sen, v) yapmak    dist [sen][v] ← w (sen, v)  // Kenarın ağırlığı (sen, v)her biri için tepe v yapmak    dist [v][v] ← 0için k itibaren 1 -e | V | için ben itibaren 1 -e | V | için j itibaren 1 -e | V | Eğer dist [ben][j]> dist [ben][k] + dist [k][j] dist [ben][j] ← dist [ben][k] + dist [k][j]            eğer biterse

Misal

Yukarıdaki algoritma, aşağıda soldaki grafikte yürütülür:

Floyd-Warshall example.svg

Dış döngünün ilk yinelemesinden önce, etiketli k = 0 yukarıda, bilinen tek yollar grafikteki tek kenarlara karşılık gelir. Şurada: k = 1, tepe 1'den geçen yollar bulunur: özellikle, daha az kenarı olan ancak daha uzun olan (ağırlık olarak) yolu [2,3] değiştirerek [2,1,3] yolu bulunur. Şurada: k = 2, köşelerden geçen yollar {1,2} bulunur. Kırmızı ve mavi kutular, yolun [4,2,1,3], önceki yinelemelerde karşılaşılan iki bilinen yoldan [4,2] ve [2,1,3] kesişimde 2 olmak üzere nasıl birleştirildiğini gösterir. [4,2,3] yolu dikkate alınmaz, çünkü [2,1,3] 2'den 3'e kadar karşılaşılan en kısa yoldur. k = 3, köşelerden geçen yollar {1,2,3} bulunur. Sonunda k = 4tüm kısa yollar bulunur.

Her yinelemedeki uzaklık matrisi kgüncellenen mesafeler ile cesur, olacak:

k = 0j
1234
ben10−2
2403
302
4−10
k = 1j
1234
ben10−2
2402
302
4−10
k = 2j
1234
ben10−2
2402
302
43−110
k = 3j
1234
ben10−20
24024
302
43−110
k = 4j
1234
ben10−1−20
24024
35102
43−110

Negatif döngülerle davranış

Negatif döngü, kenarları toplamı negatif bir değere sahip bir döngüdür. Herhangi bir köşe çifti arasında en kısa yol yoktur , negatif bir döngünün parçasını oluşturan yol uzunlukları -e keyfi olarak küçük (negatif) olabilir. Sayısal olarak anlamlı çıktı için Floyd – Warshall algoritması, negatif döngü olmadığını varsayar. Yine de, negatif döngüler varsa, Floyd – Warshall algoritması bunları tespit etmek için kullanılabilir. Sezgi şu şekildedir:

  • Floyd – Warshall algoritması, tüm köşe çiftleri arasındaki yol uzunluklarını yinelemeli olarak revize eder nerede dahil ;
  • Başlangıçta yolun uzunluğu sıfırdır;
  • Bir yol ancak sıfırdan küçük bir uzunluğa sahipse, yani bir negatif döngüye işaret ediyorsa, bunu geliştirebilir;
  • Böylece, algoritmadan sonra, dan negatif uzunlukta bir yol varsa negatif olacaktır geri dön .

Dolayısıyla, negatifleri tespit etmek için döngüleri Floyd – Warshall algoritması kullanılarak, yol matrisinin köşegeni incelenebilir ve negatif bir sayının varlığı, grafiğin en az bir negatif döngü içerdiğini gösterir.[9] Algoritmanın yürütülmesi sırasında, negatif bir döngü varsa, üssel olarak büyük sayılar görünebilir. , nerede grafikteki negatif kenarın en büyük mutlak değeridir. Taşma / aşağı taşma problemlerinden kaçınmak için, algoritmanın iç for döngüsü içinde yol matrisinin köşegeninde negatif sayılar kontrol edilmelidir.[10] Açıktır ki, yönsüz bir grafikte negatif bir kenar, olay köşelerini içeren negatif bir döngü (yani kapalı bir yürüyüş) yaratır. Tüm kenarlarını göz önünde bulundurarak yukarıda Yönlendirilmemiş örnek grafik, ör. köşe dizisi 4 - 2 - 4, ağırlık toplamı −2 olan bir döngüdür.

Yol yeniden inşası

Floyd – Warshall algoritması tipik olarak yalnızca tüm köşe çiftleri arasındaki yolların uzunluklarını sağlar. Basit değişikliklerle, herhangi iki uç nokta köşesi arasındaki gerçek yolu yeniden yapılandırmak için bir yöntem oluşturmak mümkündür. Kişi her bir tepe noktasından diğer bir tepe noktasına gerçek yolu kaydetmeye meyilli olsa da, bu gerekli değildir ve aslında bellek açısından çok maliyetlidir. Bunun yerine en kısa yol ağacı her düğüm için hesaplanabilir kullanma zamanı her ağacı depolamak için bellek, bu da herhangi iki bağlantılı köşeden bir yolu verimli bir şekilde yeniden oluşturmamızı sağlar.

Sözde kod [11]

İzin Vermek uzak olmak  başlatılan minimum mesafeler dizisi  (sonsuzluk)İzin Vermek sonraki ol  başlatılan köşe dizini dizisi boşprosedür FloydWarshallWithPathReconstruction() dır-dir    her biri için kenar (u, v) yapmak        dist [u] [v] ← w (u, v) // Kenarın ağırlığı (u, v)        sonraki [u] [v] ← v her biri için köşe v yapmak        dist [v][v] ← 0 sonraki [v] [v] ← v için k itibaren 1 -e | V | yapmak // standart Floyd-Warshall uygulaması        için ben itibaren 1 -e | V | için j itibaren 1 -e | V | Eğer dist [i] [j]> dist [i] [k] + dist [k] [j] sonra                    dist [i] [j] ← dist [i] [k] + dist [k] [j] sonraki [i] [j] ← sonraki [i] [k]
prosedür Yol (u, v) Eğer sonraki [u] [v] = boş sonra        dönüş [] yol = [u] süre senv        u ← sonraki [u] [v] yol.append (u) dönüş yol

Analiz

İzin Vermek olmak , köşe sayısı. Hepsini bulmak için nın-nin (hepsi için ve ) bunlardan gerektirir operasyonlar. Başladığımızdan beri ve sırasını hesapla matrisler , , , , kullanılan toplam işlem sayısı . bu yüzden karmaşıklık algoritmanın .

Uygulamalar ve genellemeler

Floyd – Warshall algoritması, diğerleri arasında aşağıdaki problemleri çözmek için kullanılabilir:

  • Yönlendirilmiş grafiklerde en kısa yollar (Floyd algoritması).
  • Geçişli kapatma yönlendirilmiş grafikler (Warshall algoritması). Warshall'ın algoritmanın orijinal formülasyonunda, grafik ağırlıksızdır ve bir Boole bitiş matrisi ile temsil edilir. Daha sonra ekleme işlemi ile değiştirilir mantıksal bağlaç (VE) ve minimum işlem mantıksal ayrılma (VEYA).
  • Bulmak Düzenli ifade gösteren normal dil tarafından kabul edildi sonlu otomat (Kleene algoritması Floyd – Warshall algoritmasının yakından ilişkili bir genellemesi)[12]
  • Ters çevirme nın-nin gerçek matrisler (Gauss-Jordan algoritması ) [13]
  • Optimum yönlendirme. Bu uygulamada, iki köşe arasındaki maksimum akışa sahip yolu bulmakla ilgilenir. Bu, yukarıdaki sözde kodda olduğu gibi minimum almak yerine, bunun yerine maksima aldığı anlamına gelir. Kenar ağırlıkları, akış üzerindeki sabit kısıtlamaları temsil eder. Yol ağırlıkları darboğazları temsil eder; bu nedenle yukarıdaki ekleme işlemi minimum işlemle değiştirilir.
  • Hızlı hesaplama Yol bulucu ağları.
  • En geniş yollar / Maksimum bant genişliği yolları
  • Farka bağlı matrislerin kanonik formunun hesaplanması (DBM'ler)
  • Grafikler arasındaki benzerliği hesaplamak

Uygulamalar

Uygulamalar birçok kişi için mevcuttur Programlama dilleri.

Diğer en kısa yol algoritmalarıyla karşılaştırma

Floyd – Warshall algoritması, tüm köşe çiftleri arasındaki yolların hesaplanması için iyi bir seçimdir. yoğun grafikler, köşe çiftlerinin çoğunun veya tümünün kenarlarla bağlandığı. İçin seyrek grafikler negatif olmayan kenar ağırlıkları ile daha iyi bir seçim kullanmaktır Dijkstra algoritması tekrarlanan Dijkstra'nın çalışma süresinden bu yana, olası her başlangıç ​​noktasından ( kullanma Fibonacci yığınları ) daha iyidir Floyd – Warshall algoritmasının çalışma süresi önemli ölçüde daha küçüktür . Negatif kenarları olan ancak negatif döngüleri olmayan seyrek grafikler için, Johnson'ın algoritması tekrarlanan Dijkstra yaklaşımı ile aynı asimptotik çalışma süresi ile kullanılabilir.

Kullanan bilinen algoritmalar da vardır. hızlı matris çarpımı Yoğun grafiklerde tüm çiftlerin en kısa yol hesaplamasını hızlandırmak için, ancak bunlar tipik olarak kenar ağırlıkları üzerinde ekstra varsayımlar yapar (küçük tamsayılar olmasını gerektirmek gibi).[14][15] Ayrıca, çalışma sürelerindeki yüksek sabit faktörler nedeniyle, çok büyük grafikler için sadece Floyd – Warshall algoritmasına göre bir hızlanma sağlarlar.

Referanslar

  1. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. (1990). Algoritmalara Giriş (1. baskı). MIT Press ve McGraw-Hill. ISBN  0-262-03141-8. Özellikle bkz. Bölüm 26.2, "Floyd – Warshall algoritması", s. 558–565 ve Kısım 26.4, "Yönlendirilmiş grafiklerdeki yol sorunlarını çözmek için genel bir çerçeve", s. 570–576.
  2. ^ Kenneth H. Rosen (2003). Ayrık Matematik ve Uygulamaları, 5. Baskı. Addison Wesley. ISBN  978-0-07-119881-3.
  3. ^ Floyd, Robert W. (Haziran 1962). "Algoritma 97: En Kısa Yol". ACM'nin iletişimi. 5 (6): 345. doi:10.1145/367766.368168.
  4. ^ Roy, Bernard (1959). "Transitivité et connexité". C. R. Acad. Sci. Paris (Fransızcada). 249: 216–218.
  5. ^ Warshall, Stephen (Ocak 1962). "Boole matrisleri üzerine bir teorem". ACM Dergisi. 9 (1): 11–12. doi:10.1145/321105.321107.
  6. ^ Weisstein, Eric W. "Floyd-Warshall Algoritması". MathWorld.
  7. ^ Kleene, S. C. (1956). "Sinir ağlarında ve sonlu otomatlarda olayların temsili". İçinde C. E. Shannon ve J. McCarthy (ed.). Otomata Çalışmaları. Princeton University Press. sayfa 3–42.
  8. ^ Ingerman, Peter Z. (Kasım 1962). "Algoritma 141: Yol Matrisi". ACM'nin iletişimi. 5 (11): 556. doi:10.1145/368996.369016.
  9. ^ Hochbaum, Dorit (2014). "Bölüm 8.9: Tüm çiftler için en kısa yollar için Floyd-Warshall algoritması" (PDF ). IEOR 266 için Ders Notları: Grafik Algoritmaları ve Ağ Akışları. Endüstri Mühendisliği ve Yöneylem Araştırması Bölümü, California Üniversitesi, Berkeley.
  10. ^ Stefan Hougardy (Nisan 2010). "Negatif döngülü grafiklerde Floyd – Warshall algoritması". Bilgi İşlem Mektupları. 110 (8–9): 279–281. doi:10.1016 / j.ipl.2010.02.001.
  11. ^ https://books.goalkicker.com/AlgorithmsBook/
  12. ^ Gross, Jonathan L .; Yellen, Jay (2003), Çizge Teorisi El Kitabı, Ayrık Matematik ve Uygulamaları, CRC Press, s. 65, ISBN  9780203490204.
  13. ^ Penaloza, Rafael. "Geçişli Kapanış için Cebirsel Yapılar". CiteSeerX  10.1.1.71.7650. Alıntı dergisi gerektirir | günlük = (Yardım)
  14. ^ Zwick, Uri (Mayıs 2002), "Köprü kümeleri ve dikdörtgen matris çarpımını kullanarak en kısa yolları tüm çiftler", ACM Dergisi, 49 (3): 289–317, arXiv:cs / 0008011, doi:10.1145/567112.567114.
  15. ^ Chan, Timothy M. (Ocak 2010), "Ağırlıklı grafiklerde tüm çiftler için en kısa yollar için daha fazla algoritma", Bilgi İşlem Üzerine SIAM Dergisi, 39 (5): 2075–2089, CiteSeerX  10.1.1.153.6864, doi:10,1137 / 08071990x.

Dış bağlantılar