dijkstra floyd

Download Dijkstra Floyd

Post on 25-Jun-2015

211 views

Category:

Documents

2 download

Embed Size (px)

TRANSCRIPT

ANALISIS ALGORITMA SHORTEST PATH DIJKSTRA & FLOYD

KELOMPOK 3 :1. PRASTOWO HADI 2. PARAMITHA A 3. NOVITA R 4. M.FARIS RUSYDI 5. ALFINA SHOFA PA / 9927 PA / 9980 04 / 181863 / PA / 10339 PA / 9759 PA / 10674

SHORTEST PATH (LINTASAN TERPENDEK) Persoalan lintasan terpendek yaitu menemukan lintasan terpendek antara dua atau beberapa simpul lebih yang berhubungan. Biasanya direpresentasikan dalam bentuk graf berbobot (weighted graph), yaitu graf yang setiap sisinya diberikan suatu nilai atau bobot. Bobot pada sisi graf dapat menyatakan jarak antar kota, waktu pengiriman pesan, ongkos pembangunan, dan sebagainya. Contoh-contoh terapan pencarian lintasan terpendek: 1. Misalkan simpul pada graf menyatakan kota, sedangkan sisi menyatakan jalan yang menghubungkan dua buah kota. Bobot sisi graf dapat menyatakan jarak antara dua buah kota atau rata-rata waktu tempuh antara dua buah kota. Apabila terdapat lebih dari satu lintasan dari kota A ke kota B, maka persoalan lintasan terpendek di sini adalah menentukan jarak terpendek atau waktu tersingkat dari kota A ke kota B. 2. Misalkan simpul pada graf menyatakan terminal komputer atau simpul komunikasi dalam suatu jaringan, sedangkan sisi menyatakan saluran komunikasi yang menghubungkan dua buah terminal. Bobot pada graf dapat menyatakan biaya pemakaian saluran komunikasi antara dua buah terminal, jarak antara dua buah terminal, atau waktu pengiriman pesan (message) antara dua buah terminal. Persoalan lintasan terpendek di sini adalah menentukan jalur komunikasi terpenek antara dua buah terminal komputer. Lintasan terpendek akan menghemat waktu pengiriman pesan dan biaya komunikasi. Beberapa macam persoalan lintasan terpendek antara lain: a. Lintasan terpendek antara dua buah simpul tertentu (a pair shortest path). b. Lintasan terpendek antara semua pasangan simpul (all pairs shortest path). c. Lintasan terpendek dari simpul tertentu ke semua simpul yang lain (single-source shortest path). d. Lintasan terpendek antara dua buah simpul yang melalui beberapa simpul tertentu

(intermediate shortest path). ALGORITMA SHORTEST PATH Dijkstra Bellman-Ford A-star Floyd-Warshall A. ALGORITMA DIJKSTRA Ditemukan oleh Edsger Wybe Dijkstra (profesor, programmer, dan

matematikawan) dari Belanda. Input graf berarah dan berbobot (V,E), dimana : V = daftar titik (node/vertex) E = daftar sisi (edge). Jumlah bobot sisi-sisi pada sebuah jalur adalah bobot jalur tersebut. Sisi pada E haruslah berbobot positif Merupakan salah satu varian dari Algoritma Greedy Sifat : sederhana dan lempang (straightforward). Greedy tamak / rakus, hanya memikirkan solusi terbaik yang akan diambil pada setiap langkah tanpa memikirkan konsekuensi ke depan. Prinsip : 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 Berupaya membuat pilihan nilai optimum lokal pada setiap langkah dan berharap agar nilai optimum lokal ini mengarah kepada nilai optimum global.

