dijkstra algoritm animation

Graf merupakan suatu cabang ilmu yang memiliki banyak terapan. Banyak sekali struktur yang bisa direpresentasikan dengan graf, dan banyak masalah yang bisa diselesaikan dengan bantuan graf. Seringkali graf digunakan untuk merepresentasikan suaru jaringan. Misalkan jaringan jalan raya dimodelkan graf dengan kota sebagai simpul (vertex/node) dan jalan yang menghubungkan setiap kotanya sebagai sisi (edge) yang bobotnya (weight) adalah panjang dari jalan tersebut.

Dalam beberapa model persoalan dimungkinkan bahwa bobot dari suatu sisi bernilai negatif. Misalkan simpul merepesentasikan bandara, sisi mereprentasikan penerbangan yang memungkinkan, dan bobot dari setiap sisi adalah biaya yang dikeluarkan dalam penerbangan tersebut. Untuk suatu kasus dimana seseorang akan dibayar untuk menempuh rute tertentu oleh suatu biro penerbangan, maka bobotnya akan bernilai negatif.

Lintasan terpendek merupakan salah satu dari masalah yang dapat diselesaikan dengan graf. Jika diberikan sebuah graf berbobot, masalah lintasan terpendek adalah bagaimana kita mencari sebuah jalur pada graf yang meminimalkan jumlah bobot sisi pembentuk jalur tersebut.
Terdapat beberapa macam persoalan lintasan terpendek antara lain:

  • Lintasan terpendek antara dua buah simpul tertentu (a pair shortets path).
  • Lintasan terpendek antara semua pasangan simpul (all pairs shortest path).
  • Lintasan terpendek dari simpul tertentu ke semua simpul yang lain (single-source shoertest path).
  • Lintasan terpendek antara dua buah simpul yang melalui beberapa simpul tertentu (intermediate shortest path).

Algoritma Dijkstra, dinamai menurut penemunya, Edsger Dijkstra, adalah algoritma dengan prinsip greedy yang memecahkan masalah lintasan terpendek untuk sebuah graf berarah dengan bobot sisi yang tidak negatif.

Algoritma Dijkstra merupakan salah satu varian bentuk algoritma populer dalam pemecahan persoalan yang terkait dengan masalah optimasi. Sifatnya sederhana dan lempang (straightforward). Sesuai dengan arti greedy yang secara harafiah berarti tamak atau rakus - namun tidak dalam konteks negatif -, algoritma greedy ini hanya memikirkan solusi terbaik yang akan diambil pada setiap langkah tanpa memikirkan konsekuensi ke depan. Prinsipnya, ambillah apa yang bisa Anda dapatkan saat ini (take what you can get now!), dan keputusan yang telah diambil pada setiap langkah tidak akan bisa diubah kembali. Intinya

Elemen-elemen penyusun prinsip greedy pada Algoritma Dijkstra adalah :

1.Himpunan kandidat
Himpunan ini berisi elemen-elemen yang memiliki peluang untuk membentuk solusi. Pada persoalan lintasan terpendek dalam graf, himpunan kandidat ini adalah himpunan simpul pada graf tersebut.

2. Himpunan solusi
Himpunan ini berisi solusi dari permasalahan yang diselesaikan dan elemennya terdiri dari elemen dalam himpunan kandidat namun tidak semuanya atau dengan kata lain himpunan solusi ini adalah upabagian dari himpunan kandidat.

3. Fungsi seleksi
Fungsi seleksi adalah fungsi yang akan memilih setiap kandidat yang yang memungkinkan untuk menghasilkan solusi optimal pada setiap langkahnya.

4. Fungsi kelayakan
Fungsi kelayakan akan memeriksa apakah suatu kandidat yang telah terpilih (terseleksi) melanggar constraint atau tidak. Apabila kandidat melanggar constraint maka kandidat tidak akan dimasukkan ke dalam himpunan solusi.

5. Fungsi objektif
Fungsi objektif akan memaksimalkan atau meminimalkan nilai solusi. Tujuannya adalah memilih satu saja solusi terbaik dari masing-masing anggota himpunan solusi.

Ada beberapa kasus pencarian lintasan terpendek yang diselesaikan menggunakan algoritma Dijkstra, yaitu: pencarian lintasan terpendek antara dua buah simpul tertentu (a pair shortest path), pencarian lintasan terpendek antara semua pasangan simpul (all pairs shortest path), pencarian lintasan terpendek dari simpul tertentu ke semua simpul yang lain (single-source shortest path), serta pencarian lintasan terpendek antara dua buah simpul yang melalui beberapa simpul tertentu (intermediate shortest path).

Pseudocode

procedure Dijkstra(INPUT m: matriks, a : simpul awal)
{
Mencari lintasan terpendek dari simpul awal a ke semua simpul lainnya.
Masukan: matriks ketetanggaan (m) dari graf berbobot G dan simpul awal a
Keluaran: lintasan terpendek dari ake semua simpul lainnya
}
Kamus:
s : array [1..n] of integer
d : array [1..n] of integer
i : integer
Algoritma:
{ Langkah 0 (inisialisasi: }
traversal [1..n]
si <- 0
di <- mai

{ Langkah 1: }
sa <- 1
da <- 8
{ Langkah 2, 3, …, n-1: }
traversal [2..n-1]
cari j sedemikian sehingga sj= 0
dan
dj = min {d1, d2, …, dn}
sj <- 1 {simpul j sudah terpilih}
perbarui di, untuk i = 1, 2, 3,
s.d. n dengan:
di(baru) = min{di(lama),dj+ mji}

Kompleksitas waktu algoritma (Running time) :

  • Algoritma Dijkstra’menggunakan waktu sebesar O(V*log V + E)di mana V dan E adalah banyaknya sisi dan titik.
  • Kompleksitas algoritma Dijkstra adalah O(n2). Sehingga, untuk mencari semua pasangan simpul terpendek, total waktu asimptotik komputasinya adalah: T(n) = n.O(n2) = O(n3).
  • Algoritma dijkstra lebih menguntungkan dari sisirunning time