Rabu, 06 April 2016

Penyelesaian Masalah dengan Algoritma Djikstra





Dosen Pembimbing : Adhika P., S. Kom

Oleh : Siti Qomariyah
(Prodi TI / 2120150034)

Universitas Nahdlatul Ulama Sunan Giri Bojonegoro
(UNUGIRI)


A.    ABSTRAK
Paper ini membahas tentang persoalan lintasan terpendek suatu graf dengan algoritma djikstra. Lintasan terpendek merupakan bagian dari teori graf. Jika diberikan sebuah graf berbobot, masalah jarak terpendek adalah bagaimana kita mencari sebuah jalur pada graf yang meminimalkan jumlah bobot sisi pembentuk jalur tersebut. Persoalan ini adalah persoalan optimasi, dimana kita akan mencari solusi penyelesaian yang paling efektif dari masalah penentuan lintasan terpendek pada suatu graf.
Saat ini banyak sekali algortima-algoritma yang dapat digunakan untuk menyelesaikan persoalan penentuan lintasan terpendek (shortest path problem) dari suatu graf. Solusi yang didapat dari penelusuran algoritma tersebut dapat diberi nama Pathing Algorithm. Ada dua algortima yang cukup terkenal yang bisa digunakaan untuk menyelesaikan persoalan lintasan terpendek, yaitu Algoritma Djikstra dan Algoritma Bellman-Ford. Tetapi pada kesempatan ini kita hanya akan membahas tentang algoritma dijkstra.
Algoritma Dijkstra merupakan salah satu algoritma yang digunakan untuk memecahkan permasalahan lintasan terpendek yang terdapat pada suatu graf . Algoritma ini digunakan pada graf berbobot dengan syarat bobot dari masing-masing sisi haruslah bernilai positif (>=0). Dan dalam paper ini kita kan menyelesaikan sustu masalah tentang pemilihan jalur tercepat dan efisien dari titik A ke titik B dengan syarat harus melalui titik C dahulu sebelum ke titik B (tujuan)












B.     PENDAHULUAN
Permasalahan optimasi merupakan permasalahan yang sering sekali kita temui dalam kehidupan sehari-hari. Hal ini tidak lepas dari sifat dasar manusia yang selalu ingin mendapat keuntungan semaksimum mungkin dan memperoleh kerugian seminimum mungkin. Jika kita membicarakan permasalahan mengenai rute atau jalur yang menghubungkan tempat-tempat tertentu maka kita sering menggambarkanya dengan bulatan untuk memvisualisasikan tempat dan garis untuk jalan / rute. Representasi semacam ini merupakan suatu representasi dari graf.
Graf adalah himpunan simpul yang dihubungkan dengan suatu garis dimana garis tersebut menghubungkan dengan tepat ke 2 simpul sehingga simpul-simpul ini saling berhubungan. Dalam kehidupan sehari-hari banyak sekali persoalan yang di implementasikan dengan graf. Bidang-bidang yang menggunakan penerapan graf antara lain Switching network, Coding theory, Electrical analysis, Operation research, aljabar, computer science, dan kimia.
Banyak sekali aplikasi yang mengunakan graf sebagai alat untuk merepresentasikan atau memodelkan persoalan sehingga persoalan itu dapat diselesaikan dengan baik. Aplikasi - aplikasi tersebut misalnya menentukan lintasan terpendek (the shortest path problem), traveling salesman problem, chinese postman problem, graf colouring, Making a road system one-way, rangking the participants in a tournament, dan masih banyak lagi. Dalam kesempatan ini kami mencoba mengulas tentang persoalan menentukan lintasan terpendek (The Shortest Path Problem).
Aplikasi yang paling sering ditemui adalah pada bidang transportasi, seperti pada pencarian rute terbaik untuk menempuh dua kota. Dan di paper ini kita akan menyelesaikan sebuah problem untuk menempuh jarak dari kota A ke kota B dengan menggunakan Algoritma Djikstra. Semoga paper ini bisa bermanfaat bagi penulis dan pembaca.





