Algoritma dan Struktur Data Shortest Path Problem Metode

Algoritma dan Struktur Data Shortest Path Problem

Metode Pencarian dan Pelacakan Ada 2 teknik dalam pencarian dan pelacakan: Pencarian Buta (Blind Search) ü Pencarian Melebar Pertama (Breadth First Search) ü Pencarian Mendalam Pertama (Depth First Search) Pencarian Terbimbing (Heuristic Search) ü Pendakian Bukit (Hill Climbing) ü Pembangkit dan Pengujian (Generate and Test) ü Simulated Anneling ü Pencarian Terbaik Pertama (Best First Search) • Greedy - Dijkstra • A*

… Pencarian Buta: tidak ada informasi awal yang digunakan untuk proses pencarian. Waktu aksesnya lama Besarnya memori yang digunakan Pencarian Heuristic: ada informasi awal yang digunakan untuk proses pencarian. Menggunakan suatu fungsi yang menghitung biaya perkiraan (estimasi) dari suatu simpul tertentu menuju ke simpul tujuan -> disebut fungsi heuristic Aplikasi yang menggunakan fungsi heuristic : Google

Shortest Path Problem (SPP) Persoalan Shortest Path Problem bentuk umum permasalahan jalur terpendek. Contoh kasus: Penentuan rute perjanalanan bus/truk. Perencanaan investasi. Penentuan rute pesawat terbang. Jalur yang ada dapat direpresentasikan menggunakan graph.

Implementasi Jalur ke Graph Karakteristik graph untuk SPP: ü Graph Berarah G=(V, E). ü ü V = kumpulan vertex / node kota E = kumpulan edge jalur / jalan Cij adalah cost atau jarak untuk edge(i, j) Source Node = 1 Destination Node = n Variabel :

Contoh Data

Formulasi Secara matematis, persoalan SPP dapat diformulasikan sbb: Untuk mencari jalur terpendek dapat digunakan bermacam-macam algoritma SPP yang ada.

Jenis-jenis Algoritma SPP Algoritma Dijkstra Algoritma Bellman-Ford Algoritma A* Algoritma Floyd-Warshall Algoritma Johnson Algoritma Genetik

Algoritma Dijkstra Ditemukan oleh Edger Wybe Dijkstra. Merupakan salah satu algoritma SPP bekerja secara greedy. Prinsip kerja: yang ü Pada setiap langkah, ambil sisi yang berbobot minimum yang menghubungkan sebuah simpul yang sudah terpilih dengan sebuah simpul lain yang belum terpilih. ü Lintasan dari simpul asal ke simpul yang baru haruslah merupakan lintasan yang terpendek di antara semua lintasannya ke simpul yang belum terpilih.

Langkah-langkah Algoritma Dijkstra Memilih titik awal. Menghitung jarak ke setiap node tetangga. Memilih jarak terdekat dari setiap node tetangga. Ulangi langkah 2 jika belum tiba di node tujuan. Memberi nilai pada setiap node, nilai 0 untuk node awal dan ‘~’ untuk node lain. 6. Menandai setiap node belum dikunjungi. 7. Untuk node sekarang, hitung jarak pada tiap node tetangga dengan menjumlahkan jarak node sekarang + jarak menuju node tetangga. Jika jarak < jarak tercatat pada node tersebut maka nilai jarak pada node tersebut diganti. 1. 2. 3. 4. 5.

… Menandakan node sekarang sebagai node yang telah dikunjungi. Node ini tidak akan dikunjungi lagi. 9. Menandai node tetangga dengan jarak terdekat sebagai node selanjutnya kemudian langkah ke-3 dilakukan untuk node tersebut 8.

Contoh Penyelesaian SPP dengan Dijkstra

Contoh 2 (node 1 ke node 7)

Implementasi Graph Ke Program Graph dalam Java: Dengan Java, Graf dapat dibuat menjadi sebuah bentuk obyek. Objek yang dapat kita bentuk adalah vertexnya. Lalu atribut-atribut yang dapat dimasukan ke dalam objek tersebut antara lain label, node-node yang berhubungan dengan vertex tersebut, dan jaraknya. Karena setiap vertex dapat terhubung dengan banyak vertex, maka digunakan kelas Vector (bawaan java).

Langkah-langkah Buat sebuah projek java application dengan nama Graf. Sederhana. 2. Kelas-kelas yang harus dibuat: 1. Main (Utama) Vertex XNode

Kelas Main Dibuat langsung saat generate projek

