Anda di halaman 1dari 12

GRAPH

Oleh: Kelompok 1 Muh. Fiqri Noeralif Putra (D421 08 114) Fairuz (D421 8 107) Farhan M. (D421 08 257) Muh. Fachmi Yusuf (D421 08 101) Ichi Dian Purnamasari (D421 08 109) Irzan Ansyar (D421 08 282) Faizal Gazali (D421 08 252) David Rudi (D421 08 )

A. Muh. Late (D421 08 116)

UNIVERSITAS HASANUDDIN FAKULTAS TEKNIK JURUSAN TEKNIK INFORMATIKA 2009

BAB 1 LANDASAN TEORI


Graf Graf adalah kumpulan simpul (vertices atau nodes) yang dihubungkan satu sama lain melalui sisi/busur (edges). Perbedaan graf dengan pohon, pada graf mungkin terjadi siklus (cycle) dan graf dapat terdiri lebih dari satu sambungan Aplikasi graf : Contoh : hubungan antara kota-kota dalam suatu negara, dimana simpul mewakili kota dan busur mewakili jalan yang menghubungkan antara 2 kota. Jadi dapat digunakan untuk mencari lintasan terpendek (shortest path).

Graf G terdiri dari dua himpunan yaitu himpunan V dan himpunan E. Verteks (simpul) : V = himpunan simpul yang tebatas dan tidak kosong. Edge (sisi/busur) : E = himpunan busur yang menghubungkan sepasang simpul. Simpul-simpul pada graf dapat merupakan obyek sembarang seperti kota, atom-atom suatu zat, nama anak, jenis buah, komponen alat elektronik, dan sebagainya. Busur dapat menunjukkan hubungan (relasi) sembarang seperti rute penerbangan, jalan raya, sambungan telepon, ikatan kimia, dan lain sebagainya. Notasi graph : G(V,E) artinya graf G memiliki V simpul (mode) dan E busur (edge). Ada 2 jenis graf : Graf berarah (directed graph): tiap busur (edge) mempunyai anak panah, (V1, V2) (V2, V1)

Graf berarah Graf tak berarah (undirected graph) : tiap busur tidak mempunyai anak panah. (V1, V2) = (V2, V1)

Graf tidak berarah Contoh: G1 1 G1 : graf tidak berarah V(G1) = {1,2,3,4} (1,2) = (2,1) 3 E(G1) = { (1,2), (1,3), (1,4), (2,4), 4 (2,3), (3,4) }

G2

G2 : graf berarah <1,2> <2,1>

2 3 Sub graph dari G :

V(G2) = {1,2,3} E(G2) = {<1,2> , <2,1> , <2,3>}

Graf G adalah subgraf dari G jika V(G) < V(G) dan E(G) < E(G), atau dengan kata lain subgraf dari suatu graf adalah graf yang setiap simpulnya merupakan simpul graf semula dan setiap busurnya adaah busur dari graf semula juga. Contohnya : Contoh: G1 1 1 2 1 3 4 3

4 Lintasan (path) adalah kumpulan busur (edge) yang menghubungkan antara satu simpul (node) dengan simpul yang lainnya, atau dengan kata lain lintasan dari simpul Vp ke Vq dalam G.

Panjang lintasan adalah banyaknya busur dalam lintasan tersebut Lintasan sederhana (simple path) : lintasan dengan semua simpul yang berbeda, kecuali simpul pertama dan terakhir. Siklus (cycle) : lintasan sederhana dengan simpul pertama = simpul terakhir. Pohon (tree) : graf terhubung yang tidak mengandung siklus.

Simpul V1 dan V2 disebut terhubung jika untuk setiap pasang simpul V1, V2 dalam V(G) terdapat suatu jalur dari V1 ke V2. Contoh :

1 1 1 2 3 1 1 Lintasan (path) dan siklus (cycle) pada sebuah graf 1

Contoh graf diatas, terdapat contoh siklus sederhana yaitu : (1,2,3,1), (5,6,7,4) dan (4,6,7,4). Sedangkan contoh lintasan yang bukan merupakan siklus adalah (1,2,4,6,8). Sedangkan contoh siklus tidak sederhana adalah (4,5,6,7,6,4). 2.1 Representasi Graf 2.1.1. Matriks kedekatan (Adjacency Matrices) Untuk suatu graf dengan jumlah simpul sebanyak n, maka matriks kedekatan mempunyai ukuran n x n (n baris dan n kolom). Jika antara dua buah simpul terhubung maka elemen matriks bernilai 1, dan sebaliknya bernilai 0 bila tidak terhubung. Contoh : 1 1 2 3 4 0 1 1 1 2 1 0 1 1 3 1 1 0 1 4 1 1 1 0 1 2 3 1 0 1 0 2 1 0 0 3 0 1 0

