Graf Algoritmaları

Download Report

Transcript Graf Algoritmaları

İç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
7H
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
3
0
u
5
v
11
Güncelle(u, v) s
0
3
5
v
8
11
Güncelleme - Kaba Kod
u
s
3
0
u
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
B
-2
C
• A’dan C’ye en az maliyetli yol
−
−
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, 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, 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, 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
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