Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar.

Benzer bir sunumlar


... konulu sunumlar: "Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar."— Sunum transkripti:

1 Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar

2 En kısa yol algoritmaları
Bellman-Ford Algoritması Dijkstra algoritması

3 Algoritmalar Bellman-Ford algorithm Dijkstra’s algorithm
Negatif ağırlıklara izin veriliyor Negatif döngünün varlığını buluyor Dijkstra’s algorithm Negatif ağırlıklara izin verilmiyor Her iki algoritmanın ortak işlemleri: Başlangıç değerleri atama işlemi(Initialization) Hafifletme işlemi (Relaxation)

4 EN KISA YOL İŞARETLEMELERİ
Her v  V köşesi için: δ(s, v): s den v ye en kısa yolun ağırlığı d[v]: bakılan adıma kadar s den v ye bulunan en kısa yolun ağırlığı Başlangıçta, d[v]=∞ d[v]δ(s,v) algoritma bitiminde [v] = bakılan adımda s den v ye bulunan en kısa yolda v den bir önceki köşe Bu köşe yoksa, [v] = NIL  yardımıyla bir ağaç oluşur en kısa yol ağacı 3 9 5 11 6 7 s t x y z 2 1 4

5 Başlangıç değerleri atama(Initialization)
Alg.: INITIALIZE-SINGLE-SOURCE(V, s) for each v  V do d[v] ←  [v] ← NIL d[s] ← 0 Tüm en kıs ayol algoritmaları INITIALIZE- SINGLE-SOURCE fonksiyonu ile başlar

6 Hafifletme (Relaxation) adımı
(u, v) kirişinde hafifletme = v ye u dan gelmek daha avantajlı mıdır? If d[v] > d[u] + w(u, v) bu durumda v ye gelen yolu kısaltabiliriz ( u dan geçerek)  d[v]=d[u]+w(u,v)  [v] ← u Hafifletme sonrası: d[v]  d[u] + w(u, v) s s 5 9 2 u v 5 6 2 u v RELAX(u, v, w) RELAX(u, v, w) 5 7 2 u v 5 6 2 u v Değişiklik yok

7 Bellman-Ford Algoritması
Tek kaynaklı en kısa yol problemini çözüyor δ(s, v) ve [v] yi her v  V için buluyor Negatif ağırlıklara izin veriyor ve negatif ağırlıklı döngü varsa varlığını buluyor. Eğer negatif ağırlıklı döngü yoksa TRUE döndürüyor ( s den ulaşılabilir döngü) Aksi durumda FALSE döndürüyor

8 Bellman-Ford Algoritması
Ana fikir: |V–1| defa tüm kirişlere tek tek bakılıyor ve hafifletme işlemi yapılıyor. Aşağıdaki örnekte verilen kiriş sırası ile Bellman-Ford algoritması uygulayalım (t, x), (t, y), (t, z), (x, t), (y, x), (y, z), (z, x), (z, s), (s, t), (s, y) t x 5 6 -2 -3 8 7 s -4 7 2 9 y z

9 BELLMAN-FORD(V, E, w, s)  s t x y z Pass 1  s t x y z 6 7
6 5 7 9 s t x y z 8 -3 2 -4 -2 Pass 1 6 5 7 9 s t x y z 8 -3 2 -4 -2 6 7 E: (t, x), (t, y), (t, z), (x, t), (y, x), (y, z), (z, x), (z, s), (s, t), (s, y)

10 Örnek (t, x), (t, y), (t, z), (x, t), (y, x), (y, z), (z, x), (z, s), (s, t), (s, y) 6 7 5 9 s t x y z 8 -3 2 -4 -2 6 7 5 9 s t x y z 8 -3 2 -4 -2 1. geçiş 2. geçiş 11 4 2 3. geçiş 6 7 5 9 s t x y z 8 -3 2 -4 -2 11 4 6 7 5 9 s t x y z 8 -3 2 -4 -2 11 4 4. geçiş 2 -2

11 do if d[v] > d[u] + w(u, v) then return FALSE return TRUE
NEGATİF DÖNGÜYÜ BULMA (TÜM KİRİŞLER ÜZERİNDEN EK OLARAK BİR DEFA DAHA GEÇİLİYOR) for each edge (u, v)  E do if d[v] > d[u] + w(u, v) then return FALSE return TRUE c s b 2 3 -8 1 geçiş 2 geçiş c s b 2 3 -8 -3 2 5 c s b 3 -8 (s, b) ye bakalım: d[b] = -1 d[s] + w(s, b) = -4  d[b] > d[s] + w(s, b) -3 2 -6 -1 5 2 (s,b) (b,c) (c,s)

12 BELLMAN-FORD(V, E, w, s) INITIALIZE-SINGLE-SOURCE(V, s)
for i ← 1 to |V| - 1 do for each edge (u, v)  E do RELAX(u, v, w) for each edge (u, v)  E do if d[v] > d[u] + w(u, v) then return FALSE return TRUE Running time: O(V+VE+E)=O(VE) (V) O(V) O(VE) O(E) O(E)

