You are on page 1of 50

BM203 Veri Yapıları ve

Algoritmalar

Ders 9
Çizge Kuramı (Graf Teorisi)
• Çizge teorisi temel olarak bir problemin kenar (edge) ve
düğümler (node) ile modellenmesi ve bu modelin bir
çizge şeklinde gösterilmesi ilkesine dayanmaktadır.
• Çizge teorisinde tanımlı olan bazı özellikler bu modelin
çözümüne ve dolayısıyla gerçek problemin çözümüne
yardımcı olmaktadırlar.
• Yani çizge teorisinin işe yaraması için öncelikle gerçek
dünyadan bir problem çizge olarak modellenir, bu model
çözülür ve daha sonra gerçek dünyaya uygulanır.
Çizgenin Tanımı
• Graf, matematiksel anlamda, düğümlerden ve bu
düğümler arasındaki ilişkiyi gösteren kenarlardan oluşan
bir kümedir.
• Bağlantılı listeler ve ağaçlar grafların özel örneklerindendir.
• Bir G grafı D ile gösterilen düğümlerden (node veya
vertex) ve K ile gösterilen kenarlardan (Edge) oluşur.
• Her kenar iki düğümü birleştirir.

• Her kenar, iki bilgi (Düğüm) arasındaki ilişkiyi gösterir


ve (u,v) şeklinde ifade edilir.
• (u,v) iki düğümü göstermektedir.
Graflar - Örnek
• G = (D, K) grafı aşağıda verilmiştir.
• D = {A, B, C, D, E, F}
• K = {(A, B), (A, D), (B, C), (C, D), (C, E), (D, E)}

B C

A F

D E

4
Uygulama Alanları
• Elektronik devreler • Bilgisayar Ağları
• Baskı devre kartları • Lokal alan ağları
(PCB) • İnternet
• Entegre devreler • Veritabanları
• Ulaşım Ağları • Entity-relationship
• Otoyol Ağı diyagram
• Havayolu Ağı

5
Graflar – Kenar Türleri
• Yönlendirilmiş Kenar (Directed • Yönlendirilmiş Graf (Directed
Edge) Graphs)
• Sıralı kenar çiftleri ile ifade edilir. • Bütün kenarları yönlendirilmiş
• (u, v) ile (v, u) aynı değildir. graftır.
• İlk kenar orijin ikinci kenar ise • Digraph şeklinde de ifade edilirler.
hedef olarak adlandırılır. • Yönlendirilmemiş Graf
• Yönlendirilmemiş Kenar (Undirected Graphs)
(Undirected Edge) • Hiçbir kenarı yönlendirilmemiş
• Sırasız kenar çiftleri ile ifade edilir. graftır.
• (u, v) ile (v, u) aynı şeyi ifade ederler.

6
• Komşu(Adjacent): Eğer (u, v) ∈ K ise u ve v
düğümleri komşudur.
• (A, B) komşudur.
• (B, D), (C, F) komşu değildir.

B C

A F

D E
7
• Graf kenarları üzerinde • Ağırlık uygulamadan
ağırlıkları olabilir. Eğer uygulamaya değişir.
kenarlar üzerinde • Şehirler arasındaki
uzaklık.
ağırlıklar varsa bu tür
graflara • Routerler arası bant
genişliği
ağırlıklı/maliyetli graf
(Weighted Graphs)
denir.

8
Graf Gösterimi
• Zaman ve yer karmaşıklığı aşağıdaki her iki ifade ile
de ölçülür.
• Düğüm sayısı = |D| = n
• Kenar sayısı = |K| = k
• Graf gösterimi için iki farklı yol vardır.
• Komşuluk matrisi
• Komşuluk listesi

9
Komşuluk Matrisi Gösterimi

• Komşuluk Matrisi Gösterimi:


1 (u,v) K’nın içindeyse
M(u, v) =
0 diğer

A B C D E F

B C A 0 1 0 1 0 0
B 0 0 1 0 0 0
A F
C 0 0 0 1 1 0
D 0 0 0 0 1 0
D E
E 0 0 0 0 0 0
F 0 0 0 0 0 0

10
Komşuluk Matrisi Gösterimi
• Komşuluk Matrisi Gösterimi (Ağırlıklı Graf):
ağırlık(u, v) (u, v) K’nın içindeyse
M(u, v) =
∞ diğer

