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 00 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ığı 00, diğer tüm düğümlerin uzaklığı ise \infty olur.

Sonra şu döngü tekrarlanır:

  1. Kesinleşmemiş düğümler arasından geçici uzaklığı en küçük olanı seçin.

  2. O düğüm üzerinden her komşuyu kontrol edin.

  3. Yeni rota daha ucuzsa komşunun uzaklığını güncelleyin.

  4. Geçerli düğümü kesinleşmiş olarak işaretleyin.

  5. 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:

  1. Bir başlangıç düğümü seçin.
  2. Onun uzaklığını 00, diğer tüm uzaklıkları \infty yapın.
  3. Kesinleşmemiş düğümler arasından geçici uzaklığı en küçük olanı seçin.
  4. O düğümün giden kenarlarını gevşetin.
  5. O düğümü kesinleşmiş olarak işaretleyin.
  6. 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:

  • AB=4A \to B = 4
  • AC=1A \to C = 1
  • CB=2C \to B = 2
  • BD=1B \to D = 1
  • CD=5C \to D = 5

AA düğümünden DD düğümüne en kısa yolu bulmak istiyoruz.

Başlangıç durumu:

dist(A)=0,dist(B)=,dist(C)=,dist(D)=\text{dist}(A)=0,\quad \text{dist}(B)=\infty,\quad \text{dist}(C)=\infty,\quad \text{dist}(D)=\infty

Önce AA düğümünü kesinleştirin ve kenarlarını gevşetin:

dist(B)=4,dist(C)=1\text{dist}(B)=4,\quad \text{dist}(C)=1

Şimdi kesinleşmemiş en küçük uzaklık CC düğümündedir, bu yüzden sıradaki düğüm CC olur.

CC üzerinden gidersek:

  • CC üzerinden BB'ye giden yolun maliyeti 1+2=31+2=3 olur. Bu, 44 değerinden daha iyidir; dolayısıyla dist(B)=3\text{dist}(B)=3 olarak güncellenir.
  • CC üzerinden DD'ye giden yolun maliyeti 1+5=61+5=6 olur; bu yüzden dist(D)=6\text{dist}(D)=6 yapılır.

Şimdi kesinleşmemiş en küçük uzaklık BB düğümündedir, bu yüzden BB düğümünü kesinleştirin.

BB üzerinden DD'ye giden yolun maliyeti:

3+1=43+1=4

Bu, 66 değerinden daha iyidir; dolayısıyla dist(D)\text{dist}(D) değeri 66'dan 44'e güncellenir.

Artık kesinleşmemiş en küçük düğüm DD'dir. Onu kesinleştirin ve durun.

En kısa yol şudur:

ACBDA \to C \to B \to D

toplam maliyet ise:

1+2+1=41+2+1=4

Bu örnek temel deseni gösterir: İlk bakışta daha kötü görünen bir rota, yani ABA \to B, daha sonra CC üzerinden daha iyi hale geldi. Dijkstra algoritması, BB 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ığı dd olsun. Daha sonra bu düğüme bulunan herhangi bir yeni yol, geçici uzaklığı en az dd olan başka bir kesinleşmemiş düğümden gelmek ve ardından ağırlığı en az 00 olan bir kenar eklemek zorundadır.

Bu yüzden o sonradan bulunan rota, dd 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ç →