Kelas XNode Tambahkan atribut: private Vertex vertex; private int panjang; Buat konstruktor XNode(Vertex vertex, int panjang) Di dalam konstruktor beri perintah untuk inisialisasi atribut vertex dan panjang. Tambahkan fungsi get. Vertex() dan get. Panjang().

Kelas Vertex Tambahkan atribut: private String label. private Vector<XNode> xnodes. Buat konstruktor Vertex(String label) Di dalam konstruktor beri perintah untuk inisialisasi atribut label dan xnodes. Tambahkan fungsi get. Label() dan get. XNode().

Coba Projek Di kelas main, buat sebuah objek vector dengan nama list. V. Setelah itu, tambahkan beberapa objek vertex ke dalamnya. Kemudian buat perulangan untuk mencetak label dari vertex-vertex yang sudah dimasukkan ke dalam list. V.

Implementasi Dijkstra Node Buat kelas dengan nama Node (kelas turunan dari kelas Vertex). Tambahkan atribut: private int nilai private boolean kunjung private int tipe. Nod Buat getter dan setter untuk semua atribut tersebut. Buat konstruktor untuk ketiga atribut ditambah kontruktor kelas parent.

… Override Node fungsi add. XNode lalu isi fungsi dengan koding berikut: for (XNode x. Node : super. get. XNodes()) if(x. Node. get. Node(). get. Label(). equals(xnode. get. Node(). get. Label( ))) return; //proteksi apakah relasi baru dibuat atau bukan. if(baru) xnode. get. Node(). add. XNode(new XNode(this, xnode. get. Panjang()), false); super. get. XNodes(). add(xnode);

. . XNode Tambahkan atribut: private Node nod Buat setter dan getter untuk atribut tersebut. Buat konstruktor untuk atribut node dan panjang.

… Main Buat vector dengan nama list. Node yang hanya dapat menyimpan objek dari Node. Masukkan 6 objek Node ke dalam vector Vector<Node> list. Node = new Vector<Node>(); list. Node. add(new Node("1", -1, false, 0)); list. Node. add(new Node("2", -1, false, 1)); list. Node. add(new Node("3", -1, false, 1)); list. Node. add(new Node("4", -1, false, 1)); list. Node. add(new Node("5", -1, false, 2)); list. Node. add(new Node("6", -1, false, 1));

… Main Buat relasi antar node berdasarkan koding berikut: list. Node. get(0). add. XNode(new XNode(list. Node. get(1), 7), true); list. Node. get(0). add. XNode(new XNode(list. Node. get(2), 9), true); list. Node. get(0). add. XNode(new XNode(list. Node. get(5), 14), true); list. Node. get(1). add. XNode(new XNode(list. Node. get(2), 10), true); list. Node. get(1). add. XNode(new XNode(list. Node. get(3), 15), true); list. Node. get(2). add. XNode(new XNode(list. Node. get(3), 11), true); list. Node. get(2). add. XNode(new XNode(list. Node. get(5), 2), true); list. Node. get(3). add. XNode(new XNode(list. Node. get(4), 6), true); list. Node. get(4). add. XNode(new XNode(list. Node. get(5), 9), true);

… Main Tambahkan koding berikut: Node nod. Awal = null, nod. Akhir = null, nod. Skr = null; for (Node nod : list. Node) { if(nod. get. Tipe. Nod() == 0) nod. Awal = nod; else if(nod. get. Tipe. Nod() == 2) nod. Akhir = nod; } if(nod. Awal == null) return; nod. Awal. set. Nil(0); nod. Skr = nod. Awal; Vector<Node> list. Path = new Vector<Node>(); list. Path. add(nod. Skr);

… Main while(nod. Skr != nod. Akhir){ Node nod. Next = nod. Skr; int inc = 0; for (XNode x. Node : nod. Skr. get. XNodes()) if(!x. Node. get. Node(). is. Kunjung()){ if(x. Node. get. Node(). get. Nil() != -1){ if((nod. Skr. get. Nil()+x. Node. get. Panjang()) < x. Node. get. Node(). get. Nil()) x. Node. get. Node(). set. Nil(nod. Skr. get. Nil()+x. Node. get. Panjang()); }else x. Node. get. Node(). set. Nil(nod. Skr. get. Nil()+x. Node. get. Panjang()); if(inc == 0){ nod. Next = x. Node. get. Node(); inc++; }else if(x. Node. get. Node(). get. Nil() < nod. Next. get. Nil()) nod. Next = x. Node. get. Node(); } nod. Skr. set. Kunjung(true); nod. Skr = nod. Next; list. Path. add(nod. Skr); } for(Node nod : list. Path) System. out. print(nod. get. Label()+", ");
- Slides: 26