dijkstra_anlatim

25
1 İçerik Ön Tanımlar Yol, Cevrim(çember) En Kısa Yol Problemi Dijktra’nın Algoritması Bellman ve Ford Algoritması

Upload: burakizu

Post on 25-Dec-2015

218 views

Category:

Documents


4 download

DESCRIPTION

dijkstra_anlatim

TRANSCRIPT

Page 1: dijkstra_anlatim

1

İçerik• Ön Tanımlar

– Yol, Cevrim(çember)

• En Kısa Yol Problemi– Dijktra’nın Algoritması– Bellman ve Ford Algoritması

Page 2: dijkstra_anlatim

Yol

2

A B

D

E

C

Page 3: dijkstra_anlatim

Ç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

Page 4: dijkstra_anlatim

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

Page 5: dijkstra_anlatim

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

Page 6: dijkstra_anlatim

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ıç

Page 7: dijkstra_anlatim

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

Page 8: dijkstra_anlatim

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?

Page 9: dijkstra_anlatim

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

Page 10: dijkstra_anlatim

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

Page 11: dijkstra_anlatim

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

Page 12: dijkstra_anlatim

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.

} }

Page 13: dijkstra_anlatim

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

Page 14: dijkstra_anlatim

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

Page 15: dijkstra_anlatim

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

Page 16: dijkstra_anlatim

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

Page 17: dijkstra_anlatim

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.

Page 18: dijkstra_anlatim

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?

Page 19: dijkstra_anlatim

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

Page 20: dijkstra_anlatim

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?

Page 21: dijkstra_anlatim

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

Page 22: dijkstra_anlatim

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

Page 23: dijkstra_anlatim

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

Page 24: dijkstra_anlatim

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)

Page 25: dijkstra_anlatim

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