Algoritma Dijkstra mencari jalur terpendek dari satu simpul awal dalam graf berbobot, selama setiap bobot sisi bernilai nonnegatif. Jika Anda hanya peduli pada satu tujuan, Anda bisa berhenti begitu tujuan itu diselesaikan.
Langkah intinya bersifat greedy: selalu lanjut dari simpul yang belum diselesaikan dengan jarak diketahui paling kecil. Ini hanya bekerja dalam kondisi bobot nonnegatif.
Apa yang Diselesaikan oleh Algoritma Dijkstra
Gunakan algoritma Dijkstra ketika Anda memiliki graf dengan biaya pada sisi-sisinya dan ingin mencari rute termurah. Biaya itu bisa merepresentasikan jarak, waktu tempuh, energi, atau besaran lain yang ingin Anda minimalkan.
Algoritma ini bekerja pada graf berarah maupun tak berarah. Syarat utamanya jelas: setiap bobot sisi harus setidaknya .
Cara Kerja Algoritma
Setiap simpul menyimpan jarak tentatif dari simpul awal. Pada awalnya, simpul awal memiliki jarak dan setiap simpul lain memiliki jarak .
Lalu ulangi loop ini:
- Pilih simpul yang belum diselesaikan dengan jarak tentatif paling kecil.
- Periksa setiap tetangga melalui simpul itu.
- Jika rute baru lebih murah, perbarui jarak tetangga tersebut.
- Tandai simpul saat ini sebagai selesai.
Langkah 3 disebut relaksasi. Simpul yang sudah diselesaikan berarti selesai: jarak terpendeknya sudah final, asalkan graf tidak memiliki bobot sisi negatif.
Algoritma Dijkstra Langkah demi Langkah
Berikut prosedur lengkapnya dalam bentuk ringkas:
- Pilih simpul awal.
- Tetapkan jaraknya menjadi dan setiap jarak lain menjadi .
- Pilih simpul yang belum diselesaikan dengan jarak tentatif paling kecil.
- Lakukan relaksasi pada sisi keluar dari simpul itu.
- Tandai simpul itu sebagai selesai.
- Ulangi sampai semua simpul yang dapat dijangkau selesai, atau berhenti setelah simpul target Anda diselesaikan.
Jika Anda juga menyimpan simpul sebelumnya yang menyebabkan setiap pembaruan, Anda bisa mendapatkan kembali jalur sebenarnya, bukan hanya jarak akhirnya.
Contoh Jalur Terpendek yang Dikerjakan
Misalkan graf memiliki bobot sisi berikut:
Kita ingin mencari jalur terpendek dari ke .
Mulai dengan:
Selesaikan terlebih dahulu dan lakukan relaksasi pada sisi-sisinya:
Jarak terkecil yang belum diselesaikan sekarang ada pada , jadi selesaikan berikutnya.
Jika melalui :
- Melalui , jalur ke berbiaya , yang lebih baik daripada , jadi perbarui .
- Melalui , jalur ke berbiaya , jadi tetapkan .
Sekarang memiliki jarak terkecil yang belum diselesaikan, jadi selesaikan .
Jika melalui , biaya jalur ke adalah:
Itu lebih baik daripada , jadi perbarui dari menjadi .
Sekarang adalah simpul terkecil yang belum diselesaikan. Selesaikan simpul itu, lalu berhenti.
Jalur terpendeknya adalah:
dengan total biaya:
Contoh ini menunjukkan pola pentingnya: rute yang awalnya tampak lebih buruk, , kemudian menjadi lebih baik melalui . Algoritma Dijkstra mengizinkan hal itu selama masih belum diselesaikan. Setelah sebuah simpul diselesaikan, jaraknya tidak akan berubah.
Mengapa Bobot Nonnegatif Penting
Misalkan simpul termurah saat ini yang belum diselesaikan memiliki jarak . Setiap jalur baru ke simpul itu yang ditemukan nanti harus datang dari simpul lain yang belum diselesaikan dengan jarak tentatif setidaknya , lalu menambahkan sisi dengan bobot setidaknya .
Jadi rute yang ditemukan belakangan itu tidak mungkin mengalahkan . Itulah sebabnya menyelesaikan jarak tentatif terkecil aman ketika semua bobot bernilai nonnegatif.
Jika ada sisi negatif, argumen itu runtuh. Jalur yang sekarang tampak mahal bisa menjadi lebih murah nanti, yang berarti menyelesaikan simpul terlalu cepat dapat memberi jawaban yang salah.
Kesalahan Umum dalam Algoritma Dijkstra
Menggunakannya pada sisi negatif
Bahkan satu sisi negatif saja bisa merusak logika greedy. Jika bobot negatif mungkin muncul, gunakan metode jalur terpendek yang lain.
Menganggap "sudah terlihat" sebagai "sudah selesai"
Sebuah simpul bisa saja sudah memiliki jarak tentatif tetapi masih belum selesai. Hanya simpul yang sudah diselesaikan yang memiliki jarak terpendek final.
Lupa tabel simpul sebelumnya
Jarak memberi tahu biayanya. Jika Anda juga ingin rutenya, simpan simpul mana yang terakhir kali memperbaiki setiap jarak.
Di Mana Algoritma Dijkstra Digunakan
Algoritma Dijkstra digunakan ketika suatu masalah dapat dimodelkan sebagai pergerakan melalui graf dengan biaya nonnegatif:
- Perencanaan rute pada peta
- Routing jaringan
- Pergerakan robot pada grid berbobot
- Pathfinding dalam game ketika biaya gerak bervariasi
Algoritma ini juga merupakan contoh standar dari algoritma greedy yang kebenarannya bergantung pada syarat yang tepat.
Coba Soal Serupa
Gambarlah sebuah graf dengan lima simpul dan bobot sisi positif, lalu jalankan algoritma Dijkstra secara manual dengan tabel jarak. Jika Anda ingin langkah berikutnya yang bagus, coba versi Anda sendiri pada graf baru dan periksa tepat kapan setiap simpul menjadi aman untuk diselesaikan.
Butuh bantuan mengerjakan soal?
Unggah pertanyaanmu dan dapatkan solusi terverifikasi langkah demi langkah dalam hitungan detik.
Buka GPAI Solver →