A B C D E F
20
B C A ∞ 10 ∞ 5 ∞ ∞
10
B ∞ ∞ 20 ∞ ∞ ∞
30
A 50 F C ∞ ∞ ∞ 30 50 ∞
5
15 D ∞ ∞ ∞ ∞ 15 ∞
D E
E ∞ ∞ ∞ ∞ ∞ ∞
F ∞ ∞ ∞ ∞ ∞ ∞

11
Komşuluk Listesi Gösterimi
• Komşuluk Listesi: B D
A

B A C
B C
C B D E

D A C E
A F
E C D

D E F

12
Komşuluk Listesi Gösterimi
• Komşuluk Listesi (Yönlendirilmiş Graflar)
B C A B D

B C
A F
C D E
D E
D E

13
Graf Üzerinde Dolaşma
• Graf üzerinde dolaşma grafın düğümleri ve kenarları
üzerinde istenen bir işi yapacak veya bir problemi
çözecek biçimde hareket etmektir.
• Graf üzerinde dolaşma yapan birçok yaklaşım
yöntemi vardır. En önemli iki tanesi aşağıda
listelenmiştir.
• BFS (Breadth First Search) Yöntemi
• DFS (Depth First Search ) Yöntemi
14
Graf Üzerinde Dolaşma
• Breath-First Search (BFS):
• Başlangıç düğümünden başla ve tüm komşuları ziyaret et.
• Daha sonra komşunun komşularını ziyaret et.
• Başlangıç düğümünden başlayıp dışa doğru dalga gibi.
• Depth-First Search (DFS)
• Bir düğümden başla düğümün bir kenarında o kenar üzerinde gidilebilecek
en uzak düğüme kadar sürdür.
• Geri gel ve diğer kenarı dene
• Tüm düğümler gezilene kadar devam et.

15
Breath-First Search (BFS)

• Verilen G = (D, K) grafında, 3 2 3


“s” başlangıç düğümünden
1
başla ve s den erişilebilecek 2
2
düğümleri belirle. s 3
2 1
2
• Bulunan ama işlenmeyen 1 2
düğümler sınır düğümleridir (gri 3 3
düğümler).
• Sınır düğümlerine sırası ile
gidilir ardından bunların
komşuları bulunur ve bu
komşulara gidilir. 16
Breath-First Search (BFS)
• İşlem adımları:
1. Seçilen düğümün tüm komşuları sırasıyla
seçilir ve ziyaret edilir.
2. Her komşu kuyruk içerisine atılır.
3. Komşu kalmadığında Kuyruk içerisindeki
ilk düğüm alınır ve 2. adıma gidilir.

17
Depth-First Search (DFS)

• Bir v düğümüne gidildikten sonra v düğümünün bir


komşusu seçilir ve ziyaret edilir.
• Ardından onun bir komşusu seçilir ve ard arda komşu
seçimi yapılarak devam edilir.
• Komşu kalmadığında geri dönülür.
18
DFS - Gerçekleştirim

• DFS işlem adımları


1. Önce bir başlangıç düğümü seçilir ve ziyaret edilir.
2. Seçilen düğümün bir komşusu seçilir ve ziyaret edilir.
3. 2. adımda ziyaret edilecek komşu kalmayıncaya kadar devam edilir.
4. Komşu kalmadığında tekrar geri dönülür ve önceden ziyaret edilmiş
düğümler için adım 2 ve 3 tekrarlanır.

19
DFS - Örnek
DFS(a) ağacı
b a f
a

c g b f

c g
d e

d e

20
En Küçük Yol Ağacı
(Minimum Spanning Tree)
• Yol ağacı, bir graf üzerinde tüm düğümleri
kapsayan ağaç şeklinde bir yoldur.
• Ağaç özelliği olduğu için kapalı çevrim(çember)
içermez.
• Bir graf üzerinde birden çok yol ağacı olabilir. En
az maliyetli olan en küçük yol ağacı (minimum
spanning tree) olarak adlandırılır.
21
MSP - Örnek

2 2
B C B C
3 3
A
3 7 3
A 7
9

D E D E
6 15

2 2
B C B C
3 3
A
3
A
9

14 D
6
E
20 D E
6 22
MST Hesaplama – Ağırlıksız Graf
• Graf ağırlıksızsa veya tüm kenarların ağırlıkları eşit ise MST nasıl
bulunur?
• BSF veya DSF çalıştırın oluşan ağaç MST’dir

A A
A
DFS(A) BFS(A)
B C B E C
B
C

D E E D
D

