Bölüm 4.2: En Kısa Yol Algoritmaları

Bölüm 4.2: En Kısa Yol Algoritmaları · Çalışma Soruları
GevşetmeDijkstraBellman-FordNegatif döngüFloyd-WarshallA* algoritmasıKarşılaştırma
Sercan KÜLCÜ

Çoktan Seçmeli · Temel Kavramlar

Soru 1: Gevşetme

d[u] = 6, d[v] = 10 ve w(u, v) = 3 iken RELAX(u, v, w) çağrılıyor. Sonra d[v] ve π[v] ne olur?

uv3d[u] = 6d[v] = 10

D: d[u] + w = 6 + 3 = 9 < 10 olduğu için tahmin iyileşir ve önceki düğüm u olur. B, π güncellemesini unutur; o zaman yol geri kurulamaz. C kenar ağırlığını uzaklık sanar. d[v] yalnızca azalabilir ve gerçek δ(s, v)'nin altına inmez.

Çoktan Seçmeli · Temel Kavramlar

Soru 2: Neden V − 1 Tur?

Bellman-Ford'un V − 1 tur yapması hangi özelliğe dayanır?

B: i. turun sonunda en fazla i kenarlı en kısa yolu olan her düğümün d değeri doğrudur; basit yol en fazla V − 1 kenarlı olduğundan V − 1 tur yeter. A, Dijkstra'nın düğüm kesinleştirme fikridir; Bellman-Ford düğüm seçmez. C yanlıştır: Bellman-Ford kenarları sıralamaz.

Çoktan Seçmeli · Temel Kavramlar

Soru 3: Ağırlıklara Sabit Eklemek

Çizgedeki her kenarın ağırlığına 2 eklenirse s'den t'ye en kısa yol ne olur?

sat113

B: Her yol, kenar sayısı × 2 kadar uzar. s → a → t (2 kenar) 2'den 6'ya, s → t (1 kenar) 3'ten 5'e çıkar. Çok kenarlı yollar daha fazla ceza aldığı için en kısa yol değişebilir. C, minimum kapsayan ağaç için doğrudur (her kapsayan ağaçta V − 1 kenar vardır, sıra korunur), en kısa yol için değil.

Çoktan Seçmeli · Temel Kavramlar

Soru 4: Negatif Döngü

Kaynaktan ulaşılabilen bir negatif döngü varsa aşağıdakilerden hangisi doğrudur?

A: Döngüde bir tur daha atmak yolu her seferinde kısaltır; döngüden geçerek ulaşılan her düğüm için de en küçük değer yoktur. Bellman-Ford V. turda hâlâ gevşeyen kenardan, Floyd-Warshall D[i][i] < 0'dan tespit eder. Dijkstra negatif kenarı zaten doğru işleyemez.

Adım Adım Çalıştırma · Dijkstra

Soru 5: Dijkstra (Dizi) İzleme

dijkstra(0) düğümleri hangi sırayla kesinleştirir? Son d ve onceki dizileri nedir?

0123454125831226d=0d=∞d=∞d=∞d=∞d=∞

Yönsüz ağırlıklı çizge, kaynak 0. d[0] = 0, diğerleri ∞; hiçbir düğüm kesinleşmedi.

0123454125831226d=0d=4d=1d=∞d=∞d=∞

En küçük d'li kesinleşmemiş düğüm 0 (d = 0) seçilir. Gevşetilen komşular: 1: ∞ → 4, 2: ∞ → 1.

0123454125831226d=0d=3d=1d=9d=13d=∞

En küçük d'li kesinleşmemiş düğüm 2 (d = 1) seçilir. Gevşetilen komşular: 1: 4 → 3, 3: ∞ → 9, 4: ∞ → 13.

0123454125831226d=0d=3d=1d=8d=13d=∞

En küçük d'li kesinleşmemiş düğüm 1 (d = 3) seçilir. Gevşetilen komşular: 3: 9 → 8.

0123454125831226d=0d=3d=1d=8d=11d=14

En küçük d'li kesinleşmemiş düğüm 3 (d = 8) seçilir. Gevşetilen komşular: 4: 13 → 11, 5: ∞ → 14.