C.     Dasar Teori
Dasar teori yang digunakan dalam penyelesaian masalah pada paper ini dengan menggunakan Algoritma djikstra, yaitu mencari rute permaslahan terpendek antara simpul sumber menuju simpul tujuan
D.    Penjelasan Algoritma dan Uraian Pemecahan Masalah
Untuk mencari rute terpendek, dapat menggunakan beberapa metode, antara lain dengan menggunakan algoritma Dijkstra, algoritma Bellman-ford, dan algoritma Warshall. Kali ini penulis akan menyelesaikan suatu kasus dengan menggunakan Algoritma Djikstra.
Algoritma Dijkstra adalah suatu algoritma rakus dimana algoritma ini digunakan untuk mencari rute permasalahan terpendek antara simpul sumber dan simpul tujuan untuk sebuah graf berarah berdasarkan bobot pada sisi yang bernilai tidak negatif. Algoritma Dijkstra bekerja dengan cara mengunjungi simpul-simpul yang ada, dimulai dari simpul sumber. Kemudian algoritma ini memilih simpul-simpul yang lokasinya terdekat dan dilakukan secara berulang lalu kemudia menghitung total bobot semua sisi yang dilewati untuk mencapai simpul tujuan.
Pada algoritma dijkstra total biaya untuk mencapai suatu simpul adalah seperti ini :
(ni) = g(n) + c(n,ni)                                      (1)
Algoritma Dijkstra dijamin dapat menemukan rute terpendek asalkan tidak terdapat bobot negatif pada setiap sisi dalam graph [10]. Input untuk algoritma ini adalah sebuah graph yang berarah dan berbobot G. Dan sebuah sumber vertex s dalam G. Dan V merupakan himpunan semua vertice dalam grapf G. Setiap sisi dari graph ini adalah pasangan vertice (u,v) yang melambangkan hubungan vertex u dengan vertex v dan himpunan semua tepi E.
w : E [0, )                                                           (2)
jadi w(u, v) merupakan jarak non-negatif dari vertex u ke vertex v. Biaya sebuah sisi dapat dianggap sebagai jarak antara dua buah vertex dan merupakan jumplah jarak tiap sisi dalam jalur tersebut.

Gambar : Ilustrasi Algoritma Dijkstra

Contoh, algoritma ini digunakan untuk menghitung jarak dari s ke t dalam V.
1.      Function Dijkstra (G, w, s)
2.      For each vertex v in V[G]
3.      d[V] := infinity
4.      previous[v] := undefined
5.      d[s] := 0
6.      S := empty set
7.      Q := V[G]
8.      while Q is not an empty set
9.      u := Extract_Min(Q)
10.  S := S union {u}
11.  For each edge (u,v) outgoing from u
12.  If d[u] + w(u,v) < d[v]
13.  d[v] := d[u] + w(u,v)
14.  previous[v] := u

Pada baris kedua merupakan proses inisialisasi, pada baris ke lima merupakan jarak dari s ke s. Baris ke tujuh merupakan kumpulan dari semua vertice, dan baris kedelapan dan seterusnya merupakan algoritmanya itu sendiri. Terdapat Pseudocode lain tentang Algoritma Djikstra.
1.      DIJKSTRA(G, s, w)
2.      for each vertex u in V
3.      d[u] := infinity
4.      p[u] := u
5.      color[u] := WHITE
6.      end for
7.      color[s] := GRAY
8.      d[s] := 0
9.      INSERT(Q, s)
10.  while (Q != Ø)
11.  u := EXTRACT-MIN(Q)
12.  S := S U { u }
13.  for each vertex v in Adj[u]
14.  if (w(u,v) + d[u] < d[v])
15.  d[v] := w(u,v) + d[u]
16.  p[v] := u
17.  if (color[v] = WHITE)
18.  color[v] := GRAY
19.  INSERT(Q, v)
20.  else if (color[v] = GRAY)
21.  DECREASE-KEY(Q, v)
22.  Else
23.   ...
24.  end for
25.  color[u] := BLACK
26.  end while
27.  return (d, p)

Pada baris ke-9 dilakukan pencarian vertex s, lalu pada baris ke 11, dilakukan pengecekan terhadap vertex u. Kemudian pada baris 13, dilakukan pengecekanpinggiran/ujung (u,v). Lalu pada baris ke-19 dilakukan pencarian vertex v. Dan pada baris ke-24, menyelesaikan vertex u.


Gambar : Ilustrasi kelemahan algoritma dijkstra.
Waktu yang dibutuhkan oleh algoritma dijkstra adalah O(|V|2). Waktu ini dapat dikurangi menjadi O(|E|log|V|) apabila heap digunakan untuk menjaga {v in V\Si : L(v) < infinity}.