23
Algoritmalar
• En küçük yol ağacını belirlemek için birçok algoritma
geliştirilmiştir.
• Kruskal’ın Algoritması: Daha az maliyetli kenarları tek tek
değerlendirerek yol ağacını bulmaya çalışır. Ara işlemler birden çok
ağaç oluşturabilir.
• Prim’in Algoritması: En az maliyetli kenardan başlayıp onun
uçlarından en az maliyetle genişleyecek kenarın seçilmesine
dayanır. Bir tane ağaç oluşur.
• Sollin’in Algoritması: Doğrudan paralel programlamaya yatkındır.
Aynı anda birden çok ağaçla başlanır ve ilerleyen adımlarda
ağaçlar birleşerek tek bir yol ağacına dönüşür. 24
Greedy (Açgözlü) Yaklaşımı/Yöntemi

• Dolaşma yapılırken bir sonraki düğümü belirlemek için


kullanılan bir karar verme/seçme yöntemidir.
• O andaki seçenekler içerisinden en iyi olarak gözükeni
seçer.
• Bölgesel/yerel değerlendirmeler yapar.
• Yerel optimum daima global optimum anlamına gelmez
dolayısıyla en iyi sonuca götürmeyebilir.
• Fakat bazı durumlarda en iyi sonuca götürür. (en kısa yol
alg. , Huffman coding)
25
Kruskal’ın Algoritması
• Graf üzerindeki düğümler, aralarında bağlantı olmayan N
tane bağımsız küme gibi düşünülür.
• Daha sonra bu kümeler tek tek maliyeti en az olan
kenarlarla birleştirilir (çevrim oluşturmayacak şekilde ).
• Düğümler arasında bağlantı olan tek bir küme
oluşturulmaya çalışılır.
• Küme birleştirme işleminde en az maliyetli olan kenardan
başlanılır; daha sonra kalan kenarlar arasından en az
maliyetli olanlar seçilir.
26
Kruskal’ın Algoritması – Kaba Kod

27
Kruskal’ın Algoritması: Örnek
8 7
b c d
• Kruskal algoritmasında bütün yollar 4 9
2
listelenip küçükten büyüğe doğru sıralanır. 4 14
• Liste çıkarıldıktan sonra sırasıyla en a 11 i e
7 6
küçükten en büyüğe doğru komşuluklar 8 10
işaretlenir. g f
h 1 2

c 7 Sıralı kenar listesi


b d
4 2 9 (i, h)
4 (h, g) (i, c) (g, f) (a, b) (c, f) (i, g)
a i e
(c, d) (a, h) (b, c) (d, e) (e, f) (b, h) (d, f)
8
h g f
1 2

Her aşamada elimizde ağaç var mı?

28
Prim’in Algoritması

• En küçük yol ağacını belirlemede kullanılan diğer bir


algoritmadır.
• Greedy algoritmalarından biridir.
• Kruskal’ın algoritmasından tek farkı bir sonraki kenarı
nasıl seçtiğidir.

29
Prim’in Algoritması
• Adım-1: Başlangıçta, herhangi bir noktayı ağacı oluşturmaya
başlamak için seç.
• Adım-2: Oluşturulan ağaca eklemek için, şu ana kadar
oluşturulmuş ağaç üzerinden erişilebilen ve daha önceden
ağaca katılmamış olan en küçük ağırlıklı kenarı seç.
• Adım-3: Eğer bu kenarın ağaca katılması, bir çember
oluşmasına sebep olmuyorsa, ağaca ekle.
• Adım-4: Ağaçtaki kenar sayısı (N-1)'e ulaşana kadar ikinci
adıma geri dön.
30
Prim’in Algoritması

Bu çizgenin orijinal hali. Ayrıtların


üzerindeki sayılar ağırlıkları.
Ayrıtlardan hiç biri henüz seçili
değil ve D düğümü başlangıç
düğümü olarak rastgele seçildi.

31
Prim’in Algoritması - Örnek

İkinci olarak seçilecek düğüm D’ye


en yakın olanı. A 5 , B 9, E 15,
ve F 6 uzaklıkta. Bunlardan en
küçüğü 5 dolayısıyla A düğümünü
ve DA ayrıtını işaretliyoruz.

32
Prim’in Algoritması - Örnek

Seçilecek bir sonraki


düğüm D veya A’ya en yakın olanı. B 9
uzakta (D den), E 15, ve F 6. En yakın 6
o yüzden F düğümünü ve DF ayrıtını
işaretliyoruz.

33
Prim’in Algoritması - Örnek

Algoritma aynı şekilde devam


