Bölüm 4.2: En Kısa Yol Algoritmaları
Ç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?
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?
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?
Yönsüz ağırlıklı çizge, kaynak 0. d[0] = 0, diğerleri ∞; hiçbir düğüm kesinleşmedi.
En küçük d'li kesinleşmemiş düğüm 0 (d = 0) seçilir. Gevşetilen komşular: 1: ∞ → 4, 2: ∞ → 1.
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.
En küçük d'li kesinleşmemiş düğüm 1 (d = 3) seçilir. Gevşetilen komşular: 3: 9 → 8.
En küçük d'li kesinleşmemiş düğüm 3 (d = 8) seçilir. Gevşetilen komşular: 4: 13 → 11, 5: ∞ → 14.
En küçük d'li kesinleşmemiş düğüm 4 (d = 11) seçilir. Gevşetilen komşular: 5: 14 → 13.
En küçük d'li kesinleşmemiş düğüm 5 (d = 13) seçilir. Hiçbir komşu iyileşmez.
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?
Cevabı göster
Kesinleşme sırası: A, C, B, D, E, F
| düğüm | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| d | 0 | 5 | 2 | 7 | 8 | 10 |
| π | — | C | A | B | D | E |
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?
Yönlü çizge, kaynak 0. Kuyrukta (düğüm, d) çiftleri d'ye göre sıralı tutulur; şekilde önde en küçük.
(0, 0) çekildi: 0 kesinleşir ve yazdırılır. Gevşeyenler 1: ∞ → 6, 2: ∞ → 2; yeni çiftler kuyruğa eklenir.
(2, 2) çekildi: 2 kesinleşir ve yazdırılır. Gevşeyenler 1: 6 → 5, 3: ∞ → 10; yeni çiftler kuyruğa eklenir.
(1, 5) çekildi: 1 kesinleşir ve yazdırılır. Gevşeyenler 3: 10 → 7, 4: ∞ → 13; yeni çiftler kuyruğa eklenir.
(1, 6) çekildi ama 1 zaten kesin (d = 5): eski kayıt, continue ile atlanır.
(3, 7) çekildi: 3 kesinleşir ve yazdırılır. Gevşeyenler 4: 13 → 9; yeni çiftler kuyruğa eklenir.
(4, 9) çekildi: 4 kesinleşir ve yazdırılır. Gevşeyen kenar yok.
(3, 10) çekildi ama 3 zaten kesin (d = 7): eski kayıt, continue ile atlanır.
(4, 13) çekildi ama 4 zaten kesin (d = 9): eski kayıt, continue ile atlanır.
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?
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?
Cevabı göster
Sıra: 4, 5, 3, 6, 2, 1 (eşitlikte küçük numara).
| düğüm | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| d | 20 | 15 | 11 | 0 | 6 | 13 |
| π | 3 | 4 | 4 | — | 4 | 3 |
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?
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?
Kaynak 0, V = 4. Kenar listesi bu sırayla incelenir: (2,3,2), (1,2,−1), (0,1,4), (0,2,5).
Tur 1, kenar (0,1): 0 + (4) = 4 < ∞ → d[1] = 4.
Tur 1, kenar (0,2): 0 + (5) = 5 < ∞ → d[2] = 5.
Tur 1 bitti; değişmeyen kenarlar: (2,3), (1,2). Bir şey değişti, sonraki tura geçilir.
Tur 2, kenar (2,3): 5 + (2) = 7 < ∞ → d[3] = 7.
Tur 2, kenar (1,2): 4 + (−1) = 3 < 5 → d[2] = 3.
Tur 2 bitti; değişmeyen kenarlar: (0,1), (0,2). Bir şey değişti, sonraki tura geçilir.
Tur 3, kenar (2,3): 3 + (2) = 5 < 7 → d[3] = 5.
Tur 3 bitti; değişmeyen kenarlar: (1,2), (0,1), (0,2). i = V − 1 = 3 son turdu.
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?
Cevabı göster
| tur | S | A | B | C | D | gevşeme |
|---|---|---|---|---|---|---|
| 1 | 0 | 4 | 6 | 9 | ∞ | 3 |
| 2 | 0 | 4 | 3 | 8 | 6 | 3 |
| 3 | 0 | 4 | 3 | 5 | 5 | 2 |
| 4 | 0 | 4 | 3 | 5 | 2 | 1 |
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?
Cevabı göster
| tur | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 1 | 0 | 1 | 3 | 2 |
| 2 | 0 | 0 | 2 | 1 |
| 3 | 0 | −1 | 1 | 0 |
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?
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.)
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 ∞.
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).
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).
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).
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).
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?
Cevabı göster
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 0 | 4 | 1 | 3 |
| 1 | ∞ | 0 | −3 | −1 |
| 2 | ∞ | 6 | 0 | 2 |
| 3 | ∞ | 4 | 1 | 0 |
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?
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?
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.
En küçük f = 6 olan s genişletilir. Açılan/güncellenen: a: g = 2, f = 6; b: g = 3, f = 6.
En küçük f = 6 olan a genişletilir. Açılan/güncellenen: c: g = 6, f = 8; t: g = 9, f = 9.
En küçük f = 6 olan b genişletilir. Açılan/güncellenen: c: g = 4, f = 6.
En küçük f = 6 olan c genişletilir. Açılan/güncellenen: t: g = 7, f = 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?
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.