PSEUDOCODE Algoritma ini mencari panjang lintasan terpendek dari verteks a ke z dalam sebuah graf berbobot tersambung. Bobot dari rusuk (i,j) adalah w(i,j)>0 dan label verteks x adalah L(x). Hasilnya, L(z) merupakan panjang lintasan terpendek dari a ke z. Masukan : Sebuah graf berbobot tersambung dengan bobot positif. Verteks a sampai z. Keluaran : L(z), panjang lintasan terpendek dari a ke z,jalur lintasan terpendek.procedure dijkstra (w,a,z,L) L(a) := 0 for semua verteks x a do L(x) := T := himpunan semua verteks // T adalah himpunan verteks yang panjang terpendeknya dari a belum ditemukan while zT do begin pilih vT dengan minimum L(v) T:=T-{v} for setiap xT di samping v do L(x):=min{L(x), L(v)+w(v,x)} end end dijkstra

Algoritma di atas digunakan untuk mencari single source shortest path. Untuk intermediate shortest path, hanya perlu mengganti pada bagian :while zT

dengan while T0

KOMPLEKSITAS WAKTU Kompleksitas waktu untuk Single Source Shortest Path adalah O(V), sedangkan kompleksitas waktu untuk Intermediate Shortest Path adalah O(V2)

Best Case Jika suatu verteks (a) hanya memerlukan satu langkah untuk mencapai tujuan (z) dan hasilnya optimum pada Single Source Shortest Path Worst case Jika suatu verteks (a) harus melewati semua verteks untuk mencapai tujuan (z) pada Intermediate Shortest Path Jadi kompleksitas waktu untuk Algoritma Dijkstra ini adalah O(V) g(n) O(V2) KOMPLEKSITAS MEMORY Kompleksitas memory dari Algoritma Dijkstra ini adalah O(V2+2V) karena kita membutuhkan sebuah matriks untuk graphnya dan 2 kali banyaknya verteks untuk menyimpan T(himpunan verteks) dan v. KEMUDAHAN Algoritma yang lebih efisien Implementasinya lebih sukar Array, list agak sulit karena harus menggunakan list Intermediate Source Path lebih mudah karena tinggal mengecek T 0 daripada Single Source Shortest Path yang harus mengecek apakah z berada dalam himpunan T. Karena jika diimplementasikan dengan bahasa pemrograman yang belum bisa langsung mengecek zT, akan terasa sangat sulit. Tetapi karena kami menggunakan bahasa pemrograman C# yang sudah bisa langsung mengenali kondisi itu, maka kemudahannya adalah sama. B. ALGORITMA FLOYD

Input graf berarah dan berbobot (V,E), dimana : V = daftar titik (node/vertex) E = daftar sisi (edge). Jumlah bobot sisi-sisi pada sebuah jalur adalah bobot jalur tersebut. Sisi pada E diperbolehkan memiliki bobot negatif, akan tetapi tidak diperbolehkan bagi graf ini untuk memiliki siklus dengan bobot negatif. Algoritma ini menghitung bobot terkecil dari semua jalur yang menghubungkan sebuah pasangan titik, dan melakukannya sekaligus untuk semua pasangan titik. Salah satu varian dari pemrograman dinamis Memandang solusi yang akan diperoleh sebagai suatu keputusan yang saling terkait. Solusi-solusi dibentuk dari solusi yang berasal dari tahap sebelumnya dan ada kemungkinan solusi lebih dari satu. Prinsip prinsip optimalitas, yaitu jika solusi total optimal, maka bagian solusi sampai suatu tahap (misalnya tahap ke-i) juga optimal. Greedy Vs Dynamic Programming Greedy keputusan yang diambil pada tiap tahap hanya berdasarkan pada informasi yang terbatas sehingga nilai optimum yang diperoleh pada saat itu, tidak memikirkan konsekuensi yang terjadi seandainya memilih suatu keputusan pada suatu tahap. Dalam beberapa kasus, algoritma greedy gagal memberikan solusi terbaik. Dynamic Programming mencoba untuk memberikan solusi yang memiliki pemikiran terhadap konsekuensi yang ditimbulkan dari pengambilan keputusan pada suatu tahap. Pemrograman dinamis mampu mengurangi pengenumerasian keputusan yang tidak mengarah ke solusi. PSEUDOCODE