0123454125831226d=0d=3d=1d=8d=11d=13

En küçük d'li kesinleşmemiş düğüm 4 (d = 11) seçilir. Gevşetilen komşular: 5: 14 → 13.

0123454125831226d=0d=3d=1d=8d=11d=13

En küçük d'li kesinleşmemiş düğüm 5 (d = 13) seçilir. Hiçbir komşu iyileşmez.

0123454125831226d=0d=3d=1d=8d=11d=13

Bitti. Seçilme sırası 0, 2, 1, 3, 4, 5. Yeşil kenarlar en kısa yol ağacıdır; örneğin 5'e yol 0 → 2 → 1 → 3 → 4 → 5 (13).

void dijkstra(int s) {
  Arrays.fill(d, SONSUZ); d[s] = 0;
  for (int i = 0; i < V; i++) {
    int u = -1;                 // en küçük d
    for (int v = 0; v < V; v++)
      if (!S[v] && (u == -1 || d[v] < d[u])) u = v;
    S[u] = true;                // kesinleşti
    for (Kenar k : komsu[u])
      if (!S[k.hedef] && d[u] + k.w < d[k.hedef]) {
        d[k.hedef] = d[u] + k.w;
        onceki[k.hedef] = u;
      }
  }
}

Çıktı Sorusu · Dijkstra

Soru 6: Dijkstra Tablosu

Kaynak A. Dijkstra düğümleri hangi sırayla kesinleştirir? Son d ve π değerleri nedir? A'dan F'ye en kısa yol hangisidir?

ABCDEF623279162
Cevabı göster

Kesinleşme sırası: A, C, B, D, E, F

düğümABCDEF
d0527810
π—CABDE

