İçerik
-
Upload
cairo-michael -
Category
Documents
-
view
64 -
download
6
description
Transcript of İçerik
1
İçerik• Ön Tanımlar
– Yol, Cevrim(çember)
• En Kısa Yol Problemi– Dijktra’nın Algoritması– Bellman ve Ford Algoritması
Yol
2
A B
D
E
C
Ç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}
• 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
A B
D
E
C
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.
4
A B
D
E
C
2
3 6
8
1
5
74
• y = {B, A, E, C, D}• Uzunluk(y) = 4• Maliyet(y) =
2+3+1+5=11
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.
• C’den diğer düğümlere giden en kısa yolu bulun? 6
A B
D
GC
E
F H
Başlangıç
BFS Tabanlı Çözüm• S’den başla BFS algoritmasını uygula
(çevrim graflarda da çalışır.)
7
7
A B
D
GC
E
F H
Source
A D E
B G
F
H
C
Ağırlıklı Graflarda En Kısa Yol Problemi
• BFS algoritması bu graf içinde çalışır mı?– Hayır!
8
A B
D
C
E
39
1
2
1
28
3
• C den A’ya en kısa yol:– C->A (uzunluk: 1, maliyet: 9)– BFS ile hesaplandı
• C den A’ya en az maliyetli yol:– C->E->D->A (uzunluk: 3, maliyet:
8)– Peki nasıl hesaplayacağız?
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.
1111
0s 3
u
11v5 Güncelle(u, v)
0s 3
u
8v5
Güncelleme - Kaba Kod
1212
0s 3
u
11v5 Güncelle(u, v)
0s 3
u
8v5
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üncellepred[v] = u; // u’dan geldiğimizi kaydet.
} }
0
13
Dijkstra’nın Algoritması
∞ ∞
∞
0
∞
39
1
2
1
28
3
A B
C
D E8 2
9 1. O anki en iyi düğümü seç – C2. Bilinen düğümler kümesine
ekle3. Seçilen düğümün tüm
komşularının maliyetini güncelle.
1. Komşu A: 0 + 9 < ∞ maliyet(A) = 92. Komşu D: 0 + 8 < ∞ maliyet(D) = 83. Komşu E: 0 + 2 < ∞ maliyet(E) = 2
14
Dijkstra’nın Algoritması
9 ∞
8
0
2
39
1
2
1
28
3
A B
C
D E25
1. O anki en iyi düğümü seç – E2. Bilinen düğümler kümesine
ekle3. 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
15
Dijkstra’nın Algoritması
9 ∞
5
0
2
39
1
2
1
28
3
A B
C
D E25
8 1. O anki en iyi düğümü seç – D2. Bilinen düğümler kümesine
ekle3. Seçilen düğümün tüm
komşularının maliyetini güncelle.
1. Komşu A: 5 + 3 = 8 < 9 maliyet(A) = 8
16
Dijkstra’nın Algoritması
8 ∞
5
0
2
39
1
2
1
28
3
A B
C
D E
8 10
1. O anki en iyi düğümü seç – A2. Bilinen düğümler kümesine
ekle3. Seçilen düğümün tüm
komşularının maliyetini güncelle.
1. Komşu B: 8 + 2 = 10 < ∞ maliyet(B) = 10
17
Dijkstra’nın Algoritması
8 10
5
0
2
39
1
2
1
28
3
A B
C
D E
10
1. O anki en iyi düğümü seç – B2. Bilinen düğümler kümesine
ekle3. Seçilen düğümün tüm
komşularının maliyetini güncelle.
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.
18
A
2
B
C
3
-2
• 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?
Negatif Ağırlıklı Dijkstra• Her kenara pozitif sabit eklersek ne olur?
19
• A’dan C’ye en az maliyetli yol • Dijkstra: A->C• Gerçek Yol: A->B->C
A
2
B
C
3
-2
A
4
B
C
5
0Her kenara
2 ekle
20
Negatif Maliyetli Çember• Eğer graf negatif maliyetli çember içeriyorsa,
en az maliyetli yol tanımlanamaz.
A
2
B
C
1
-8
D4
• A’dan D’ye en az maliyetli yol nedir?• Veya B’den C’ye?
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
22
Bellman-Ford Alg: Örnek
0
-2
∞
∞
4
3
∞1
(C, D) (A, B) (A, C) (B, C)
2
(B, D)
Düğüm
Ma. Pred
A 0 -
B ∞ -
C ∞ -
D ∞ -
AB
DC
(C, D) (A, B) (A, C) (B, C) (B, D)
4 A
4
3 A
3
2 B
2
İlk Yineleme
∞ E
E ∞ -
-3
-1
(B, E)(B, E)
(D, E)(D, E)
6 6 B
1 B
1
23
Bellman-Ford Alg: Örnek
0
-2
4
2
4
3
61
(C, D) (A, B) (A, C) (B, C)
2
(B, D)
Düğüm
Ma Pred
A 0 -
B 4 A
C 2 B
D 6 B
AB
DC
(C, D) (A, B) (A, C) (B, C) (B, D)
İkinci Yineleme
1 E
E 1 B
-3
-1
(B, E)(B, E)
(D, E)(D, E)
3 3 C
24
Bellman-Ford Alg: Örnek
0
-2
4
2
4
3
31
(C, D) (A, B) (A, C) (B, C)
2
(B, D)
Düğüm
Ma Pred
A 0 -
B 4 A
C 2 B
D 3 C
AB
DC
(C, D) (A, B) (A, C) (B, C) (B, D)
Üçüncü & Dördüncü Yineleme
1 E
E 1 B
-3
-1
(B, E)(B, E)
(D, E)(D, E)
25
Bellman-Ford Alg: Sonuç
0A
4B
2
3
0
-2
4
2
4
3
31
2
AB
DC
1 E
-3
-1
Düğüm
Ma Pred
A 0 -
B 4 A
C 2 B
D 3 C
E 1 B
C
D
1
-3
4
-2
1
E