Dasar algoritma: Asumsikan semua simpul graf berarah G adalah V = {1, 2, 3, 4, ..., n}, perhatikan subset {1, 2, 3, ..., k}. Untuk setiap pasangan simpul i, j pada V, perhatikan semua lintasan dari i ke j dimana semua simpul pertengahan diambil dari {1, 2, ..., k}, dan p adalah lintasan berbobot minimum diantara semuanya. Algoritma ini mengeksploitasi relasi antara lintasan p dan lintasan terpendek dari i ke j dengan semua simpul pertengahan berada pada himpunan {1, 2, ..., k-1}. Relasi tersebut bergantung pada apakah k adalah simpul pertengahan pada lintasan p. Implementasi algoritma dalam pseudocode: (Graf direpresentasikan sebagai matrix keterhubungan, yang isinya ialah bobot / jarak sisi yang menghubungkan tiap pasangan titik, dilambangkan dengan indeks baris dan kolom) (Ketiadaan sisi yang menghubungkan sebuah pasangan dilambangkan dengan Takhingga)function fw(int[1..n,1..n] graph) { // Inisialisasi var int[1..n,1..n] jarak := graph var int[1..n,1..n] sebelum for i from 1 to n for j from 1 to n if jarak[i,j] < Tak-hingga sebelum[i,j] := i // Perulangan utama pada algoritma for k from 1 to n for i from 1 to n for j from 1 to n if jarak[i,j] > jarak[i,k] + jarak[k,j] jarak[i,j] = jarak[i,k] + jarak[k,j] sebelum[i,j] = sebelum[k,j]

return jarak return path }

KOMPLEKSITAS WAKTU Algoritma ini berjalan dengan waktu O(V3) karena dalam algoritmanya kita lihat bahwa terdapat 3 iterasi / perulangan. Sebenarnya IF-nya terlalu banyak karena ada pasangan jarak yang seharusnya tidak perlu dihitung lagi. Misalnya jarak terpendek dari kota Jogja ke Jogja itu sendiri. Tidak mungkin jarak terpendeknya harus melewati kota Semarang terlebih dahulu. Pastilah jarak terpendeknya adalah 0. Tapi hal itu bisa diabaikan, karena jika itu dilakukan pun, kompleksitas waktunya tetap O(V3). KOMPLEKSITAS MEMORY Kompleksitas memory dari algoritma Floyd ini adalah O(2V2) karena kita membutuhkan 2 matriks untuk graph dan KEMUDAHAN Algoritmanya sederhana dan mudah diimplementasikan Hanya menggunakan array sehingga Floyd lebih mudah dibandingkan Dijkstra.

STUDI KASUS 0100090000037800000002001c00000000000400000003010800050000000b020000 0000050000000c020f066007040000002e0118001c000000fb021000070000000000bc02 000000000102022253797374656d0006600700007cc8110072edc630606a1b000c020000 60070000040000002d01000004000000020101001c000000fb02c4ff0000000000009001 000000000440001254696d6573204e657720526f6d616e00000000000000000000000000 00000000040000002d010100050000000902000000020d000000320a360000000100040 0000000005e070d0620001b00040000002d010000030000000000 Lintasan terpendek dari kota A ke kota G? Berapakah jaraknya? Waktu pemrosesan / pengerjaannya? Penentuan lintasan terpendek dengan Algoritma Dijkstra cara manual : L(a):= 0 L(x):= T = {a,b,c,d,e,f,g} z = {g} while z T pilih v T dengan minimum L(v) L(v) adalah jarak dari titik v ke a (titik awal) L(a) = 0; L(b) = 3 ; L(c) = 9; L(d) = ; L(e) = ; L(f) = ; L(g) = ; v = {a} // karena L(a) mempunyai nilai yang paling kecil / minimum. T := T {a} = {b,c,d,e,f,g} For setiap x T di samping v x = {b,c} // titik yang terdekat dengan titik a adalah b dan c L(b) = 3 ; L(c) = 9; v = {a,b} T:= T {b} = {c,d,e,f,g}

x = {e,d } L(e) = min { L(e), L(b) + w(