ediyor. B düğümü A’dan 7 uzakta ve
işaretli. Burada DB ayrıtı kırmızı olarak
işaretlendi çünkü daha önce hem B hem
de D düğümleri işaretlenmişti. Bu
yüzden bu ayrıt kullanılamaz.

34
Prim’in Algoritması - Örnek

Bu durumda C, E ve G’den birini


seçebiliriz. C, B’den 8 uzakta, E, B’den
7 uzakta ve G, F’den 11 uzakta. En
yakın E olduğu için onu ve EB ayrıtını
işaretliyoruz. Diğer iki ayrıt kırmızı
çünkü onları bağlayan düğümler
kullanıldı.

35
Prim’in Algoritması - Örnek

Burada
sadece C ve G düğümlerini
inceleyebiliriz. C, E’den 5 uzakta
ve G ise 9 uzakta. C’yi ve EC
ayrıtını seçiyoruz. Ayrıca BC’yi
de kırmızı olarak işaretliyoruz.
36
Prim’in Algoritması - Örnek

G düğümü kalan son


düğüm. F’den 11 uzakta ve E’den
9 uzakta. Bu nedenle E’yi
ve EG’yi işaretliyoruz. Tüm
düğümleri eklediğimize göre en
hafif kapsayan ağaç yeşil olarak
gözüküyor. Toplan ağırlığı ise
37

burada 39 oldu.
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ı.

38
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 B • y = {B, A, E, C, D}
3 6
• Uzunluk(y) = 4
4 E 8 • Maliyet(y) = 2+3+1+5=11
7 1

D 5
C

39
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.
A B
F H

C Başlangıç
G

D E

• C’den diğer düğümlere giden en kısa yolu bulunuz?

40
BFS Tabanlı Çözüm
• S’den başla BFS algoritmasını uygula (çevrim graflarda da çalışır.)

A B
F H
A D E

C Source
G
B G
D E

41H
41
Ağırlıklı Graflarda En Kısa Yol Problemi

• BFS algoritması bu graf içinde çalışır mı?


• Hayır!

2
B
• C den A’ya en kısa yol:
A
1 – C->A (uzunluk: 1, maliyet: 9)
1 – BFS ile hesaplandı
9
3
C
8 2 • C den A’ya en az maliyetli yol:
D E – C->E->D->A (uzunluk: 3, maliyet: 8)
3
– Peki nasıl hesaplayacağız?

42
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-Warshall

43
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.

44
Dijkstra’nın Algoritması

2
A ∞
9 ∞ B
1. O anki en iyi düğümü seç – C
1
9
1 2. Bilinen düğümler kümesine ekle
C
3
0
3. Seçilen düğümün tüm komşularının
8 2 maliyetini güncelle.
D 8
∞ ∞
2 E
3

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

45
Dijkstra’nın Algoritması

A
2
B
1. O anki en iyi düğümü seç – E
9 ∞
1 2. Bilinen düğümler kümesine ekle
1
9 C 3. Seçilen düğümün tüm komşularının
3
0 maliyetini güncelle.
8 2

D 58 2 E
3

1. Komşu D: 2 + 3 = 5 < 8  maliyet(D) = 5

46
Dijkstra’nın Algoritması

2
A 98 ∞ B
1. O anki en iyi düğümü seç – D
1
9
1 2. Bilinen düğümler kümesine ekle
C
3
0
3. Seçilen düğümün tüm komşularının
8 2 maliyetini güncelle.
D 5 2 E
3

1. Komşu A: 5 + 3 = 8 < 9  maliyet(A) = 8

47
Dijkstra’nın Algoritması

2
A 8 ∞
10 B 1. O anki en iyi düğümü seç – A
1 2. Bilinen düğümler kümesine ekle
1
9 C
3 3. Seçilen düğümün tüm komşularının
0
8 2 maliyetini güncelle.
D 5 2 E
3

1. Komşu B: 8 + 2 = 10 < ∞  maliyet(B) = 10

48
Dijkstra’nın Algoritması

2 1. O anki en iyi düğümü seç – B


A 8 10 B
1 2. Bilinen düğümler kümesine ekle
1
9 C
3
3. Seçilen düğümün tüm komşularının
8
0
2
maliyetini güncelle.

D 5 2 E
3

49
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.

3
A B • A’dan C’ye en az maliyetli yol
2
-2 − Dijkstra : A->C, maliyet: 2
C − Gerçek yol A->B->C, maliyet: 1

50

You might also like