13 Dijkstra’ Algoritması
Tek kaynaklı en kısa yol problemi: Negatif ağırlıklı kiriş yok: w(u, v) > 0,  (u, v)  E Bu algoritmada her kiriş bir defa hafifletilir! Her adımda 2 çeşit köşeler kümesi olur: d[v]=δ (s, v) d[v]>δ (s, v)

14 Dijkstra Algoritması V – S kümesinde min-öncelikli kuyruk vardır
Q de kısa yolların değerleri d[u] ile değerlendirilir Her adımda d[u] değeri en küçük olan u  V – S, köşesi seçilir ve u dan çıkan tüm kirişlere Relax uygulanır

15 Dijkstra (G, w, s) Q=<y,t,x,z> S=<> Q=<s,t,x,z,y>
S=<s> Q=<y,t,x,z> 10 1 5 2 s t x y z 3 9 7 4 6 10 1 5 2 s t x y z 3 9 7 4 6 10 5

16 Örnek S=<s,y> Q=<z,t,x> S=<s,y,z> Q=<t,x> 10 
10 5 1 2 s t x y z 3 9 7 4 6 8 14 5 7 10 1 2 s t x y z 3 9 4 6 8 14 13 7 S=<s,y> Q=<z,t,x> S=<s,y,z> Q=<t,x>

17 Örnek S=<s,y,z,t,x> Q=<> S=<s,y,z,t> Q=<x> 8 9
8 9 5 7 10 1 2 s t x y z 3 4 6 8 13 5 7 10 1 2 s t x y z 3 9 4 6 9

18 Dijkstra (G, w, s) INITIALIZE-SINGLE-SOURCE(V, s) (V) S ←  Q ← V[G]
while Q   do u ← EXTRACT-MIN(Q) S ← S  {u} for each vertex v  Adj[u] do RELAX(u, v, w) Update Q (DECREASE_KEY) Running time: O(VlgV + ElgV) = O(ElgV) (V) O(V) build min-heap Executed O(V) times O(VlgV) O(lgV) O(E) times (total) O(ElgV) O(lgV)

19 Dijskstra Algoritmasının doğruluğu
İddia: Her u  V köşesi için bu köşe S e eklendiğinde d[u] = δ(s, u) olur. İspat: u bu koşulu sağlamayan ilk köşe olsun, yani u köşesi S e eklendiğinde d[u]  δ(s, u) olsun. p yolu s den u ya en kısa yol olsun:

20 Dijskstra Algoritmasının doğruluğu
d[u] için aşağıdaki doğrudur? d[u]≤d[v]+w(v,u)= δ(s,v)+w(v,u) d[u’] için aşağıdaki doğrudur? d[u’]≤d[v’]+w(v’,u’)= δ(s,v’)+w(v’,u’) u’ köşesi u ya giden en kısa yol üzerinde: d[u’]<δ(s,u) d[u’]<d[u] diğer taraftan: d[u]>δ(s,u) Çelişki! Öncelikli kuyruk Q: <u, …, u’, ….> (yani, d[u]<…<d[u’]<… )

21 Problem 1 Negatif ağırlıklı çizgeler için Dijkstra algoritmasının doğru çalışmadığını gösteren bir örnek yazınız. s u 1 1 w -1 1 1. iterasyon v d[s]=0 d[u]=1 d[v]=1 S={s} Q={u,v,w} 2. iterasyon 3. iterasyon 4. iterasyon d[w]=2 S={s,u} Q={v,w} d[u]=0 S={s,u,v} Q={w} S={s,u,v,w} Q={} d[w] doğru değil! u köşesi S e girdikten sonra d[u]=δ[s,u] olmalıdır!

22 Problem 2 G=(V,E) yönlü bir çizgesi ve bu çizgenin her (u,v) kirişine karşılık gelen r(u,v) sayısı veriliyor., Burada 0≤r(u,v) ≤1 dir ve r(u,v) sayısı u dan v ye olan iletişim kanalının güvenilirliğini göstermektedir. r(u,v) sayısını u dan v ye olan kanalın doğru çalışma olasılığı olarak da düşünebiliriz ve tüm kanalların olasılıklarının bağımsız olduğunu düşünüyoruz. 2 köşe arasındaki en güvenilir yolu bulunuz.

23 Problem 2 Çözüm1: Dijkstra algoritmasını modifiye ederiz
Relax işlemini değiştiririz: if d[v] < d[u] w(u,v) then d[v] = d[u] w(u,v) “EXTRACT_MIN” yerine “EXTRACT_MAX” kullanırız

24 Problem 2 Çözüm 2: Dijkstra algoritmasını değişiklik yapmadan uygularız! r(u,v)=(u,v) kanalının çalışma olasılığı olsun Olasılıklar bağımsız olsun, p=<v1,v2,…,vk> yolunun çalışma olasılığı: r(v1,v2)r(v2,v3) … r(vk-1,vk) Biz olasılığı en yüksek olan yolu arıyoruz,

25 Problem 2 Dijkstra algoritması ise min hesaplar Logaritma alalım

26 Problem 2 Minimum arama problemine dönüştürelim:
Şimdi Dijkstra algoritmasını alarak uygulayalım.


"Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar." indir ppt

Benzer bir sunumlar


Google Reklamları