B önce A'dan 6 alır, C kesinleşince 2 + 3 = 5'e iner. D: 5 + 2 = 7 (C → D'nin 9'undan iyi); E: 7 + 1 = 8; F: E üzerinden 8 + 2 = 10 (D → F 13'ten iyi).

Yol: A → C → B → D → E → F = 10.

Çıktı Sorusu · Dijkstra

Soru 7: Yolu Geri Kurmak

Kaynak 4 için Dijkstra onceki = {3, 4, 0, 4, −1, 2} dizisini üretti (indis 0–5). yolYaz(onceki, 4, 1) ne yazdırır? Hedef 5 olsaydı ne yazdırırdı?

void yolYaz(int[] onceki, int kaynak, int hedef) {
  Deque<Integer> yigin = new ArrayDeque<>();
  for (int v = hedef; v != kaynak; v = onceki[v])
    yigin.push(v);
  yigin.push(kaynak);
  while (!yigin.isEmpty())
    System.out.print(yigin.pop() + " ");
}
Cevabı göster

Hedef 1: döngü 1'i iter; v = onceki[1] = 4 kaynak olduğundan döngü biter ve kaynak ayrıca itilir. Çıktı: 4 1.

Hedef 5: 5 → onceki 2 → onceki 0 → onceki 3 → onceki 4 (kaynak). Yığın ters çevirir: 4 3 0 2 5.

Yığın, hedeften kaynağa doğru toplanan düğümleri kaynaktan hedefe sırasına çevirir. Ulaşılamayan hedefte (onceki = −1) döngü kaynağa hiç ulaşmaz; önce kontrol gerekir.

Adım Adım Çalıştırma · Dijkstra

Soru 8: Öncelikli Kuyrukla Dijkstra

Kod ne yazdırır? Kuyruktaki eski kayıtlar ne zaman atlanır?

012346238282d=0d=∞d=∞d=∞d=∞pq(0,0)

Yönlü çizge, kaynak 0. Kuyrukta (düğüm, d) çiftleri d'ye göre sıralı tutulur; şekilde önde en küçük.

012346238282d=0d=6d=2d=∞d=∞pq(2,2)(1,6)

(0, 0) çekildi: 0 kesinleşir ve yazdırılır. Gevşeyenler 1: ∞ → 6, 2: ∞ → 2; yeni çiftler kuyruğa eklenir.

012346238282d=0d=5d=2d=10d=∞pq(1,5)(1,6)(3,10)

(2, 2) çekildi: 2 kesinleşir ve yazdırılır. Gevşeyenler 1: 6 → 5, 3: ∞ → 10; yeni çiftler kuyruğa eklenir.

012346238282d=0d=5d=2d=7d=13pq(1,6)(3,7)(3,10)(4,13)

(1, 5) çekildi: 1 kesinleşir ve yazdırılır. Gevşeyenler 3: 10 → 7, 4: ∞ → 13; yeni çiftler kuyruğa eklenir.

012346238282d=0d=5d=2d=7d=13pq(3,7)(3,10)(4,13)

(1, 6) çekildi ama 1 zaten kesin (d = 5): eski kayıt, continue ile atlanır.

012346238282d=0d=5d=2d=7d=9pq(4,9)(3,10)(4,13)

(3, 7) çekildi: 3 kesinleşir ve yazdırılır. Gevşeyenler 4: 13 → 9; yeni çiftler kuyruğa eklenir.

012346238282d=0d=5d=2d=7d=9pq(3,10)(4,13)

(4, 9) çekildi: 4 kesinleşir ve yazdırılır. Gevşeyen kenar yok.

012346238282d=0d=5d=2d=7d=9pq(4,13)

(3, 10) çekildi ama 3 zaten kesin (d = 7): eski kayıt, continue ile atlanır.

012346238282d=0d=5d=2d=7d=9pqboş

(4, 13) çekildi ama 4 zaten kesin (d = 9): eski kayıt, continue ile atlanır.

012346238282d=0d=5d=2d=7d=9pqboş

Kuyruk boş. Çıktı 0 2 1 3 4, d = [0, 5, 2, 7, 9]. Kuyruğa 8 kayıt girdi; 3 tanesi eski kayıttı (tembel silme).

d[s] = 0;
pq.add(new int[] { s, 0 });          // (düğüm, d)
while (!pq.isEmpty()) {
  int u = pq.poll()[0];             // en küçük d
  if (ziyaret[u]) continue;         // eski kayıt
  ziyaret[u] = true;
  System.out.print(u + " ");
  for (Kenar k : komsu[u])
    if (d[u] + k.w < d[k.hedef]) {
      d[k.hedef] = d[u] + k.w;
      pq.add(new int[] { k.hedef, d[k.hedef] });
    }
}

Çoktan Seçmeli · Dijkstra

Soru 9: Negatif Kenarda Dijkstra

Dijkstra (kesinleşmiş düğüme bir daha dokunmayan sürüm) S'den çalıştırılıyor. Bulduğu d[T] ve gerçek en kısa uzaklık nedir?

SABT323−4

C: S'den sonra en küçük d A'nındır (2), sonra T (3) kesinleşir. B (d = 5) en son işlendiğinde B → T kenarı 5 − 4 = 1 verir ama T zaten kesinleşmiştir. Gerçek yol S → A → B → T = 2 + 3 − 4 = 1. Dijkstra bir düğüme ilk kesinleştiğinde en kısa yolun bulunduğunu varsayar; negatif kenar bu varsayımı bozar.

Çoktan Seçmeli · Dijkstra

Soru 10: Dizi mi, Heap mi?

V = 1000 düğümlü yoğun bir çizgede E ≈ 500 000 kenar var. Dijkstra için dizi taraması (O(V²)) ve ikili heap (O((V + E) log V)) yaklaşık kaç işlem yapar, hangisi seçilmelidir?

A: V² = 10⁶; (V + E) log V ≈ 5 · 10⁵ · 10 = 5 · 10⁶. Yoğun çizgede (E ≈ V²) dizi sürümü daha iyidir; seyrek çizgede (E ≪ V²) heap kazanır. B, log V çarpanını unutur; C dizi sürümünü V³ sanar.

Çıktı Sorusu · Dijkstra

Soru 11: Kaynak Değişince

Sunumdaki Dijkstra Örnek 1 çizgesinde (yönsüz) kaynak 4 seçiliyor. Düğümler hangi sırayla kesinleşir, son uzaklıklar nedir?

1236457914101511296
Cevabı göster

Sıra: 4, 5, 3, 6, 2, 1 (eşitlikte küçük numara).

düğüm123456
d2015110613
π344—43

4'ün kenarları 5 (6), 3 (11), 2 (15). 5 kesinleşince 6: 6 + 9 = 15; 3 kesinleşince 6: 11 + 2 = 13'e iner, 1: 11 + 9 = 20. 2'ye doğrudan 15 en iyisidir (3 üzerinden 21); 1'e 2 üzerinden 22 > 20.

Çoktan Seçmeli · Dijkstra

Soru 12: Tembel Silme

Öncelikli kuyruklu Dijkstra'da bir düğümün d değeri azaldığında eski kaydı silinmeden yenisi eklenir (tembel silme). Bu sürüm için hangisi doğrudur?

B: Her başarılı gevşetme bir kayıt ekler; kaynak dahil en çok E + 1 kayıt. Aynı düğümün daha büyük d'li eski kaydı daha sonra çıkar ve if (ziyaret[u]) continue; onu atlar. Toplam O(E log E) = O(E log V). D'deki gibi tekrar işlemek gereksiz iş olurdu.

Klasik Soru · Dijkstra

Soru 13: En Kısa Yol Sayısı

Dijkstra'yı, her düğüme giden farklı en kısa yolların sayısını (sayi[v]) da hesaplayacak biçimde nasıl değiştirirsiniz? Kenarlar s → a (1), s → b (1), a → t (2), b → t (2), s → t (3) olan çizgede sayi[t] kaçtır?

sabt11223
Cevabı göster
sayi[kaynak] = 1
gevşetmede (u → v, w):
  eğer d[u] + w < d[v]:
    d[v] = d[u] + w; sayi[v] = sayi[u]
  değilse eğer d[u] + w == d[v]:
    sayi[v] += sayi[u]

Daha kısa yol bulunduğunda eski sayım geçersizdir (yeniden başlar); eşit uzunlukta bir yol bulunduğunda sayılar toplanır. u kesinleştiğinde sayi[u] kesindir, çünkü u'ya gelen tüm en kısa yollar daha küçük d'li düğümlerden gelir (ağırlıklar > 0).

Örnek: d[t] = 3 ve üç yol: s → t, s → a → t, s → b → t; sayi[t] = 3.

Klasik Soru · Dijkstra

Soru 14: Hedefte Durmak

Yalnızca s'den t'ye uzaklık isteniyor. Öncelikli kuyruklu Dijkstra'yı erken bitirmek için if (u == hedef) break; satırını nereye koyarsınız? t kuyruğa eklendiği anda durmak neden yanlıştır?

Cevabı göster

Satır, kuyruktan çekilen u kesinleştirildikten hemen sonra (eski kayıt kontrolünden sonra) yer almalıdır: t çekildiği anda d[t] kesindir.

Eklendiği anda d[t] yalnızca bir tahmindir. Örnek: s → t (10), s → a (1), a → t (1). s işlenince t, 10 ile kuyruğa girer; burada durulsa cevap 10 olur. Oysa a çekilince t 2'ye iner. Aynı kural A* için de geçerlidir: hedef açık listeden çıkarılınca durulur.

Erken durma en kötü durum karmaşıklığını değiştirmez ama hedef yakınsa çok iş kazandırır.

Adım Adım Çalıştırma · Bellman-Ford

Soru 15: Bellman-Ford İzleme

Kaynak 0 için Bellman-Ford hangi turda hangi kenarları gevşetir? Son d dizisi nedir?

01232−145d=0d=∞d=∞d=∞

Kaynak 0, V = 4. Kenar listesi bu sırayla incelenir: (2,3,2), (1,2,−1), (0,1,4), (0,2,5).

01232−145d=0d=4d=∞d=∞

Tur 1, kenar (0,1): 0 + (4) = 4 < ∞ → d[1] = 4.

01232−145d=0d=4d=5d=∞

Tur 1, kenar (0,2): 0 + (5) = 5 < ∞ → d[2] = 5.

01232−145d=0d=4d=5d=∞

Tur 1 bitti; değişmeyen kenarlar: (2,3), (1,2). Bir şey değişti, sonraki tura geçilir.

01232−145d=0d=4d=5d=7

Tur 2, kenar (2,3): 5 + (2) = 7 < ∞ → d[3] = 7.

01232−145d=0d=4d=3d=7

Tur 2, kenar (1,2): 4 + (−1) = 3 < 5 → d[2] = 3.

01232−145d=0d=4d=3d=7

Tur 2 bitti; değişmeyen kenarlar: (0,1), (0,2). Bir şey değişti, sonraki tura geçilir.

01232−145d=0d=4d=3d=5

Tur 3, kenar (2,3): 3 + (2) = 5 < 7 → d[3] = 5.

01232−145d=0d=4d=3d=5

Tur 3 bitti; değişmeyen kenarlar: (1,2), (0,1), (0,2). i = V − 1 = 3 son turdu.

01232−145d=0d=4d=3d=5

Denetim turu: hiçbir kenar gevşemez, istisna yok. Sonuç d = [0, 4, 3, 5]. (2,3) kenarı listenin başında olduğu için her turda bir öncekinin değerini kullandı: V − 1 turun hepsi gerekti.

for (int i = 1; i < V; i++) {
  boolean degisti = false;
  for (Kenar k : kenarlar)
    if (d[k.u] != SONSUZ && d[k.u] + k.w < d[k.v]) {
      d[k.v] = d[k.u] + k.w;
      degisti = true;
    }
  if (!degisti) break;              // erken durma
}
for (Kenar k : kenarlar)             // denetim
  if (d[k.u] != SONSUZ && d[k.u] + k.w < d[k.v])
    throw new IllegalStateException("Negatif döngü");

Çıktı Sorusu · Bellman-Ford

Soru 16: Tur Tur Bellman-Ford

Kaynak S. Kenarlar her turda şu sırayla incelenir: (C,D), (B,C), (A,B), (S,A), (S,B), (A,C). Her turun sonunda d dizisi (S, A, B, C, D) nedir? Kaç tur gerekir?

SABCD−32−1465
Cevabı göster
turSABCDgevşeme
10469∞3
2043863
3043552
4043521

Kenar sırası kötüdür: her tur, yolun yalnızca bir sonraki kenarını tamamlar (S → A → B → C → D). V − 1 = 4 turun hepsi gerekir; 4. turda D, 5'ten 2'ye iner. Kenarlar S'den başlayan sırayla incelenseydi tek tur yeterdi. Denetim turunda gevşeme yok → negatif döngü yok.

Çoktan Seçmeli · Bellman-Ford

Soru 17: Döngü Ağırlığı

Bir çizgede A → B (3), B → C (−5) ve C → A (w) kenarlarından oluşan bir döngü var ve A kaynaktan ulaşılabilir. w tam sayısının hangi değerleri için Bellman-Ford'un denetim turu negatif döngü bildirir?

C: Döngünün ağırlığı 3 − 5 + w = w − 2'dir; negatif olması için w − 2 < 0, yani w ≤ 1 (tam sayı). w = 2'de döngü ağırlığı 0 olur: döngüde dolaşmak yolu kısaltmaz, negatif döngü yoktur. D yalnızca B → C kenarını hesaba katar.

Çıktı Sorusu · Bellman-Ford

Soru 18: Negatif Döngü Denetimi

Kaynak 0, kenar sırası (0,1), (1,2), (2,3), (3,1). Bellman-Ford V − 1 = 3 turdan sonra hangi d dizisini bulur? Denetim turunda ilk hangi kenar gevşer?

012321−1−1
Cevabı göster
tur0123
10132
20021
30−110

1 → 2 → 3 → 1 döngüsünün ağırlığı 1 − 1 − 1 = −1: döngüdeki değerler her turda 1 azalır. Denetimde ilk kenar (0,1): d[0] + 2 = 2 > d[1] = −1, gevşemez; (1,2): −1 + 1 = 0 < d[2] = 1 → gevşer → IllegalStateException("Negatif döngü").

Bulunan d değerleri anlamsızdır: 1, 2, 3'ün en kısa yolu −∞'dur.

Çoktan Seçmeli · Bellman-Ford

Soru 19: Kenar Sırası ve Erken Durma

Erken durmalı Bellman-Ford (bir turda hiçbir d değişmezse döngüden çıkan sürüm) için hangisi doğrudur?

D: Negatif döngü yoksa son d değerleri sıradan bağımsızdır; iyi sıra (yolların kenar sırası) tek turda yakınsatabilir, ardından bir turda hiçbir şey değişmez: en iyi durum O(E) (iki tur). En kötü durum yine O(V · E)'dir. Negatif döngü varsa en kısa yol tanımsızdır.

Klasik Soru · Bellman-Ford

Soru 20: Yönsüz Negatif Kenar

Yönsüz bir çizgede yalnızca bir kenarın ağırlığı negatif (u–v, −2), diğerleri pozitif. Bellman-Ford bu çizgede ne bildirir? Neden? Bu çizgede en kısa yol problemini nasıl ele alırsınız?

suv4−2
Cevabı göster

Yönsüz kenar iki yönlü iki kenar olarak tutulur: u → v (−2) ve v → u (−2). Bu ikisi kendi başına u → v → u döngüsüdür; ağırlığı −4 < 0. u kaynaktan ulaşılabiliyorsa Bellman-Ford negatif döngü bildirir.

Bu yüzden yönsüz çizgede negatif kenar, basit yollar istenmedikçe en kısa yolu anlamsız yapar. Basit yol kısıtıyla en kısa yol bulmak ise genel durumda zordur (NP-zor); pratikte ya negatif kenardan kaçınılır ya da problem yönlü olarak modellenir.

Adım Adım Çalıştırma · Floyd-Warshall

Soru 21: Floyd-Warshall İzleme

Her k turunda hangi hücreler değişir? Son D matrisi nedir? (Vurgulu hücre: bu turda kısalan.)

0123003∞71802∞25∞0132∞∞0

Kenarlar: 0→1 (3), 0→3 (7), 1→0 (8), 1→2 (2), 2→0 (5), 2→3 (1), 3→0 (2). D başlangıçta kenar ağırlıkları, köşegen 0, kenar yoksa ∞.

0123003∞718021525801325∞0

k = 0 (ara düğüm 0; mavi çerçeveli satır ve sütun değişmez): D[1][3]: ∞ → 15 (8 + 7), D[2][1]: ∞ → 8 (5 + 3), D[3][1]: ∞ → 5 (2 + 3).

0123003571802152580132570

k = 1 (ara düğüm 1; mavi çerçeveli satır ve sütun değişmez): D[0][2]: ∞ → 5 (3 + 2), D[3][2]: ∞ → 7 (5 + 2).

012300356170232580132570

k = 2 (ara düğüm 2; mavi çerçeveli satır ve sütun değişmez): D[0][3]: 7 → 6 (5 + 1), D[1][0]: 8 → 7 (2 + 5), D[1][3]: 15 → 3 (2 + 1).

012300356150232360132570

k = 3 (ara düğüm 3; mavi çerçeveli satır ve sütun değişmez): D[1][0]: 7 → 5 (3 + 2), D[2][0]: 5 → 3 (1 + 2), D[2][1]: 8 → 6 (1 + 5).

012300356150232360132570

Köşegende negatif değer yok → negatif döngü yok. Son D tüm çiftler arası en kısa uzaklıklardır; örneğin D[1][0] = 5 (1 → 2 → 3 → 0).

for (int k = 0; k < V; k++)        // ara düğüm
  for (int i = 0; i < V; i++)
    for (int j = 0; j < V; j++)
      if (d[i][k] != SONSUZ && d[k][j] != SONSUZ
          && d[i][k] + d[k][j] < d[i][j])
        d[i][j] = d[i][k] + d[k][j];
for (int i = 0; i < V; i++)
  if (d[i][i] < 0)
    throw new IllegalStateException("Negatif döngü");

Çıktı Sorusu · Floyd-Warshall

Soru 22: Negatif Kenarla Floyd-Warshall

Floyd-Warshall bu çizgede çalıştırılıyor. Son D matrisi nedir? Negatif döngü var mı? 0'dan 3'e en kısa yol hangisidir?

012346−3245
Cevabı göster
0123
00413
1∞0−3−1
2∞602
3∞410

Köşegen tümüyle 0 → negatif döngü yok (1 → 2 → 3 → 1 = −3 + 2 + 4 = 3 > 0). 0. sütun ∞: 0'a gelen kenar yoktur.

0 ⇝ 3: Π[0][3] = 2, Π[0][2] = 1, Π[0][1] = 0 → 0 → 1 → 2 → 3 = 4 − 3 + 2 = 3. Negatif kenar sayesinde 0 → 2 (6) yerine 0 → 1 → 2 (1) kullanılır.

Çoktan Seçmeli · Floyd-Warshall

Soru 23: Döngü Sırası

Floyd-Warshall kodunda döngüler for i … for j … for k … sırasına (k en içte) getirilirse ne olur?

B: Hücreler henüz kısalmamış D[i][k] ve D[k][j] değerlerine dayanır. Bağıntı D⁽ᵏ⁾'yi D⁽ᵏ⁻¹⁾'den kurar: k. tur başladığında tüm çiftler {0, …, k − 1} ara düğümleriyle hesaplanmış olmalıdır. k içteyken (i, j) hücresi bir kez, diğer hücreler hazır olmadan hesaplanır; birçok ara düğümlü yolları kaçırır. Döngü sayısı değişmez, zaman yine Θ(V³).

Çıktı Sorusu · Floyd-Warshall

Soru 24: Π ile Yol Okumak

Floyd-Warshall izleme sorusundaki çizgenin son Π satırı, kaynak 1 için şudur (Π[1][j]: 1'den j'ye yolda j'den önceki düğüm): Π[1][0] = 3, Π[1][2] = 1, Π[1][3] = 2. 1'den 0'a yol hangisidir ve uzunluğu kaçtır?

012300356150232360132570
Cevabı göster

Hedeften geriye: Π[1][0] = 3 → Π[1][3] = 2 → Π[1][2] = 1 (kaynak). Ters çevrilince 1 → 2 → 3 → 0, uzunluk 2 + 1 + 2 = 5 = D[1][0].

Doğrudan 1 → 0 kenarı 8'dir; k = 3 turunda (ara düğüm 3) 5'e iner. Kodda güncelleme onceki[i][j] = onceki[k][j] ile yapılır: yeni yolda j'den önceki düğüm, k ⇝ j yolundakiyle aynıdır.

Çoktan Seçmeli · Floyd-Warshall

Soru 25: Köşegen Denetimi

Floyd-Warshall bitince D[2][2] = −3 çıkıyor. Bu ne anlama gelir?

A: Köşegen başta 0'dır ve yalnızca 2 ⇝ 2 kapalı yolu daha kısa çıkarsa azalır; negatif değer, 2'den geçen negatif ağırlıklı bir döngü demektir. O durumda bu döngüden ulaşılan çiftlerin değerleri anlamsızdır; kod IllegalStateException fırlatır.

Adım Adım Çalıştırma · A* Algoritması

Soru 26: A* İzleme

A* hangi düğümleri hangi sırayla genişletir? Bulunan yol ve maliyeti nedir?

sabct234173h=6, g=0h=4h=3h=2h=0

s'den t'ye; düğüm yanında h (hedefe tahmin) ve g (bulunan maliyet). h kabul edilebilir ve tutarlıdır; f eşitse alfabetik ilk seçilir.

sabct234173h=6, g=0h=4, g=2h=3, g=3h=2h=0

En küçük f = 6 olan s genişletilir. Açılan/güncellenen: a: g = 2, f = 6; b: g = 3, f = 6.

sabct234173h=6, g=0h=4, g=2h=3, g=3h=2, g=6h=0, g=9

En küçük f = 6 olan a genişletilir. Açılan/güncellenen: c: g = 6, f = 8; t: g = 9, f = 9.

sabct234173h=6, g=0h=4, g=2h=3, g=3h=2, g=4h=0, g=9

En küçük f = 6 olan b genişletilir. Açılan/güncellenen: c: g = 4, f = 6.

sabct234173h=6, g=0h=4, g=2h=3, g=3h=2, g=4h=0, g=7

En küçük f = 6 olan c genişletilir. Açılan/güncellenen: t: g = 7, f = 7.

sabct234173h=6, g=0h=4, g=2h=3, g=3h=2, g=4h=0, g=7

En küçük f: t (7). Hedef açık listeden çıkarıldı: dur. Yol (onceki ile) s → b → c → t, maliyet 7. a üzerinden açılan pahalı yollar (c: 6, t: 9) b ve c genişletilince düzeltildi.

g[s] = 0; acik.add(s);
while (!acik.isEmpty()) {
  int u = enKucukF(acik);           // f = g + h
  acik.remove(u); kapali.add(u);
  if (u == hedef) break;
  for (Kenar k : komsu[u]) {
    int yeni = g[u] + k.w;
    if (!kapali.contains(k.hedef)
        && yeni < g[k.hedef]) {
      g[k.hedef] = yeni; onceki[k.hedef] = u;
      acik.add(k.hedef);
    }
  }
}

Çoktan Seçmeli · A* Algoritması

Soru 27: Sıradaki Genişletme

A*'ın açık listesinde şu düğümler var (g, h): p (4, 7), q (6, 3), r (2, 10), u (8, 2). Hangisi genişletilir?

C: f(p) = 11, f(q) = 9, f(r) = 12, f(u) = 10. A* yalnızca g'ye bakarsa Dijkstra (A), yalnızca h'ye bakarsa açgözlü en iyi ilk arama (B) gibi davranır; seçim ölçütü toplam f'dir.

Çoktan Seçmeli · A* Algoritması

Soru 28: Kabul Edilebilir Sezgisel

Izgarada yol aranıyor; her adımın maliyeti 1'dir. Hangisi doğrudur?

D: 4 yönde her adım |Δx| + |Δy|'yi en çok 1 azaltır, bu yüzden h ≤ h*. 8 yönde çapraz adım 2 azaltır ama maliyeti 1'dir: h gerçek kalanı aşar. A yanlıştır: Manhattan, Öklid'den büyük ya da eşittir. h = 0 kabul edilebilirdir (A* = Dijkstra). Fazla tahmin eden h en kısa yolu kaçırabilir.

Çıktı Sorusu · A* Algoritması

Soru 29: Açgözlü Arama ve A*

s'den t'ye; düğüm yanında h değeri. (a) Açık listeden yalnızca h'si en küçük olanı seçen açgözlü en iyi ilk arama hangi yolu bulur, maliyeti nedir? (b) A* (f = g + h) hangi yolu bulur?

sabct19222h=5h=1h=4h=2h=0
Cevabı göster

(a) Açgözlü: s'den sonra a (h = 1) b'den (h = 4) daha cazip görünür; a'dan t açılır (h = 0) ve hemen seçilir. Yol s → a → t, maliyet 10.

(b) A*: f(a) = 1 + 1 = 2, f(b) = 2 + 4 = 6. a genişletilince t, g = 10, f = 10 ile açılır. Sonra b (6), c (f = 4 + 2 = 6) genişletilir; c'den t'nin g'si 6'ya iner. t (f = 6) çıkarılır: yol s → b → c → t, maliyet 6.

h kabul edilebilir olduğu için A* en kısa yolu bulur; açgözlü arama hızlıdır ama g'yi yok saydığı için pahalı yolu seçebilir.

Çoktan Seçmeli · Karşılaştırma

Soru 30: Algoritma Seçimi

Aşağıdaki eşleştirmelerden hangisi yanlıştır?

B yanlıştır: negatif kenar varken Dijkstra kesinleşmiş bir düğüme sonradan daha kısa yol açılabileceği için yanılır; Bellman-Ford (O(V · E)) kullanılmalıdır. V = 1000, E = 5000 negatif kenarlı bir çizgede bu yaklaşık 5 · 10⁶ gevşetme denemesidir.

Son

Bölüm 4.2: En Kısa Yol Algoritmaları: Çalışma Soruları
Konu anlatımı: En kısa yol sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.