Menurut teori graf, persoalan lintasan terpendek adalah suatu persoalan untuk mencari lintasan antara dua buah simpul pada graf berbobot yang memiliki gabungan nilai jumlah bobot pada sisi graf yang dilalui dengan jumlah yang paling minimum.
Persoalan lintasan terpendek merupakan salah satu persoalan optimasi yeng menggunakan graf berbobot, dimana bobot pada setiap sisi graf tersebut dapat kita gunakan untuk menyatakan jarak kota, waktu pengiriman pesan, ongkos pembangunan, dan sebagainya.
Coba perhatikan contoh pemecahan masalah dengan algoritma djikstra di bawah ini.

Gambar : Contoh keterhubungan antar titik  dalam algoritma Dijkstra

Pertama-tama tentukan titik mana yang akan menjadi node awal, lalu beri bobot jarak pada node pertama ke node terdekat satu per satu, Dijkstra akan melakukan pengembangan pencarian dari satu titik ke titik lain dan ke titik selanjutnya tahap demi tahap. Inilah urutan logika dari algoritma Dijkstra:
1.            Beri nilai bobot (jarak) untuk setiap titik ke titik lainnya, lalu set nilai 0 pada node awal dan nilai tak hingga terhadap node lain (belum terisi)
2.            Set semua node “Belum terjamah” dan set node awal sebagai “Node keberangkatan”
3.            Dari node keberangkatan, pertimbangkan node tetangga yang belum terjamah dan hitung jaraknya dari titik keberangkatan. Sebagai contoh, jika titik keberangkatan A ke B memiliki bobot jarak 6 dan dari B ke node C berjarak 2, maka jarak ke C melewati B menjadi 6+2=8. Jika jarak ini lebih kecil dari jarak sebelumnya (yang telah terekam sebelumnya) hapus data lama, simpan ulang data jarak dengan jarak yang baru.
4.            Saat kita selesai mempertimbangkan setiap jarak terhadap node tetangga, tandai node yang telah terjamah sebagai “Node terjamah”. Node terjamah tidak akan pernah di cek kembali, jarak yang disimpan adalah jarak terakhir dan yang paling minimal bobotnya.
5.            Set “Node belum terjamah” dengan jarak terkecil (dari node keberangkatan) sebagai “Node Keberangkatan” selanjutnya dan lanjutkan dengan kembali ke step 3.

E.     Proses

Seperti yang telah kita bahas sebelumnya bahwa kita akan menyelesaikan masalah menggunakan metode Algoritma Djikstra yang memilih rute yang paling pendek dari titik awal ke titik tujuan (Vertex sumber ke Vertex tujuan).
Perhatikan gambar di bawah ini. Gambar di bawah ini yang akan kita selesaikan dengan Algoritma Djikstra. Mula-mula kita berada pada V1 lalu kita memilih jalur terccepat dan terdekat agar biasa sampai ke titik V11, tetapi harus melewati titik V6 terlebih dahulu sebelum sampai ke titik V11 dengan cepat dibandingkan melewati titik lain yang jauh. Umpamakan nilai-nilai edge tersebut bersatuan km.

1.      Langkah yang pertama yaitu mrmilih jalur dari titik V1 yang paling pendek, ternyata di gambar itu ada yang paling dekat jaraknya yaitu titik V4, hanya berjarak 1km. dan jarak terdekat kedua yaitu titik V2 yang berjarak 2 km. dan yang paling jauh yaitu titik V3 yang sejauh 8 km.
2.      Pilihlah titik yang paling dekat dengan V4. Dari V4 ke titik selanjutnya menempuh jarak 9 km, jadi totalnya 10 km (1+9). tapi lihat perbandingannya dengan titik V3 ke titik V6, hanya 1 km, totalnya 9 km (8+1). Dan lihat titik V2 menuju titik V5 hanya 1 km, dan totalnya 3 km (2+1). Maka kita bissa menghapus kesimpulan pertama tadi dan mengganti kesimpulan kita menjadi V1 (0 km) – V2 (2 km) – V5 (1 km) – V6 (3 km) – V9 (6 km) – V11 (2 km).
3.      Sampailah di titik V11 denan melewati titik V6 terlebih dahulu, dengan total jarak 14 km.

F.      Kesimpulan
Jadi, rute terdekat yang harus di tempuh dari titik V1 menuju titik V11 dengan melewati titik V6 terlebih dahulu yaitu V1 (0 km) – V2 (2 km) – V5 (1 km) – V6 (3 km) – V9 (6 km) – V11 (2 km) yang total jaraknya sejauh 14 km, lebih dekat dibandingkan rute yang lainnya.

G.    Daftar Referensi

Tidak ada komentar:

Posting Komentar