Apa yang anda ketahui tentang Algoritma Johnson?

Algoritma Johnson

Algoritma Johnson adalah salah satu algoritma yang digunakan untuk pencarian jalur terpendek. Algoritma Johnson merupakan penggabungan dari Algoritma Bellman-Ford dan Algoritma Dijkstra

Apa yang anda ketahui tentang Algoritma Johnson ?

Algoritma Johnson adalah dapat digunakan untuk graf yang berbobot negatif dan untuk menyelesaikan masalah lintasan terpendek di setiap titik ke semua titik lain. Langkah awal penyelesaian (Noviandi, E. 2012).

Algoritma Johnson bertugas untuk mengonstruksi graf yang baru dengan menambahkan graf baru pada graf dan memberi bobot sisi yang keluar dari titik baru tersebut dengan 0. Langkah selanjutnya adalah mencari lintasan terpendek dari titik baru ke semua titik lain.

Lintasan Terpendek tersebut digunakan untuk mengubah bobot semua sisi pada graf baru agar bobot semula bernilai positif. Setelah itu dicari lintasan terpendek dari tiap titik ke semua titik lain dengan mengubah hasilnya dengan menggunakan hasil dari perhitungan berupa matriks. Dari matriks ini dapat diketahui panjang lintasan terpendek dari titik ke semua titik lain.

Langkah Algoritma Johnson adalah sebagai berikut

  1. Mengostruksi graf baru G, dengan cara menambahkan titik baru sehingga

    V’ = V + {s} dan E + {( s,v)v di V }

  2. Setiap titik v di V

    0 → w (s, v)

    ∞ → w (v, s)

  3. Menjalankan Algoritma Bellman-Ford pada graf baru

    • jika terdapat bobot negatif maka selesai

    • jika tidak terdapat bobot negatif maka hitung d(s, v) , v ∈ V

  4. Setiap (u, v) di E

    W(u, v) = w(u, v) + d (s, v) – d(s, v)

  5. Setiap v di V, dijalankan Algoritma Djikstra untuk menghitung d(u, v)

  6. D’ = d(u, v)

  7. Setiap (u, v) di V ; d(u, v) = d(u, v) + d(sv) – d(s, u)

  8. D = d(u, v)

Keterangan

  • w(s,v) = bobot sisi dari s ke v.

  • d(s,v) = panjang lintasan terpendek dari s ke v. w(u,v) = bobot sisi baru dari u ke v.

  • d(u,v) = panjang lintasan terpendek dari u ke v dan yang dihutung adalah bobot sisi baru (w).

  • d(u,v) = panjang lintasan terpendek dari u ke v.

  • D’ = matriks hasil perhitungan lintasan terpendek dari tiap-tiap pasangan titik dan bobot sisi yang digunakan adalah w.

  • D = matriks hasil akhir dari perhitungan.

Pseudocode algoritma Johnson

create G` where G`.V = G.V + {s},
    G`.E = G.E + ((s, u) for u in G.V), and
    weight(s, u) = 0 for u in G.V

 if Bellman-Ford(G) == False
    return "The input graph has a negative weight cycle"
 else:
    for vertex v in G`.V:
       h(v) = distance(s, v) computed by Bellman-Ford
    for edge (u, v) in G`.E:
       weight`(u, v) = weight(u, v) + h(u) - h(v)

 D = new matrix of distances initialized to infinity
 for vertex u in G`.V:
    run Dijkstra(G, weight`, u) to compute distance`(u, v) for all v in G.V
 for each vertex v in G.V:
       D_(u, v) = distance`(u, v) + h(v) - h(u)
 return D