erik n Tanmlar Yol Cevrimember En Ksa Yol
İçerik • Ön Tanımlar – Yol, Cevrim(çember) • En Kısa Yol Problemi – Dijktra’nın Algoritması – Bellman ve Ford Algoritması 1
Yol • B A E D C 2
Çevrim (Çember) • Çevrim başlangıç ve bitişi aynı olan yoldur. – y = {A, E, B, C, D, A} – y = {B, A, E, B} – y = {D, E, B, A, E, C, D} B A E D C • Basit çevrim başlangıç düğümü hariç diğer düğümlerin tekrar etmediği yoldur. – y = {A, E, B, C, D, A} – y = {B, A, E, B} 3
Yol Uzunluğu ve Yol Maliyeti • Yol Uzunluğu: Yoldaki kenar sayısı • Yol Maliyeti: Her kenardaki ağırlıkların/maliyetin toplamı. – Not: ağırlıksız graflarda yol uzunluğu yol maliyetine eşittir. 2 A 3 4 7 D B 6 E 5 8 1 • y = {B, A, E, C, D} • Uzunluk(y) = 4 • Maliyet(y) = 2+3+1+5=11 C 4
En Kısa Yol Problemi • G = (D, K) grafı verilsin ve s başlangıç düğümünden V düğümüne giden en az maliyetli yol bulma. • Farklı varyasyonlar mevcut – Ağırlıklı ve ağırlıksız graflar – Sadece pozitif ağırlık veya negatif ağırlığın da olması. 5
Ağırlıksız En Kısa Yol Problemi • Problem: G = (D, K) ağırlıksız grafında s başlangıç düğümü veriliyor ve s’den diğer düğümlere giden en kısa yol nasıl bulunur. B A C D F Başlangıç H G E • C’den diğer düğümlere giden en kısa yolu bulun? 6
BFS Tabanlı Çözüm • S’den başla BFS algoritmasını uygula (çevrim graflarda da çalışır. ) C B A F H A C D Source E G E D G B F 7 H 7
Ağırlıklı Graflarda En Kısa Yol Problemi • BFS algoritması bu graf içinde çalışır mı? – Hayır! 2 A 3 1 – C->A (uzunluk: 1, maliyet: 9) – BFS ile hesaplandı 1 9 C 8 D • C den A’ya en kısa yol: B 3 2 E • C den A’ya en az maliyetli yol: – C->E->D->A (uzunluk: 3, maliyet: 8) – Peki nasıl hesaplayacağız? 8
Algoritmalar • İki düğüm arasında en az maliyetle gidilebilen bir yolun belirlenmesi için birçok algoritma geliştirilmiştir. Bunlardan en ünlüleri – Dijkstra • Ağırlıklı ve yönlü graflar için geliştirilmiştir. • Graf üzerindeki kenarların ağırlıkları 0 veya sıfırdan büyük sayılar olmalıdır. • Negatif ağırlıklar için çalışmaz. – Bellman ve Ford • Negatif ağırlıklı graflar için geliştirilmiştir. – Floyd 9
Dijkstra’nın Algoritması • Başlangıç olarak sadece başlangıç düğümünün en kısa yolu bilinir. (0 dir. ) • Tüm düğümlerin maliyeti bilinene kadar devam et. 1. O anki bilinen düğümler içerisinden en iyi düğümü şeç. (en az maliyetli düğümü seç, daha sonra bu düğümü bilinen düğümler kümesine ekle) 2. Seçilen düğümün komşularının maliyetlerini güncelle. 10
Güncelleme • Adım-1 de seçilen düğüm u olsun. • u düğümünün komşularının maliyetini güncelleme işlemi aşağıdaki şekilde yapılır. – s’den v’ye gitmek için iki yol vardır. – Kırmızı yol izlenebilir. Maliyet 11. – Veya mavi yol izlenebilir. Önce s’den u’ya 3 maliyeti ile gidilir. Daha sonra (u, v) kenarı üzerinden 8 maliyetle v’ye ulaşılır. u s 0 u 3 5 v 11 Güncelle(u, v) s 0 3 5 v 8 11
Güncelleme - Kaba Kod u s 0 u 3 5 v 11 Güncelle(u, v) s 0 3 5 v 8 Guncelle(u, v){ if (maliyet[u] + w(u, v) < maliyet[v]){ // U üzerinden yol daha kısa ise maliyet[v] = maliyet[u] + w(u, v); // Evet! Güncelle pred[v] = u; // u’dan geldiğimizi kaydet. } } 12
Dijkstra’nın Algoritması A 2 ∞ 9 3 1 9 C 0 8 D ∞ 8 ∞ 3 B 1 2 ∞ 2 1. O anki en iyi düğümü seç – C 2. Bilinen düğümler kümesine ekle 3. Seçilen düğümün tüm komşularının maliyetini güncelle. E 1. Komşu A: 0 + 9 < ∞ maliyet(A) = 9 2. Komşu D: 0 + 8 < ∞ maliyet(D) = 8 3. Komşu E: 0 + 2 < ∞ maliyet(E) = 2 13
Dijkstra’nın Algoritması A 2 9 3 1 9 C 0 8 D 8 5 3 B ∞ 1 2 2 E 1. O anki en iyi düğümü seç – E 2. Bilinen düğümler kümesine ekle 3. Seçilen düğümün tüm komşularının maliyetini güncelle. 1. Komşu D: 2 + 3 = 5 < 8 maliyet(D) = 5 14
Dijkstra’nın Algoritması A 2 8 9 3 1 9 C 0 8 D 5 3 B ∞ 1 2 2 1. O anki en iyi düğümü seç – D 2. Bilinen düğümler kümesine ekle 3. Seçilen düğümün tüm komşularının maliyetini güncelle. E 1. Komşu A: 5 + 3 = 8 < 9 maliyet(A) = 8 15
Dijkstra’nın Algoritması A 2 8 3 1 9 C 0 8 D 5 10 ∞ 3 B 1 2 2 1. O anki en iyi düğümü seç – A 2. Bilinen düğümler kümesine ekle 3. Seçilen düğümün tüm komşularının maliyetini güncelle. E 1. Komşu B: 8 + 2 = 10 < ∞ maliyet(B) = 10 16
Dijkstra’nın Algoritması A 2 8 3 1 9 C 0 8 D 5 10 3 B 1 2 2 1. O anki en iyi düğümü seç – B 2. Bilinen düğümler kümesine ekle 3. Seçilen düğümün tüm komşularının maliyetini güncelle. E 17
Negatif Ağırlıklı Dijkstra • Eğer kenarların ağırlıkları negatif ise Dijkstra algoritması en az maliyetli yolu bulmada başarısız oluyor. A 3 2 C B • A’dan C’ye en az maliyetli yol -2 − Dijkstra : A->C, maliyet: 2 − Gerçek yol A->B->C, maliyet: 1 • Her kenara pozitif sabit eklersek ne olur? 18
Negatif Ağırlıklı Dijkstra • Her kenara pozitif sabit eklersek ne olur? A 3 2 B -2 C Her kenara 2 ekle A 5 4 B 0 C • A’dan C’ye en az maliyetli yol • Dijkstra: A->C • Gerçek Yol: A->B->C 19
Negatif Maliyetli Çember • Eğer graf negatif maliyetli çember içeriyorsa, en az maliyetli yol tanımlanamaz. A 1 B 2 -8 C 4 D • A’dan D’ye en az maliyetli yol nedir? • Veya B’den C’ye? 20
Bellman-Ford Algoritması • Ana mantık: – Her düğüm için bir uzaklık tahmini oluşturulur. – Başlangıç olarak maliyet(s)=0 diğer düğümler için maliyet(u)= ∞ olarak atanır. – En az maliyetli yol hesaplanana kadar tüm kenarlar üzerinden güncelleme yapılır. • Algoritma ayrıca grafın negatif maliyetli kenarının olup olmadığını da bulur. • Dijkstra’nın algoritmasına göre daha yavaş çalışır. 21
Bellman-Ford Alg: Örnek A 0 3 2 C ∞ 3 (C, D) 4 ∞ 4 -2 B ∞ 1 ∞ 6 D (A, B) Ma. Pred A 0 - B ∞ 4 A - C 3 2 ∞ A B - D ∞ 6 B E 1 ∞ B - -3 2 1 Düğüm E -1 (A, C) (B, D) (B, E) (D, E) İlk Yineleme 22
Bellman-Ford Alg: Örnek A 0 -2 3 C 4 2 (C, D) 4 B 1 6 3 D (A, B) Ma Pred A 0 - B 4 A C 2 B D 3 6 C B E 1 B -3 2 1 Düğüm E -1 (A, C) (B, D) (B, E) (D, E) İkinci Yineleme 23
Bellman-Ford Alg: Örnek A 0 4 -2 3 C 4 2 (C, D) B 3 (A, B) Ma Pred A 0 - B 4 A C 2 B D 3 C E 1 B -3 1 2 1 Düğüm D E -1 (A, C) (B, D) (B, E) (D, E) Üçüncü & Dördüncü Yineleme 24
Bellman-Ford Alg: Sonuç A 4 0 -2 3 C 4 3 A 0 -3 1 2 B D -1 4 E B 4 -2 2 C Düğüm Ma Pred A 0 - B 4 A C 2 B D 3 C E 1 B -3 1 E 1 D 3 25
- Slides: 25