Matriks kedekatan untuk graf berarah kedekatan untuk graf tidak berarah

Matriks

Matriks kedekatan untuk graf berarah bersifat simetris Matriks kedekatan untuk graf tidak berarah belum tentu simetris

Ruang (memori) yang diperlukan untuk matriks kedekatan :

n x n = (N2) Tetapi untuk graf tidak berarah : N2 N Untuk graf tak berarah : Derajat simpul i = Ruang yang diperlukan = N2 N

- Derajat simpul berarah :


n

Derajat simpul i = A[i,j]


j=1

Untuk graf berarah : - Derajat luar (out degree) = jumlah dalam 1 baris (matriks) atau banyaknya busur dengan simpul V sebagai kepala. - Derajat dalam (in degree) = jumlah dalam 1 kolom (matriks) atau banyaknya busur dengan simpul V sebagai ekor.

Contoh graf & matriks kedekatan:


4 3 2 1

1 1 2
5

2 1 0 1 0 1

3 1 1 0 0 1

4 1 0 0 0 0

5 0 1 1 0 0

0 1 1 1 0

3 4 5

2.1.2. Senarai Kedekatan (Adjacency List) Pada simpul x dapat dianggap sebagai suatu senarai yang terdiri dari simpul pada graf yang berdekatan dengan x. Representasi senarai kedekatan mempunyai kesamaan fleksibilitas dengan matriks kedekatan, akan tetapi representasi ini lebih tersusun rapi. Ruang (memori) yang diperlukan untuk n simpul dan e sisi pada graf tidak berarah = n head node + 2e node list. Senarai kedekatan untuk graf ABCDEFG dapat dilihat pada gambar

Senarai kedekatan graf ABCDEFG


2.1.3. Representasi Senarai (List Orthogonal) atau Matriks Jarang (Sparse Matrix) yaitu untuk graf berarah Head Tail Column link head Row link tail

1 2

3 3 2.2 APLIKASI GRAF Dikenal 3 contoh aplikasi yang berkaitan dengan masalah lintasan pada satu graf yaitu persoalan lintasan terpendek (shortest salesman) dan pengantar pos China (Chinese postman), untuk lebih jelasnya dapat dilihat pada contoh graf gambar 9.6.

Untuk persoalan pertama dan kedua, gambar di bawah ini menunjukkan peta perjalanan antar kota dengan simpul sebagai kota dan sisi sebagai jalan antar kota. Sedangkan untuk persoalan ketiga, gambar di atas menunjukkan peta dalam kota. 1. lintasan terpendek : yang dicari adalah suatu lintasan terpendek (jarak terpendek) pada graf yang menghubungkan simpul (kota) A dan D. Misalkan tidak diharuskan melalui semua sisi maupun simpul, maka lintasan terpendek pada graf tersebut adalah : A -> B -> F -> C -> D yang panjangnya adalah 10 Salah satu contoh algoritma lintasan terpendek adalah algoritma Dijkstra. 2. pedagang keliling : yang dicari adalah suatu siklus terpendek yang melalui semua simpul pada graf masing-masing tepat satu kali. Jadi pedagang tersebut harus mengunjungi semua simpul (kota) dan kembali ke simpul awal dan berusaha agar jarak tempuhnya terpendek, yaitu : A > B -> E -> D -> C -> F -> A 3. pengantar pos China : pekerjaan pengantar pos adalah mengantar surat dengan keharusan melalui semua jalan yang ada pada daerah tersebut dan kembali ke tempat awal. Untuk gambar graf di atas, maka jawabannya adalah : A -> B -> C -> D -> E -> F -> C -> E -> B -> F -> A

PEMBAHASAN

Pada pembahasan kali ini, kami akan mencoba menjelaskan pemakaian teori graf dengan memakai bahasa PHP.

