Dijkstra algoritması, ağırlıklı bir grafikte tek bir başlangıç düğümünden en kısa yolları bulur; bunun için tüm kenar ağırlıklarının negatif olmaması gerekir. Yalnızca tek bir hedefle ilgileniyorsanız, o hedef düğüm kesinleşir kesinleşmez durabilirsiniz.
Temel fikir açgözlüdür: her zaman, henüz kesinleşmemiş düğümler arasından bilinen uzaklığı en küçük olan düğümden devam edilir. Bu yaklaşım yalnızca negatif olmayan ağırlık koşulu altında çalışır.
Dijkstra Algoritması Ne İşe Yarar
Kenarlar üzerinde maliyetler bulunan bir grafikte en ucuz rotayı bulmak istediğinizde Dijkstra algoritmasını kullanın. Bu maliyet; mesafe, seyahat süresi, enerji ya da en aza indirmek istediğiniz başka bir büyüklüğü temsil edebilir.
Yönlü veya yönsüz graflarda çalışır. Temel koşul açıktır: her kenar ağırlığı en az olmalıdır.
Algoritma Nasıl Çalışır
Her düğüm, başlangıç düğümünden olan geçici bir uzaklık değeri tutar. Başlangıçta, başlangıç düğümünün uzaklığı , diğer tüm düğümlerin uzaklığı ise olur.
Sonra şu döngü tekrarlanır:
-
Kesinleşmemiş düğümler arasından geçici uzaklığı en küçük olanı seçin.
-
O düğüm üzerinden her komşuyu kontrol edin.
-
Yeni rota daha ucuzsa komşunun uzaklığını güncelleyin.
-
Geçerli düğümü kesinleşmiş olarak işaretleyin.
-
adıma gevşetme denir. Bir düğüm kesinleştiğinde işi bitmiştir: grafikte negatif kenar ağırlığı yoksa, en kısa uzaklığı artık kesindir.
Dijkstra Algoritması Adım Adım
İşte tüm prosedürün kısa hali:
- Bir başlangıç düğümü seçin.
- Onun uzaklığını , diğer tüm uzaklıkları yapın.
- Kesinleşmemiş düğümler arasından geçici uzaklığı en küçük olanı seçin.
- O düğümün giden kenarlarını gevşetin.
- O düğümü kesinleşmiş olarak işaretleyin.
- Erişilebilen tüm düğümler kesinleşene kadar tekrarlayın ya da hedef düğümünüz kesinleştiğinde durun.
Her güncellemeye hangi önceki düğümün neden olduğunu da saklarsanız, yalnızca son uzaklığı değil, gerçek yolu da geri elde edebilirsiniz.
Çözümlü En Kısa Yol Örneği
Grafikte şu kenar ağırlıkları olduğunu varsayalım:
düğümünden düğümüne en kısa yolu bulmak istiyoruz.
Başlangıç durumu:
Önce düğümünü kesinleştirin ve kenarlarını gevşetin:
Şimdi kesinleşmemiş en küçük uzaklık düğümündedir, bu yüzden sıradaki düğüm olur.
üzerinden gidersek:
- üzerinden 'ye giden yolun maliyeti olur. Bu, değerinden daha iyidir; dolayısıyla olarak güncellenir.
- üzerinden 'ye giden yolun maliyeti olur; bu yüzden yapılır.
Şimdi kesinleşmemiş en küçük uzaklık düğümündedir, bu yüzden düğümünü kesinleştirin.
üzerinden 'ye giden yolun maliyeti:
Bu, değerinden daha iyidir; dolayısıyla değeri 'dan 'e güncellenir.
Artık kesinleşmemiş en küçük düğüm 'dir. Onu kesinleştirin ve durun.
En kısa yol şudur:
toplam maliyet ise:
Bu örnek temel deseni gösterir: İlk bakışta daha kötü görünen bir rota, yani , daha sonra üzerinden daha iyi hale geldi. Dijkstra algoritması, henüz kesinleşmemişken buna izin verir. Bir düğüm kesinleştikten sonra uzaklığı artık değişmez.
Negatif Olmayan Ağırlıklar Neden Önemlidir
Diyelim ki şu anda en ucuz kesinleşmemiş düğümün uzaklığı olsun. Daha sonra bu düğüme bulunan herhangi bir yeni yol, geçici uzaklığı en az olan başka bir kesinleşmemiş düğümden gelmek ve ardından ağırlığı en az olan bir kenar eklemek zorundadır.
Bu yüzden o sonradan bulunan rota, değerinden daha iyi olamaz. Tüm ağırlıklar negatif değilse, en küçük geçici uzaklığı kesinleştirmenin güvenli olmasının nedeni budur.
Eğer negatif bir kenar varsa bu gerekçe bozulur. Şu anda pahalı görünen bir yol daha sonra ucuzlayabilir; bu da bir düğümü çok erken kesinleştirmenin yanlış sonuca yol açabileceği anlamına gelir.
Dijkstra Algoritmasında Yaygın Hatalar
Negatif kenarla kullanmak
Tek bir negatif kenar bile açgözlü mantığı bozabilir. Negatif ağırlıklar mümkünse, farklı bir en kısa yol yöntemi kullanın.
"Görüldü" ile "bitti"yi aynı sanmak
Bir düğümün geçici bir uzaklığı zaten olabilir ama yine de işi bitmemiş olabilir. Yalnızca kesinleşmiş bir düğümün en kısa uzaklığı nihaidir.
Önceki düğüm tablosunu unutmak
Uzaklıklar size maliyeti söyler. Rotanın kendisini de istiyorsanız, her uzaklığı en son hangi düğümün iyileştirdiğini saklayın.
Dijkstra Algoritması Nerelerde Kullanılır
Dijkstra algoritması, bir problemin negatif olmayan maliyetlere sahip bir grafikte hareket etme olarak modellenebildiği durumlarda kullanılır:
- Haritalarda rota planlama
- Ağ yönlendirme
- Ağırlıklı ızgaralarda robot hareketi
- Hareket maliyetlerinin değiştiği oyunlarda yol bulma
Ayrıca, doğruluğu kesin bir koşula bağlı olan açgözlü algoritmalara verilen standart örneklerden biridir.
Benzer Bir Problem Deneyin
Beş düğümlü ve pozitif kenar ağırlıklı bir grafik çizin, sonra bir uzaklık tablosu ile Dijkstra algoritmasını elle uygulayın. İyi bir sonraki adım istiyorsanız, yeni bir grafikte kendi örneğinizi deneyin ve her düğümün tam olarak ne zaman güvenle kesinleştirilebildiğini kontrol edin.
Bir soruyla yardıma mı ihtiyacın var?
Sorunuzu yükleyin ve saniyeler içinde doğrulanmış adım adım çözüm alın.
GPAI Solver Aç →