Disini kami sudah membuat node-node dan jalur-jalurnya. Untuk mengetahui jalur apa saja yang kita gunakan untuk sampai ke node atau titik terakhir kita pertama-tama kita masukkan dari mana kita akan mulai. Dilihat dari program tersebut maka algoritma dari prograrmnya adalah:

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}

Disini kita memakai algoritma Dijkstra untuk Kompleksitas waktu algoritma (Running time) :

Algoritma Dijkstramenggunakan 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 Untuk lebih jelasnya mari kita liat listing dari program tersebut:

<?php /* djikstra alorithm, shortes path baco - 01/290407/TI/122 http://nyit-nyit.net seeker_beat@yahoo.com */

/* the graph array */ $graph['A'] = array('B' => 2, 'D' => 3); $graph['B'] = array('A' => 2, 'C' => 1, 'E' => 4); $graph['C'] = array('B' => 1, 'F' => 5); $graph['D'] = array('A' => 3, 'E' => 2); $graph['E'] = array('D' => 2, 'B' => 4, 'F' => 1 ,'K' => 15); $graph['F'] = array('C' => 5, 'E' => 1); $graph['K'] = array('E' => 15); function dijkstra($graph, $start , $end = null) { if($start == $end) { return 'node awal dan node akhir tidak boleh sama'; } elseif(!isset($graph[$start])) { return 'node awal tidak terdapat dalam graph yang dimasukan'; } elseif(!isset($graph[$end])) { return 'node akhir tidak terdapat dalam graph yang dimasukan'; }

$posisi = $start; while (isset($posisi)) {

//menandai bahwa posisi yang sekarang sudah dikunjungi $dikunjungi[$posisi] = 1; /*looping pada setiap vertex yang ada diposisi sekarang lalu menyimpan jarak dan route pada array */ foreach ($graph[$posisi] as $vertex => $distance) { /* kalo sudah pernah dikunjungi, lewati proses dibawahnya kemudian akses vertex berikutanya */ if (isset($dikunjungi[$vertex])) continue; /* jarak dari $posisi ke $vertex */ $dist = (isset($paths[$posisi][0]) ? $paths[$posisi][0] : 0) + $distance; /* jika belum memiliki path ke $vertex maka dibuat dengan cara * pilih jarak yang paling pendek antar vertex */ //membuat tree yang menentukan jarak terpendek $bobot = (isset($tree[$posisi]['bobot']) ? $tree[$posisi]['bobot'] : 0) + $distance; $tree[$vertex]['bobot'] = $bobot; $tree[$vertex]['predesesor'] = $posisi; if (!isset($paths[$vertex]) || ($dist < $paths[$vertex][0])) { if (isset($paths[$posisi])) { $paths[$vertex]= $paths[$posisi]; } $paths[$vertex]['predesessor'] = $posisi; $paths[$vertex][0] = $dist; } } unset($posisi);

/* mencari node berikutnya yang akan kita kunjungi */ foreach ($paths as $vertex => $path) { if (isset($dikunjungi[$vertex])) continue; $distance = $path[0]; if ((!isset($min) || $distance < $min) || !isset($posisi)) { $min = $distance; $posisi = $vertex; } }

} //setelah tree terbentuk baru menampilkan hasil pencarian $ok = false; $pos = $end;

$jalur =''; while(!$ok) {

if(isset($tree[$pos]['predesesor'])) { $pos = $tree[$pos]['predesesor']; if($pos == $start) $jalur = $pos. ''.$jalur; else $jalur = '-'.$pos.$jalur; } else { $ok = true; } } return 'Jalur terpendek adalah : '.$jalur.'-'.$end; }

if(isset($_POST['btnsubmit'])) $result = dijkstra($graph, strtoupper($_POST['node_awal']),strtoupper($_POST['node_akhir'])); ?> <html> <head> </head> <body> <pre>

B-------C /\ 1 \ 2/ \ \5 / \ \ A \4 F G \ \ / 3\ \ /1 \ \/ D-------E-------------- K 2 15 diketahui graph dengan bentuk sebagai berikut.silahkan masukan node awal dan node akhir untuk mencari path terpendek <hr /> <form method="post" action="" > node awal : <input type="text" name="node_awal" size="5"/> <br /> node akhir : <input type="text" name="node_akhir" size="5"/> <input type="submit" value="cari" name="btnsubmit"/> </form> <?php if(isset($result)) echo '<div style="color:red">'.$result.'</div>'; ?> </pre> </body> </html>

Anda mungkin juga menyukai