PERBANDINGAN ALGORITMA GREEDY DAN DIJKST

PERBANDINGAN ALGORITMA GREEDY DAN DIJKSTRA UNTUK MENENTUKAN LINTASAN TERPENDEK SKRIPSI HENNY SYAHRIZA LUBIS 051411009 DEPARTEMEN MATEMATIKA FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SUMATERA UTARA MEDAN 2009

PERBANDINGAN ALGORITMA GREEDY DAN DIJKSTRA UNTUK MENENTUKAN LINTASAN TERPENDEK SKRIPSI

Diajukan untuk melengkapi tugasakhir dan memenuhi syarat mencapai gelar Sarjana Sains HENNY SYAHRIZA LUBIS 051411009 DEPARTEMEN MATEMATIKA FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SUMATERA UTARA MEDAN 2009

PERSETUJUAN

Judul : PERBANDINGAN ALGORITMA GREEDY DAN DIJKSTRA UNTUK MENENTUKAN LINTASAN TERPENDEK

: HENNY SYAHRIZA LUBIS

Nomor Induk Mahasiswa : 051411009 Program Studi

: SARJANA (S1) MATEMATIKA

Departemen

: MATEMATIKA

Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA

Diluluskan di Medan, 20 Maret 2009

Komisi Pembimbing

Pembimbing 2,

Pembimbing1,

Drs. Marwan Harahap, M.Eng. Drs. Sawaluddin,M.IT. NIP.130422437

NIP.132206398

Diketahui/Disetujui oleh Departemen Matematika FMIPA USU Ketua

Dr.Saib Suwilo,M.Sc. NIP.131796149

PERNYATAAN PERBANDINGAN ALGORITMA GREEDY DAN DIJKSTRA UNTUK MENENTUKAN LINTASAN TERPENDEK SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil kerja saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing disebutkan sumbernya.

Medan, 20 Maret 2009

Henny Syahriza Lubis 051411009

PENGHARGAAN

Puji dan syukur penulis panjatkan kehadirat Tuhan Yang Maha Pemurah dan Maha Penyayang, dengan limpahan rahmat dan karunia-Nya skripsi ini berhasil diselesaikan dalam waktu yang telah ditetapkan.

Ucapan terimakasih saya sampaikan kepada Bapak Drs. Syawaluddin, M.IT dan Bapak Drs. Marwan Harahap, M.Eng, selaku pembimbing pada penyelesaian skripsi ini yang telah memberikan panduan dan penuh kepercayaan kepada saya untuk menyempurnakan skripsi ini. Panduan ringkas, padat dan profesional telah diberikan kepada saya agar penulis dapat menyelesaikan tugas ini. Ucapan terima kasih juga ditujukan kepada Ketua dan Sekretaris Departemen Dr. Saib Suwilo, M.Sc. dan Bapak Drs. Henri Rani Sitepu, M.Si., Dekan dan Pembantu Dekan Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Sumatera Utara, semua dosen pada Departemen Matematika FMIPA USU, Pegawai di FMIPA USU, rekan-rekan kuliah. Akhirnya tidak terlupakan kepada bapak, ibu dan semua ahli keluarga yang selama ini memberikan bantuan dan dorongan yang diperlukan. Semoga Tuhan Yang Maha Esa membalasnya.

ABSTRAK

Algortima Dijkstra dan Algoritma Greedy merupakan algoritma untuk menemukan jarak terpendek dari suatu verteks ke verteks yang lainnya pada suatu graph yang berbobot, di mana jarak antar verteks adalah bobot dari tiap edge atau arc pada graph tersebut. Algoritma Dijkstra dan Greedy merupakan algoritma yang setiap langkahnya mengambil edge atau arc yang berbobot minimum yang menghubungkan sebuah verteks yang sudah terpilih dengan sebuah verteks lain yang belum terpilih, dan implementasinya dengan menggunakan bahasa pemograman Visual Basic 6.0.

COMPARASION OF DIJKSTRA AND GREEDY ALGORITHMS FOR CHOOSE THE SHORTEST PATH. ABSTRACT

Dijkstra Algorithms and Greedy Algorithms is an algorithms to find the shortest path from a vertex to the another one in a weighted graph, where the distance between the vertex is the weight from each edge or arc of it. Dijkstra Algorithms and Greedy is a algorithm which every step of the process takes a edge or arc that has the minimum value weight that connects a vertex which has been chosen with another vertex that has not been chosen, and the implementation would use Visual Basic 6.0

DAFTAR ISI

Halaman

Persetujuan ii Pernyataan

iii Penghargaan

iv Abstrak

v Abstract

vi Daftar Isi

vii Daftar Tabel

ix Daftar Gambar

Bab 1 Pendahuluan

1.1 Latar Belakang

1.2 Perumusan Masalah

1.3 Pembatasan Masalah

1.4 Tujuan Penelitian

1.5 Kontribusi Penelitian

1.6 Metode Penelitian

1.7 Tinjauan Pustaka

Bab 2 Landasan Teori

2.1 Teori Dasar Graph

2.1.1 Graph Berarah

2.1.2 Graph Tak Berarah

2.1.3 Graph Berbobot

2.1.4 Refrentasi Graph Dalam Matriks

2.2 Lintasan ( Path )

2.2.1 Path Minimum

2.2.2 Lintasan Terpendek ( Shortest Path )

2.3 Algoritma Greedy

2.3.1 Cara Kerja Algoritma Greedy

2.3.2 Pseudocode Algoritma Greedy

2.4 Algoitma Dijkstra

2.4.1 Sejarah Algoritma Dijkstra

2.4.2 Cara Kerja Algoritma Dijkstra

23

Bab 3 Pembahasan

23

3.1 Implementasi Algoritma Greedy

23

3.1.1 Pemeriksaan Verteks dan Lintasan Pertama

25

3.1.2 Input Graph

27

3.1.3 Proses Graph

29

3.2 Prosedure Algoritma Greedy

31

3.3 Flowchart Algoritma Greedy

32

3.4 Implementasi Algoritma Dijkstra

42

3.4.1 Input Graph

44

3.4.2 Proses Graph

46

3.5 Prosedure Algoritma Dijkstra

48

3.6 Flowchart Algoritma Dijkstra

49

3.7 Flowchart Program

50

3.7.1 Halaman Utama

51

3.7.2 Halaman Komputasi

55

3.7.3 Halaman Hasil

57

3.7.4 Kebutuhan Perangkat

59

Bab 4 Kesimpulan dan Saran

Daftar Pustaka

61

Lampiran Listing Program

DAFTAR TABEL

Halaman

Tabel 3.1 Hasil Iterasi ke 1

33 Tabel 3.2 Hasil Iterasi ke 2

34 Tabel 3.3 Hasil Iterasi ke 3

34 Tabel 3.4 Hasil Iterasi ke 4

35 Tabel 3.5 Hasil Iterasi ke 5

35 Tabel 3.6 Hasil Iterasi ke 6

36 Tabel 3.7 Hasil Iterasi ke 7

37 Tabel 3.8 Hasil Iterasi ke 8

37 Tabel 3.9 Hasil Iterasi ke 9

38 Tabel 3.10 Hasil Iterasi ke 10

39 Tabel 3.11 Hasil dari seluruh tabel

39 Tabel 3.12 Beda Jarak Lintasan Terpendek Algoritma Greedy dan Dijkstra

57

DAFTAR GAMBAR

Halaman

Gambar 2.1 Graph Berarah atau Digraph

7 Gambar 2.2 Graph Berarah

8 Gambar 2.3 Graph Tak Berarah

9 Gambar 2.4 Graph Berarah Berbobot

9 Gambar 2.5 Graph Tidak Berarah dan Tidak Berbobot

10 Gambar 2.6 Graph Dengan 4 Buah Verteks

12 Gambar 2.7 Graph Dengan 6 Verteks dan 10 Edge

13 Gambar 2.8 Shortest Path(Garis Tebal)

15 Gambar 3.1 Graph Untuk Algoritma Greedy

23 Gambar 3.2 Lintasan 1 Algoritma Greedy

24 Gambar 3.3 Lintasan 2 Algoritma Greedy

24 Gambar 3.4 Lintasan 3 Algoritma Greedy

25 Gambar 3.5 Flowchart Algoritma Greedy

31 Gambar 3.6 Graph Untuk Algoritma Dijkstra

32 Gambar 3.7 Node Terpilih Pada Iterasi ke 1

33 Gambar 3.8 Node Terpilih Pada Iterasi ke 2

34 Gambar 3.9 Node Terpilih Pada Iterasi ke 3

34 Gambar 3.10 Node Terpilih Pada Iterasi ke 4

35 Gambar 3.11 Node Terpilih Pada Iterasi ke 5

36 Gambar 3.12 Node Terpilih Pada Iterasi ke 6

36 Gambar 3.13 Node Terpilih Pada Iterasi ke 7

37 Gambar 3.14 Node Terpilih Pada Iterasi ke 8

38 Gambar 3.15 Node Terpilih Pada Iterasi ke 9

38 Gambar 3.16 Node Terpilih Pada Iterasi ke 10

39 Gambar 3.17 Flowchart Algoritma Dijkstra

48 Gambar 3.18 Flowchart Aplikasi Algoritma Greedy dan Dijkstra

49 Gambar 3.19 Perancangan Diagram Halaman Utama

50 Gambar 3.20 Tampilan Output Halaman Utama

50 Gambar 3.21 Perancangan Diagram Halaman Komputasi

51 Gambar 3.22 Tampilan Menu Perancangan Lintasan Terpendek

51 Gambar 3.23 Tampilan Menu Peta

52 Gambar 3.24 Tampilan Menu Graph

52 Gambar 3.25 Tampilan Menu Cari Lintasan Terpendek

53 Gambar 3.26 Tampilan Menu Editor Titik

Gambar 3.27 Tampilan Menu Editor Jalan

54 Gambar 3.28 Tampilan Menu Editor Hapus

54 Gambar 3.29 Tampilan Menu Editor Tambah Caption

55 Gambar 3.30 Implementasi Form Graph Algoritma Dijkstra

55 Gambar 3.31 Implementasi Form Hasil Komputasi Algoritma Dijkstra

56 Gambar 3.32 Implementasi Form Graph Algoritma Greedy

56 Gambar 3.33 Implementasi Form Hasil Komput asi Algoritma Greedy

56 Gambar 3.34 Grafik Lama Proses Pencarian Lintasan Terpendek Algoritma Greedy dan Dijkstra

1.1 Latar Belakang

Dalam kehidupan, sering dilakukan perjalanan dari suatu tempat atau kota ke tempat yang lain dengan mempertimbangkan efisiensi, waktu dan biaya sehingga diperlukan ketepatan dalam menentukan jalur terpendek antar suatu kota. Hasil penentuan jalur terpendek akan menjadi pertimbangan dalam pengambilan keputusan untuk menunjukkan jalur yang ditempuh. Hasil yang didapatkan juga membutuhkan kecepatan dan keakuratan dengan bantuan komputer.

Secara umum, pencarian jalur terpendek dapat dibagi menjadi 2(dua) metode, yaitu: metode konvensional dan metode heuristik. Metode konvensional merupakan metode yang menggunakan perhitungan matematik biasa, pada pencarian lintasan terpendek hanya dapat diselesaikan untuk 5(lima) sampai 10(sepuluh) verteks, untuk verteks yang lebih banyak metode heuristik lebih variatif dan waktu perhitungan yang diperlukan lebih singkat, karena metode heuristik menggunakan metode pendekatan dan melakukan pencarian.

Untuk menggunakan atau memfungsikan sebuah komputer harus terdapat program yang terdistribusi di dalamnya, tanpa program tersebut komputer hanyalah menjadi sebuah kotak yang tak berguna. Program yang terdapat pada komputer sangat bervariasi dan setiap program tersebut pasti menggunakan algoritma.

Algoritma merupakan kumpulan perintah untuk menyelesaikan suatu masalah. Perintah-perintahnya dapat diterjemahkan secara bertahap dari awal hingga akhir. Masalah tersebut dapat berupa apapun dengan catatan untuk setiap masalah, memiliki kriteria kondisi awal yang harus dipenuhi sebelum menjalankan algoritma.

Algoritma yang akan dipergunakan untuk mencari lintasan terpendek dalam hal ini adalah algoritma Greedy dan algoritma Dijkstra, algoritma Dijkstra merupakan algoritma yang paling terkenal untuk mencari lintasan terpendek yang diterapkan pada graph berarah dan berbobot, di mana jarak antar verteks adalah bobot dari tiap arc pada graph tersebut. Selain algoritma Dijkstra, algoritma Greedy merupakan salah satu metode untuk memecahkan masalah optimasi, juga merupakan program yang dapat memecahkan masalah langkah demi langkah, yang pada setiap langkahnya mengambil pilihan yang terbaik yang diperoleh saat itu tanpa memperhatikan konsekuensi ke depannya dengan gagasan dasar adalah membangun solusi besar diatas solusi kecil.

1.2 Perumusan Masalah

Perumusan masalah yang akan diteliti dalam tulisan ini adalah bagaimana mengimplementasikan algoritma Greedy dan algoritma Dijkstra sehingga diperoleh algoritma yang tepat dan akurat untuk menyelesaikan masalah lintasan terpendek.

1.3 Pembatasan Masalah

Dalam melakukan perbandingan algoritma Greedy dan algoritma Dijkstra dilakukan beberapa batasan sebagai berikut:

1. Algoritma Greedy dan Dijkstra yang digunakan dibatasi pada permasalahan shortest path saja, dengan input graph yang terdiri dari jumlah titik, nama dan koordinat titik. Letak titik dapat dibangkitkan secara acak maupun manual.

2. Bobot antar titik yang ditentukan hanyalah bobot jarak. Dengan mengabaikan bobot-bobot lainnya. Sehingga jalur terpendek berdasarkan jarak terpendek antar titik.

3. Keluaran yang dihasilkan adalah hasil dari algoritma Greedy dan Dijkstra yang diimplementasikan dalam suatu program sederhana dengan menggunakan aplikasi Visual Basic 6.0

1.4 Tujuan Penelitian

Penelitian ini bertujuan untuk membandingkan pencarian lintasan terpendek manakah yang lebih baik dari implementasi algoritma Greedy dan algoritma Dijkstra.

1.5 Kontribusi Penelitian

Dengan membandingkan algoritma Greedy dan algoritma Dijkstra dapatlah diketahui metode mana yang baik untuk menentukan maksimal lintasan terpendek dari suatu titik ke titik yang lain. Hal ini dapat diaplikasikan dalam peta suatu daerah, sistem saluran air PDAM, sistem aliran listrik PLN dan sebagainya.

1.6 Metode Penelitian

Penelitian ini dilakukan dengan langkah-langkah sebagai berikut:

1. Menguraikan konsep algoritma Greedy dan Dijkstra dalam menentukan lintasan terpendek.

2. Mengimplementasikan algoritma Greedy dan Dijkstra ke dalam suatu program.

3. Melakukan analisa untuk membandingkan kinerja setiap algoritma berdasarkan kelebihan dan kemudahannya.

4. Membuat kesimpulan dan saran dari penelitian yang dilakukan.

1.7 Tinjauan Pustaka

Arief Lutfi Hendratmono (2008) dalam makalahnya menguraikan algoritma Dijkstra merupakan algoritma untuk menemukan jarak terpendek dari suatu verteks ke verteks yang lainnya pada suatu graph yang berbobot dengan menggunakan strategi Greedy. Algoritma ini menyelesaikan masalah mencari sebuah lintasan terpendek (sebuah lintasan yang mempunyai panjang minimum) dari verteks a ke verteks z dalam graph berbobot, bobot tersebut adalah bilangan positif jadi tidak dapat dilalui oleh edge(arc) negatif, jika dilalui oleh edge(arc) negatif, maka penyelesaian yang diberikan adalah infiniti.

Seymour Lipschutz dan Marc Lars dalam bukunya ”Matematika Diskrit 2”, definisi graph adalah bahwa sebuah graph terdiri dari 2(dua) bagian yaitu: sebuah himpunan V=V(G) memiliki elemen-elemen yang dinamakan verteks. Kemudian sebuah kumpulan E=E(G) atau A=A(G), merupakan pasangan tak berurut dari verteks-verteks yang berbeda dinamakan edge(arc). Sedangkan multigraph G=G(V,E) terdiri dari suatu himpunan V(verteks) dan suatu himpunan E(edge) kecuali E mengandung multiple edge, yaitu beberapa edge(arc) dengan menghubungkan titik- titik ujung yang sama, dan E mungkin mengandung satu atau lebih loop, yaitu sebuah edge yang titik-titik ujungnya adalah verteks yang sama.

Yeni Kurniasari (2006) dalam makalahnya menguraikan algoritma Greedy merupakan metode untuk menemukan solusi optimum dalam persoalan optimasi dengan solusi langkah perlangkah sebagai berikut:

1. Terdapat banyak pilihan yang perlu dikembangkan pada setiap langkah solusi. Oleh karena itu, pada setiap langkah harus dibuat keputusan yang terbaik dalam menentukan pilihan. Keputusan yang telah diambil pada suatu langkah tidak dapat diubah lagi pada langkah selanjutnya.

2. Pendekatan yang digunakan di dalam algoritma Greedy adalah membuat pilihan yang terlihat memberikan perolehan terbaik, yaitu dengan membuat pilihan optimum local pada setiap langkah dan diharapkan akan mendapatkan solusi optimum global. Algoritma Greedy didasarkan pada pemindahan edge(arc) per edge(arc) dan

pada setiap langkah yang diambil tidak memikirkan konsekuensi ke depan, Greedy tidak beroperasi secara menyeluruh terhadap semua alternatif solusi yang ada serta sebagian masalah Greedy tidak selalu berhasil memberikan solusi yang benar-benar optimum tapi memberikan solusi yang mendekati nilai optimum.

BAB 2 LANDASAN TEORI

2.1 Teori Dasar Graph

Sebuah graph G didefinisikan sebagai pasangan himpunan (V,E) di mana V= himpunan verteks {v 1 ,v 2 ,…,v n } dan E=himpunan edge(arc) yang menghubungkan verteks-verteks {e 1 ,e 2 ,…,e n } atau dapat ditulis dengan notasi G=(V,E)(Rinaldi Munir, 2006 hal: 291).

Berdasarkan orientasi arah pada sisi, graph dapat dibedakan atas dua jenis yaitu (Rinaldi Munir, 2006 hal: 294):

2.1.1 Graph berarah (directed graph atau digraph)

Pada graph tak berarah (undirected graph) elemen dari E disebut dengan edge, sedangkan pada graph berarah (directed graph) elemen dari E(A) disebut dengan arc. Graph berarah G terdiri dari suatu himpunan V dari verteks-verteks dan suatu himpunan E(A) dari arc sedemikian rupa sehingga setiap arc a ε A menghubungkan pasangan verteks terurut. Jika terdapat sebuah arc a yang menghubungkan pasangan terurut (v,w) dari verteks-verteks, maka dapat ditulis dengan a=(v,w), yang menyatakan sebuah arc dari v ke w.

v 1 v 4 a4 v 5 a1 a5 a3 a6

v 2 a2 v 3

Gambar 2.1 Graph Berarah atau Digraph

Digraph pada Gambar 2.1 adalah graph berarah dengan himpunan verteks-verteks V(G)={v 1 ,v 2 ,v 3 ,v 4 ,v 5 } dan himpunan arc-arc A(G)={a 1 ,a 2 ,a 3 ,a 4 ,ae 5 ,a 6 } yaitu pasangan terurut dari {(v 1 ,v 2 ), (v 2 ,v 3 ), (v 3 ,v 4 ), (v 4 ,v 5 ), (v 5 ,v 1 ), (v 2 ,v 5 )}.

Pada suatu graph jika dua buah verteks v 1 dan v 2 dihubungkan oleh suatu edge(arc), maka kedua verteks tersebut dikatakan adjacent. Pada Gambar 2.1 verteks v 1 adjacent (bertetangga) dengan verteks v 2 . Sementara itu, arc a 1 dikatakan incident (bersisian)

dengan verteks v 1 dan verteks v 2 .

Matriks yang bersesuaian dengan graph berlabel G adalah matriks adjacency A=(a ij ), dengan a ij = nilai arc yang menghubungkan verteks v i dengan verteks v j . Jika titik v i tidak berhubungan langsung dengan titik v j , maka a ij = ∞, dan jika i = j, maka a ij =0.

Misalkan G adalah sebuah graph berarah. Sebuah arc berarah a=[u,v] dikatakan mulai pada verteks awal u dan berakhir di verteks akhir v, u dan v dikatakan adjacent.

Derajat luar dari v, (outdeg (v)) adalah jumlah arc yang berawal pada v, dan derajat dalam dari v (indeg (v)) adalah jumlah arc yang berakhir di v.Karena setiap arc mulai Derajat luar dari v, (outdeg (v)) adalah jumlah arc yang berawal pada v, dan derajat dalam dari v (indeg (v)) adalah jumlah arc yang berakhir di v.Karena setiap arc mulai

Gambar 2.2 Graph Berarah

Gambar 2.2 terdiri dari:

Verteks

A B C D E F G Derajat-dalam (indegree)

0 2 2 4 1 1 2 Derajat-luar (outdegree)

Jumlah derajat dalam dan jumlah derajat luar sama dengan 12 yaitu jumlah busur.

Graph pada Gambar 2.2 verteks A adalah sumber (source) karena arc-nya berawal pada A tetapi tidak berakhir di A. Sedangkan C dan D adalah verteks tujuan (sink) karena arc-nya berakhir di C dan di D tetapi tidak berawal di verteks itu.

2.1.2 Graph tak berarah (Undirected Graph)

Graph tak berarah G terdiri dari suatu himpunan V dari verteks-verteks dan suatu himpunan E dari edge-edge sedemikian rupa sehingga setiap sisi e ε E dikaitkan Graph tak berarah G terdiri dari suatu himpunan V dari verteks-verteks dan suatu himpunan E dari edge-edge sedemikian rupa sehingga setiap sisi e ε E dikaitkan

Gambar 2.3 Graph tak Berarah

Graph pada Gambar 2.3 adalah graph tak berarah dengan himpunan verteks-verteks V(G) = {v 1 ,v 2 ,v 3 ,v 4 ,v 5 } dan himpunan sisi E(G) = {e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6 } yaitu pasangan tak terurut dari {(v 1 ,v 2 ), (v 2 ,v 3 ), (v 3 ,v 4 ), (v 4 ,v 5 ), (v 5 ,v 2 )}.

2.1.3 Graph Berbobot (Weight Graph)

Dalam memodelkan suatu masalah ke dalam graph, ada informasi yang ditambahkan pada arc graph. Misalnya pada graph yang menggambarkan peta jalan raya antara kota-kota, dapat ditambahkan sebuah bilangan pada setiap arc untuk menunjukkan jarak antara kedua kota yang dihubungkan oleh arc tersebut. Graph berbobot (weighted graph) adalah suatu graph tanpa arc paralel dimana setiap arc-nya berhubungan dengan suatu bilangan riil tak negatif yang menyatakan bobot arc (w(a)) tersebut (Jong Jek Siang, 2002, hal: 262).

Gambar 2.4 Graph Berarah Berbobot

Graph tidak berarah dan tidak berbobot: tiap busur tidak mempunyai anak panah dan tidak berbobot.

Gambar 2.5 Graph tidak berarah dan tidak berbobot

2.1.4 Representasi Graph dalam Matriks

Matriks dapat digunakan untuk menyatakan suatu graph, Kemudian graph direpresentasikan pada matriks, yang dapat dibedakan sebagai berikut:

1. Matriks Adjacency

Misalkan G adalah graph berarah yang terdiri dari n verteks tanpa arc paralel. Matriks Adjacency pada graph G adalah matriks bujur sangkar n x n, A= (a ij ) dengan

  1 ada arc dari titik v i ke titik v a j ij = 

0 tidak ada arc dari titik v i ke  titik v j

Matriks adjacency dari graph Gambar 2.3 adalah:

A=

Jika graph yang diberikan adalah graph berbobot, maka elemen matriks yang terhubung antara verteks adalah bobot graph.

2. Matriks Incidency

Matriks incidency atau matriks bersisian adalah matriks yang merepresentasikan hubungan antara verteks dan edge(arc). Misalkan B adalah matriks dengan m baris untuk setiap verteks dan n kolom untuk setiap edge(arc). Jika verteks terhubung dengan edge(arc), maka elemen matriks bernilai 1. Sebaliknya, jika verteks tidak terhubung dengan edge(arc), maka elemen matriks bernilai 0.

Matriks bersisian dari graph Gambar 2.3 adalah:

B=

2.2 Lintasan (Path)

Misalkan v 0 dan v n adalah verteks-verteks dalam sebuah graph. Sebuah lintasan dari v 0 ke v n dengan panjang n adalah sebuah barisan berselang-seling dari n+1 verteks dan

n edge yang berawal dengan verteks v 0 dan berakhir dengan verteks v n , yang berbentuk (v 0 ,e 1 ,v 1 ,e 2 ,v 2 …v n-1 ,e n ,v n ) dengan edge e i insiden pada verteks v i -1 dan v i untuk i=1,…,n (Richard Johnsonbaugh, 1998, hal: 75).

Jika semua verteks berbeda (setiap edge(arc) dilewati hanya satu kali), maka suatu lintasan dikatakan sederhana (simple path). Jika sebuah lintasan yang berawal dan berakhir pada verteks yang sama, v 0 =v n , maka disebut lintasan tertutup (close path). Jika verteks awal dan verteks akhir dari lintasan tersebut berbeda, maka sebuah lintasan dikatakan lintasan terbuka (open path).

Panjang lintasan pada graph adalah banyaknya edge(arc) dalam lintasan tersebut. Pada graph berarah, lintasan harus mengikuti arah arc.

Gambar 2.6 Graph dengan Empat Buah Verteks

Pada Gambar 2.6:

Lintasan v 1 ,v 2 ,v 3 ,v 4 = lintasan sederhana dengan panjang lintasan 3(tiga). Lintasan v 1 ,v 2 ,v 3 ,v 4 ,v 1 = lintasan tertutup dengan panjang lintasan 4(empat). Lintasan v 1 ,v 2 ,v 3 ,v 1 ,v 4 = lintasan terbuka dengan panjang lintasan 4(empat).

Jika terdapat lintasan dari v i ke v j , maka suatu graph G dikatakan terhubung. Pada graph berarah, jika setiap pasang dari verteks v i dan v j terdapat sebuah lintasan dari v i ke v j dan dari v j ke v i , maka suatu graph dikatakan terhubung kuat (strongly connected). Jika verteks-verteks dalam sebuah graph sebagai kota-kota dan arc-arc sebagai jalan, maka sebuah lintasan berhubungan dengan sebuah perjalanan berawal pada suatu kota, melalui beberapa kota dan berakhir di suatu kota.

2.2.1 Path Minimum

Salah satu aplikasi graph berarah berlabel yang sering dipakai adalah mencari path terpendek di antara 2 verteks. Jika masalahnya adalah mencari jalur tercepat, maka path terpendek tetap dapat digunakan dengan cara mengganti nilai edge.

Misalkan G adalah suatu graph, dimana v dan w adalah 2 (dua) verteks dalam G. Suatu Walk dari v ke w adalah barisan verteks-verteks berhubungan dan edge secara berselang-seling, diawali dari verteks v dan diakhiri pada verteks w. Walk dengan

panjang n dari v ke w ditulis : v 0 e 1 v 1 e 2 v 2 …v n-1 e n v n dengan v 0 = v; v n = w; v i-1 dan v i adalah verteks-verteks ujung edge e i.

Path dengan panjang n dari v ke w adalah walk dari v ke w yang semua edge-nya berbeda. Path dari v ke w dituliskan sebagai v = v 0 e 1 v 1 e 2 v 2 …v n-1 e n v n = w dengan

e i ≠e j untuk i ≠ j.

Lintasan adalah suatu barisan edge ( e i 1 , e i 2 ,......... ., e i k ) sedemikian rupa sehingga

verteks terminal e i j berimpit dengan verteks awal e i ( j + 1 ) untuk 1 ≤ j ≤ k – 1.

e 7 e 10

Gambar 2.7 Graph dengan 6 verteks dan 10 edge

Pada Gambar 2.7 terdapat:

a. v 1 e 1 v 2 e 3 v 3 e 4 v 3 e 5 v 4 , barisan ini merupakan Path dari v 1 ke v 4 dengan panjang

4. Semua edge berbeda (e 1 ,e 3 ,e 4 , dan e 5 masing-masing muncul sekali). Ada verteks yang berulang (v 3 muncul 2 kali). Verteks awal dan verteks akhir tidak

sama (verteks awal = v 1 dan verteks akhir = v 4 ).

b. v 1 e 1 v 2 e 3 v 3 e 5 v 4 e 5 v 3 e 6 v 5, barisan ini merupakan walk dari v 1 ke v 5 dengan panjang 5. Ada edge yang muncul lebih dari sekali, yaitu e 5 (muncul 2 kali).

2.2.2 Lintasan Terpendek (Shortest Path)

Persoalan mencari lintasan terpendek di dalam graph merupakan salah satu persoalan optimasi. Graph yang digunakan dalam mencari lintasan terpendek adalah graph berbobot. Bobot pada sisi graph dapat menyatakan jarak antar kota, waktu, Persoalan mencari lintasan terpendek di dalam graph merupakan salah satu persoalan optimasi. Graph yang digunakan dalam mencari lintasan terpendek adalah graph berbobot. Bobot pada sisi graph dapat menyatakan jarak antar kota, waktu,

Misalkan lubang-lubang pada sebuah lempengan logam adalah verteks-verteks pada graph yang bersesuaian, maka setiap pasangan verteks-verteks dihubungkan dengan sebuah edge(arc) yang terdiri dari bobot waktu untuk memindahkan alat pembor di antara lubang-lubang yang berhubungan. Untuk menghemat waktu dan biaya, alat pembor harus digerakkan secepat mungkin. Sebuah lintasan dengan panjang minimum yang mengunjungi verteks tepat satu kali mewakili lintasan optimal yang dijalani alat pembor. Misalkan dalam masalah ini lintasan diperlukan untuk memulai pada verteks a dan berakhir pada verteks e. Lintasan dengan panjang minimum dapat ditemukan dengan mendaftar semua lintasan yang mungkin dari a ke

e yang melalui setiap verteks tepat satu kali dan memilih yang terpendek.

Dalam beberapa hal, panjang sebenarnya mewakili biaya atau beberapa nilai lainnya. Panjang dari lintasan adalah menentukan panjang jumlah dari masing-masing edge(arc) yang terdiri dari lintasan. Untuk verteks s dan t dalam G, ada beberapa lintasan dari s ke t. Masalah lintasan terpendek meliputi pencarian lintasan dari s ke t yang mempunyai lintasan terpendek dengan bobot terkecil.

Lintasan terpendek antara 2(dua) verteks dari s ke t dalam jaringan adalah lintasan graph berarah sederhana dari s ke t dengan sifat dimana tidak ada lintasan lain yang memiliki nilai terendah.

Henny Syahriza Lubis : Perbandingan Algoritma Greedy Dan Dijkstra Untuk Menentukan Lintasan Terpendek, 2009. X 7

Gambar 2.8 Shortest path (garis tebal)

Pada Gambar 2.8 dapat dilihat bahwa setiap arc terletak pada path-path dari titik 1 ke titik 5. Lintasan terpendek dari verteks pada graph Gambar 2.8 adalah P = {1 – 4, 4 – 5} dengan kapasitas 4.

2.3 Algoritma Greedy

Algoritma Greedy adalah algoritma yang memecahkan masalah langkah demi langkah dan merupakan salah satu metode dalam masalah optimasi. Algoritma Greedy membentuk solusi langkah per langkah sebagai berikut:

1. Terdapat banyak pilihan yang perlu dieksplorasi pada setiap langkah solusi. Oleh karena itu, pada setiap langkah harus dibuat keputusan yang terbaik dalam menentukan pilihan. Keputusan yang telah diambil pada suatu langkah tidak dapat diubah lagi pada langkah selanjutnya.

2. Pendekatan yang digunakan di dalam algoritma Greedy adalah membuat pilihan yang terlihat memberikan perolehan terbaik, yaitu dengan membuat pilihan optimum local pada setiap langkah dan diharapkan akan mendapatkan solusi optimum global.

Algoritma Greedy didasarkan pada pemindahan edge(arc) per edge(arc) dan pada setiap langkah yang diambil tidak memikirkan konsekuensi ke depan, Greedy tidak beroperasi secara menyeluruh terhadap semua alternatif solusi yang ada serta sebagian masalah Greedy tidak selalu berhasil memberikan solusi yang benar-benar optimum tapi pasti memberikan solusi yang mendekati nilai optimum.

Masalah optimasi dalam konteks algoritma Greedy disusun oleh elemen-elemen sebagai berikut:

1. Himpunan kandidat. Himpunan ini berisi elemen-elemen yang memiliki peluang untuk pembentuk solusi. Pada persoalan lintasan terpendek dalam graph, himpunan kandidat ini adalah himpunan simpul dari graph tersebut.

2. Himpunan solusi. Himpunan ini berisi solusi dari permasalahan yang diselesaikan dan elemennya terdiri dari elemen dalam himpunan kandidat, namun tidak semuanya atau dengan kata lain himpunan solusi ini adalah bagian dari himpunan kandidat.

3. Fungsi seleksi. Fungsi yang pada setiap langkah memilih kandidat yang paling mungkin untuk menghasilkan solusi optimal. Kandidat yang sudah dipilih pada suatu langkah tidak pernah dipertimbangkan lagi pada langkah selanjutnya.

4. Fungsi kelayakan Fungsi yang memeriksa apakah suatu kandidat yang telah dipilih (diseleksi) dapat memberikan solusi yang layak.

5. Fungsi obyektif Fungsi yang memaksimumkan atau meminimumkan nilai solusi. Tujuannya adalah memilih satu saja solusi terbaik dari masing-masing anggota himpunan solusi.

2.3.1 Cara Kerja Algoritma Greedy

Diberikan sebuah sebuah graph berbobot G(V,E). Tentukan lintasan terpendek dari verteks awal a, ke setiap verteks lainnya di G. Asumsi bahwa bobot semua edge(arc) bernilai positif. Algoritma Greedy untuk mencari lintasan terpendek dapat dirumuskan sebagai berikut:

1. Periksa semua edge(arc) yang langsung bersesuaian dengan verteks a. Pilih edge(arc) yang bobotnya terkecil. Edge(arc) ini menjadi lintasan terpendek pertama, sebut saja L(1).

2. Tentukan lintasan terpendek ke dua dengan cara sebagai berikut:

(i) Hitung d(i) = panjang L(1) + bobot edge(arc) dari verteks akhir L(1) keverteks i yang lain. (ii) Pilih d(i) yang terkecil (iii) Bandingkan d(i) dengan bobot edge(arc) (a,i) lebih kecil daripada d(i), maka L(2) = L(1) U (edge(arc) dari verteks akhir L(i) ke verteks i)

3. Dengan cara yang sama, ulangi langkah (2) untuk menentukan lintasan terpendek berikutnya.

2.3.2 Pseudocode Algoritma Greedy

Procedure greedy (input C: himpunan_kandidat; output S: himpunan_solusi) { Menentukan solusi optimum dari persoalan optimasi dengan algoritma Greedy Masukan: himpunan kandidat C Keluaran: himpunan solusi S }

Deklarasi x: kandidat;

Algoritma; S  {} { inisialisasi S dengan kosong}

While(belum SOLUSI(S)) and (C= {}) do X  SELEKSI(C); {pilih kandidat dari C } C 

C – {x} If LAYAK(S U {x} then S  S U {x} Endif Endwhile {SOLUSI(S) sudah diperoleh or C = {} }

Analisa:

Ambil satu kandidat dari himpunan kandidat C lalu masukkan ke x dan kurangi C dengan kandidat tersebut. Kemudian apakah layak x digabungkan dengan himpunan solusi S? Jika layak, maka gabungkan x dengan solusi S dan lakukan perulangan hingga C kosong atau solusi S sudah ditemukan. Layak atau tidaknya x digabung dengan S, melihat tujuan yang ingin dicapai pada kasus yang sedang dipecahkan tetapi tidak melihat apakah hasil tersebut merupakan hasil yang mampu mengoptimalkan tujuan, yang terpenting ketika langkah tersebut diambil setidaknya hasil pada saat itu mendekati tujuan yang ingin dicapai. Misalkan pada kasus mencari jalur terpendek, saat menguji apakah x layak digabungkan menjadi solusi S, yang menjadi pertimbangan adalah apakah jika x digabungkan dengan S akan menghasilkan solusi S yang terpendek?.

2.4 Algoritma Dijkstra

2.4.1 Sejarah Algoritma Dijkstra

Algoritma Dijkstra ditemukan oleh Edsger W. Dijkstra yang merupakan salah satu varian bentuk algoritma popular dalam pemecahan persoalan yang terkait dengan masalah optimisasi dan bersifat sederhana. Algoritma ini menyelesaikan masalah mencari sebuah lintasan terpendek (sebuah lintasan yang mempunyai panjang minimum) dari verteks a ke verteks z dalam graph berbobot, bobot tersebut Algoritma Dijkstra ditemukan oleh Edsger W. Dijkstra yang merupakan salah satu varian bentuk algoritma popular dalam pemecahan persoalan yang terkait dengan masalah optimisasi dan bersifat sederhana. Algoritma ini menyelesaikan masalah mencari sebuah lintasan terpendek (sebuah lintasan yang mempunyai panjang minimum) dari verteks a ke verteks z dalam graph berbobot, bobot tersebut

Algoritma Dijkstra melibatkan pemasangan label pada verteks. Misalkan L(v) menyatakan label dari verteks v. Pada setiap pembahasan, beberapa verteks mempunyai label sementara dan yang lain mempunyai label tetap. Misalkan T menyatakan himpunan verteks yang mempunyai label sementara. Dalam menggambarkan algoritma tersebut verteks-verteks yang mempunyai label tetap akan dilingkari. Selanjutnya, jika L(v) adalah label tetap dari verteks v, maka L(v) merupakan panjang lintasan terpendek dari a ke v. Sebelumnya semua verteks mempunyai label sementara. Setiap iterasi dari algoritma tersebut mengubah status satu label dari sementara ke tetap, sehingga algoritma dapat berakhir ketika z menerima sebuah label tetap. Pada bagian ini L(z) merupakan panjang lintasan terpendek dari a ke z. Pada algoritma Dijkstra node digunakan, karena algoritma Dijkstra menggunakan diagram pohon(tree) untuk penentuan jalur lintasan terpendek dan menggunakan graph yang berarah.

2.4.2 Cara Kerja Algoritma Dijkstra

Algoritma ini mencari panjang lintasan terpendek dari verteks a ke verteks z dalam sebuah graph berbobot tersambung. Langkah-langkah dalam menentukan lintasan terpendek pada algoritma Dijkstra yaitu:

1. Pada awalnya pilih node dengan bobot yang terendah dari node yang belum terpilih, diinisialisasikan dengan ’0’ dan yang sudah terpilih diinisialisasikan dengan ’1’.

2. Bentuk tabel yang terdiri dari node, status, bobot dan predecessor. Lengkapi kolom bobot yang diperoleh dari jarak node sumber ke semua node yang langsung terhubung dengan node sumber tersebut.

3. Jika node sumber ditemukan maka tetapkan sebagai node terpilih.

4. Tetapkan node terpilih dengan lebel permanen dan perbaharui node yang langsung terhubung.

5. Tentukan node sementara yang terhubung pada node yang sudah terpilih sebelumnya dan merupakan bobot terkecil dilihat dari tabel dan tentukan sebagai node terpilih berikutnya.

6. Apakah node yang terpilih merupakan node tujuan? Jika ya, maka kumpulan node terpilih atau predecessor merupakan rangakaian yang menunjukkan lintasan terpendek.

7. Begitu seterusnya hingga semua node terpilih.

Pseudocode algoritma Dijkstra adalah sebagai berikut:

Procedure Dijkstra(INPUT m: matriks, a: simpul awal) {

Mencari lintasan terpendek dari simpul awal a ke semua simpul Lainnya. Masukan: matriks ketetanggaan (m) dari graph berbobot G dan simpul awal a Keluaran: lintasan terpendek dari a ke 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]

s i  0 d i  m ai

{ Langkah 1: }

d a  ∞ { langkah 2,3,...,n-1:} Traversal {2..n-1}

Cari j sedemikian sehingga s j =0

dan

d j = min {d1,d2,...,dn} s j  1 { simpul j sudah terpilih} perbarui d, untuk i = 1,2,3,s.d.n dengan:

d i (baru) = min{d i (lama,d j +m ji }

Jika menggunakan algoritma Dijkstra untuk menentukan jalur terpendek dari suatu graph, maka akan menemukan jalur yang terbaik, karena pada waktu penentuan jalur yang akan dipilih, akan dianalisis bobot dari node yang belum terpilih, lalu dipilih node dengan bobot yang terkecil. Jika ternyata ada bobot yang lebih kecil melalui node tertentu, maka bobot akan dapat berubah. Algoritma Dijkstra akan berhenti ketika semua node sudah terpilih, dan dengan algoritma Dijkstra ini dapat menemukan jarak terpendek dari seluruh node, tidak hanya untuk node dari asal dan tujuan tertentu saja.

Algoritma Dijkstra menggunakan waktu sebesar O(V*logV+E) di mana V dan E adalah banyaknya verteks dan arc. Kompleksitas algoritma Dijkstra adalah O(n 2 ).

Sehingga untuk mencari semua pasangan verteks terpendek, total waktu asimptotik

2 komputasinya adalah: T(n)=n.O(n 3 )=O(n ), algoritma Dijktra lebih menguntungkan dari sisi running time.

BAB 3 PEMBAHASAN

3.1 Implementasi Algoritma Greedy

Implementasi algoritma Greedy dirancang dalam bahasa pemograman Visual Basic

6.0. Berikut adalah contoh algoritma Greedy.

1. Pemeriksaan verteks dan lintasan pertama

2. Input Graph

3. Proses Graph

Gambar 3.1 Graph Untuk Algoritma Greedy

3.1.1 Pemeriksaan verteks dan lintasan pertama

Pada Gambar 3.1 terdapat 10 kota dan jalur yang menghubungkan kota-kota tersebut beserta jarak antar kotanya dari kota A (asal) ke kota J (tujuan).

Mula-mula proses berawal dari verteks A sebagai verteks keberangkatan. Terdapat 2 jalur yang memungkinkan yaitu jalur AB dengan jarak 2 dan AD dengan jarak 3, AB terpilih karena jaraknya lebih kecil dari AD.

Gambar 3.2 Lintasan 1 Algoritma Greedy

Dari B terdapat 3 jalur yang memungkinkan, yaitu BE dengan jarak 2, BC dengan jarak 5, dan BG dengan jarak 4. BE terpilih karena jaraknya lebih kecil BC dan BG.

Gambar 3.3 Lintasan 2 Algoritma Greedy

Dari E terdapat 4 jalur yang memungkinkan yaitu ED dengan jarak 6, EF dengan jarak 9, EJ dengan jarak 5 dan EH dengan jarak 7. EJ terpilih karena jarak lebih kecil dari ED, EF dan EH, karena verteks tujuan telah tercapai maka algoritma Greedy berhenti sampai di sini. Lintasan terpendeknya adalah A BEJ dengan total jarak 9.

Gambar 3.4 Lintasan 3 Algoritma Greedy

3.1.2 Input Graph

Proses input graph dilakukan dengan cara menggambar titik dan jalan yang menghubungkan setiap titik pada halaman graph. Selanjutnya adalah membuat Proses input graph dilakukan dengan cara menggambar titik dan jalan yang menghubungkan setiap titik pada halaman graph. Selanjutnya adalah membuat

1. Prosedure untuk membuat titik:

Private Sub mnuTambahTItik_Click() theBlockCollection.AddShape 3, theBlockCollection.getFreeTagID() End Sub

2. Prosedure untuk membuat jalan/garis tanpa panah:

Private Sub mnuJoinLine_Click()

If (PREV_SELECTED_SHAPE <> -1) And (SELECTED_SHAPE <> -1) Then

theLineCollection.AddLine frmPeta.shp(PREV_SELECTED_SHAPE).Tag, frmPeta.shp(SELECTED_SHAPE).Tag, False

Else MsgBox "Two objects should be selected!" End If End Sub

3. Menambah caption titik/verteks dengan posisi di tengah:

Private Sub mnTbhCaptionDiTengah_Click() If (SELECTED_SHAPE <> -1) Then Dim s As String s = InputBox("Enter the caption for a shape", "Caption", theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaptiontheBlockC ollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaption = s theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).updateShapeCaptio nPos

Else MsgBox "Object should be selected!" End If End Sub

4. Menambah caption titik/verteks dengan posisi di atas:

Private Sub mnuTbhCaptionDitengah_Click() If (SELECTED_SHAPE <> -1) Then Dim s As String s = InputBox("Enter the caption for a shape", "Caption",

theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaptionUpper) theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaptionUpper = s theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).bSetUpperCaptionD own = False theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).updateShapeCaptio nPos

Else MsgBox "Object should be selected!" End If End Sub

5. Menambah caption titik/verteks dengan posisi di bawah:

Private Sub mnuAddCaptionLowerToBlock_Click() mnuAddCaptionUpperToBlock_Click theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).bSetUpperCaptionD own = True theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).updateShapeCaptio nPos End Sub

6. Menambah caption jalan dengan posisi di tengah:

Private Sub mnuTbhCaptionJalan_Click()

If (PREV_SELECTED_SHAPE <> -1) And (SELECTED_SHAPE <> -1) Then

Dim s As String s = InputBox("Enter the caption") theLineCollection.AddCaptionToLine

frmPeta.shp(PREV_SELECTED_SHAPE).Tag, frmPeta.shp(SELECTED_SHAPE).Tag, s

Else

MsgBox "Two objects should be selected!" End If End Sub

3.1.3 Proses Graph

Data graph yang telah diinput pada form graph selanjutnya diproses untuk mendapatkan matriks jarak dari graph tersebut. Berikut prosedure pada proses graph:

Private Sub cmdCalcData_Click() Dim i As Integer Dim j As Integer Dim toIndex As Integer flxMap.Rows = frmPeta.theBlockCollection.Count + 1 flxMap.Cols = frmPeta.theBlockCollection.Count + 1 If frmPeta.theBlockCollection.Count > 0 Then

flxMap.FixedRows = 1 flxMap.FixedCols = 1

End If For i = 0 To flxMap.Cols - 1

flxMap.ColWidth(i) = 530 Next i For i = 1 To frmPeta.theBlockCollection.Count

flxMap.row = i flxMap.col = 0 flxMap.Text = frmPeta.theBlockCollection(i).sCaption flxMap.row = 0

flxMap.col = i flxMap.Text = frmPeta.theBlockCollection(i).sCaption flxMap.row = i

For j = 1 To flxMap.Cols - 1 flxMap.TextMatrix(i, j) = "0" flxMap.col = j flxMap.CellForeColor = vbBlack flxMap.CellFontBold = False

Next j

For j = 1 To frmPeta.theLineCollection.Count If frmPeta.theLineCollection(j).sFrom = frmPeta.theBlockCollection(i).TagID Then toIndex = frmPeta.theBlockCollection.getIndexFromTag(frmPeta.theLineCollection( j).sTo)

flxMap.col = toIndex flxMap.Text = frmPeta.theLineCollection(j).sCaption If (flxMap.Text = "") Then flxMap.Text = "1" flxMap.CellForeColor = vbRed flxMap.CellFontBold = True

End If Next j Next i ReDim jarak(Me.flxMap.Rows - 1, Me.flxMap.Rows - 1) ReDim visib(Me.flxMap.Rows - 1, Me.flxMap.Rows - 1)

For i = 1 To Me.flxMap.Rows - 1 For j = 1 To Me.flxMap.Cols - 1 jarak(i, j) = flxMap.TextMatrix(i, j) If jarak(i, j) = 0 Then

visib(i, j) = 0 ' Else visib(i, j) = Round(1 / jarak(i, j), 2) End If

Next Next End Sub

3.2 Prosedure Algoritma Greedy

Berikut prosedure yang digunakan pada algoritma Greedy:

Dim src As Integer Dim dest As Integer src = getIndexOfTabName(sFrom) dest = getIndexOfTabName(sTo)

If (src = -1) Or (dest = -1) Then MsgBox "something wrong!!!" Exit Sub

End If Dim ketemu as boolen Dim CC as integer Dim Lc() as integer Dim Ltemp () as integer LC(1) = src CC(1)=LC(1) Counter=1 While ( LC <> null and ketemu <> true ) do CC(counter)=LC(counter) LC(1)=0 If CC(countre) <> 0 then For a = 0 ubound(cc) {mulai penelusuran semua child} If cc(a) <> Ltemp then LC(counter+1)=cc(a) Ltemp=CC Endif endif LP(ubound+1)=CC(counter+1 if adj(lp(a,b))<> 0 then ketemu true endif Loop

3.3 Flowchart Algoritma Greedy

Mulai

Tentukan Vs dan Vt

Jalur=0 Tentukan vs(V1) dan Cari

V2 Bandingkan Lintasan

Kesemua verteks terhubung

Lintasan Terpendek Ditemuka n

Jalur  Verteks Tujuan

Vt Tercapai

Selesai

Gambar 3.5 Flowchart Algoritma Greedy

3.4 Implementasi Algoritma Dijkstra Implementasi algoritma Dijkstra dirancang dalam bahasa pemograman Visual Basic

6.0. Berikut adalah tahap proses implementasi algoritma Dijkstra:

1. Input Graph

2. Proses Graph Pada algoritma Dijkstra node digunakan, karena algoritma Dijkstra menggunakan

diagram pohon(tree) untuk penentuan jalur lintasan terpendek dan menggunakan graph yang berarah. Algoritma Dijkstra mencari jarak terpendek dari node asal ke node terdekatnya, kemudian ke node berikutnya, dan seterusnya. Secara umum sebelum dilakukan I iterasi, algoritma sudah mengidentifikasi jarak terdekat dari i-1 node terdekatnya. Jika seluruh node berbobot tertentu yang (positif), maka node terdekat berikutnya dari node asal dapat ditemukan selama node berdekatan dengan node Ti. Kumpulan node yang berdekatan dengan node di Ti inilah yang merupakan kandidat dari algoritma Dijkstra untuk memilih node berikutnya dari node asal.

Adapun gambar dari graph yang akan diselesaikan dengan algoritma Dijkstra adalah sebagai berikut:

Gambar 3.6 Graph Untuk Algoritma Dijkstra

Langkah-langkah untuk menentukan jarak terpendek dari A ke J dengan menggunakan algoritma Dijkstra adalah sebagai berikut:

1. Pada awalnya status dari node yang belum terpilih diinisialisasikan dengan ‘0’ dan yang sudah terpilih diinisialisasi dengan ‘1’ dimulai dari node A.

2. Tentukan bobot dari node yang langsung berhubungan dengan node sumber yaitu node A, seperti: dari node A ke node B=2, dari node A ke node C=8, dari node A ke node D=3, dan untuk node E, F, G, H, I, J diinisialisasi dengan ‘-‘ karena tidak ada lintasan (arc) yang menghubungkan secara langsung dengan node A.

3. Predecessor (node sumber) dari node A, B, C, D adalah A, karena jarak dihitung dari node A, sehingga node A disebut sebagai predecessor (node sumber), sedangkan untuk node F, G, H, I, J diinisialisasi dengan ‘-‘ dikarenakan tidak ada lintasan (arc) yang langsung menghubungkan dari node

A, sehingga jaraknya tidak ada.

Tabel 3.1 Hasil Iterasi Ke-1

Node

A B C D E F G H I J Status

1 0 0 0 0 0 0 0 0 0 Bobot

- - Predecessor A

Gambar 3.7 Node Terpilih Pada Iterasi ke-1

Dari Tabel 3.1 pilih node yang memiliki bobot yang paling kecil dan status nya masih ‘0’, yaitu node B. Untuk itu status node B menjadi ‘1’ dan predecessor-nya masih tetap A, dan node yang lain predecessor-nya masih sama. Jika node B sudah terpilih, maka ada perubahan pada bobot node C, di mana awalnya bernilai 8 sekarang menjadi

7. Bobot 8 diperoleh dari node yang langsung bergerak dari A ke C, padahal terdapat jalur yang lebih pendek yaitu melalui B, dengan bobot 7, sehingga predecessor pada

C menjadi B, karena node B sudah terpilih, selanjutnya diperoleh node E dengan bobot 4 dan node G dengan bobot 6, predecessor E dan G adalah B, di mana untuk mencapai node E dan G dari node A bisa melalui node B. Sehingga diperoleh:

Tabel 3.2 Hasil Iterasi Ke-2

Node

A B C D E F G H I J Status

1 1 0 0 0 0 0 0 0 0 Bobot

- - Predecessor A

Gambar 3.8 Node terpilih pada Iterasi ke-2

Dari Tabel 3.2 di didapatkan bahwa node D memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’ dan predecessor-nya masih tetap A. Sehingga diperoleh:

Tabel 3.3 Hasil Iterasi Ke-3

Node

A B C D E F G H I J Status

1 1 0 1 0 0 0 0 0 0 Bobot

- - Predecessor A

Gambar 3.9 Node terpilih pada Iterasi ke-3

Dari Tabel 3.3 didapatkan bahwa node E memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’. Jika node E sudah terpilih, maka node F mempunyai bobot 13, node H bobotnya 11 dan node J bobotnya 9. Untuk mencapai node F, H dan node J dari node A bisa melalui node B, kemudian melalui node E dengan predecessor-nya berubah menjadi E. Sehingga diperoleh:

Tabel 3.4 Hasil Iterasi Ke-4

Node

A B C D E F G H I J Status

1 1 0 1 1 0 0 0 0 0 Bobot

9 Predecessor A

Gambar 3.10 Node terpilih pada Iterasi ke-4

Dari Tabel 3.4 didapatkan bahwa node G memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’, predecessor-nya masih tetap B. Jika node G sudah terpilih, maka ada perubahan bobot pada node F dengan bobot 13 berubah menjadi 12 dan predecessor E menjadi G. Sehingga diperoleh:

Tabel 3.5 Hasil Iterasi Ke-5

Node

A B C D E F G H I J Status

1 1 0 1 1 0 1 0 0 0 Bobot

9 Predecessor A

Gambar 3.11 Node terpilih pada Iterasi ke-5

Dari Tabel 3.5 didapatkan bahwa node C memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’, predecessor-nya masih tetap B dengan bobot 7. Sehingga diperoleh:

Tabel 3.6 Hasil Iterasi Ke-6

Node

A B C D E F G H I J Status

1 1 1 1 1 0 1 0 0 0 Bobot

9 Predecessor A

Gambar 3.12 Node terpilih pada Iterasi ke-6

Dari Tabel 3.6 didapatkan bahwa node J memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’ dengan predecessor-nya E. Jika node J sudah terpilih, maka diperoleh node I dengan bobot 19 yang bersumber dari node

A BEJI. Sehingga diperoleh:

Tabel 3.7 Hasil Iterasi Ke-7

Node

A B C D E F G H I J Status

1 1 1 1 1 0 1 0 0 1 Bobot

2 7 3 4 12 6 11 19 9 Predecessor A

Gambar 3.13 Node terpilih pada Iterasi ke-7

Dari Tabel 3.7 didapatkan bahwa node H memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’ dengan predecessor-nya E. Jika node J sudah terpilih, maka diperoleh node I dengan bobot 19 berubah bobotnya menjadi 15 dengan predecessor-nya H yang bersumber dari node A BEHI. Sehingga diperoleh:

Tabel 3.8 Hasil Iterasi Ke-8

Node

A B C D E F G H I J Status

1 1 1 1 1 0 1 1 0 1 Bobot

2 7 3 4 12 6 11 15 9 Predecessor A

Gambar 3.14 Node terpilih pada Iterasi ke-8

Dari Tabel 3.8 didapatkan bahwa node F memiliki bobot yang paling kecil, sehingga statusnya akan berubah menjadi ‘1’, predecessor-nya masih tetap G dengan bobot 12. Sehingga diperoleh:

Tabel 3.9 Hasil Iterasi Ke-9

Node

A B C D E F G H I J Status

1 1 1 1 1 1 1 1 0 1 Bobot

2 7 3 4 12 6 11 15 9 Predecessor A

Gambar 3.15 Node terpilih pada Iterasi ke-9

Semua node telah terpilih dan hanya tinggal node I yang belum terpilih, selanjutnya status node I akan berubah menjadi ‘1’, predecessor-nya masih tetap H dengan bobot

15. Sehingga diperoleh:

Tabel 3.10 Hasil Iterasi Ke-10

Node

A B C D E F G H I J Status

1 1 1 1 1 1 1 1 1 1 Bobot

2 7 3 4 12 6 11 15 9 Predecessor A

Gambar 3.16 Node terpilih pada Iterasi ke-10

Hasil dari seluruh tabel adalah sebagai berikut:

Tabel 3.11 Hasil dari seluruh tabel Iterasi Ke 1

- - Predecessor A

Iterasi Ke 2

- - Predecessor A

Iterasi Ke 3

- - Predecessor A

Iterasi Ke 4

9 Predecessor A

Iterasi Ke 5

9 Predecessor A

Iterasi Ke 6

Iterasi Ke 7

2 7 3 4 12 6 11 19 9 Predecessor A

Iterasi Ke 8

2 7 3 4 12 6 11 15 9 Predecessor A

Iterasi Ke 9

2 7 3 4 12 6 11 15 9 Predecessor A

Iterasi Ke 10

Node

Status

Bobot -

2 7 3 4 12 6 11 15 9 Predecessor A

Program akan berhenti karena semua node sudah terpilih. Sehingga akan menghasilkan jalur terpendek dari node A ke setiap node yang ada. Untuk melihat jalur mana yang terpilih dapat ditelusuri dari predecessor-nya, Sehingga akan didapat:

A B :A-B

A C :A-B-C

A D :A-D

A E :A-B-E

A F :A-B-G–F

A G :A–B–G

A H :A–B–E–H

A I :A–B–E–H–I : 15

A J :A–B–E–-J

3.4.1 Input Graph

Proses input graph dilakukan dengan cara menggambar titik dan jalan yang menghubungkan setiap titik pada halaman graph. Selanjutnya adalah membuat caption dari setiap titik yang akan menjadi nama titik tersebut dan caption pada jalan akan menjadi jarak antara titik yang satu dengan yang lainnya.

1. Prosedure untuk membuat titik:

Private Sub mnuTambahTItik_Click()

theBlockCollection.AddShape 3, theBlockCollection.getFreeTagID() End Sub

2. Prosedure untuk membuat jalan/garis tanpa panah:

Private Sub mnuJoinLine_Click()

If (PREV_SELECTED_SHAPE <> -1) And (SELECTED_SHAPE <> -1) Then

theLineCollection.AddLine frmPeta.shp(PREV_SELECTED_SHAPE).Tag, frmPeta.shp(SELECTED_SHAPE).Tag, False

Else MsgBox "Two objects should be selected!" End If End Sub

3. Menambah caption titik/node dengan posisi di tengah:

Private Sub mnTbhCaptionDiTengah_Click() If (SELECTED_SHAPE <> -1) Then Dim s As String s = InputBox("Enter the caption for a shape", "Caption", theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaptiontheBlockC ollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaption = s theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).updateShapeCaptio nPos

Else MsgBox "Object should be selected!"

End If End Sub

4. Menambah caption titik/node dengan posisi di atas:

Private Sub mnuTbhCaptionDitengah_Click() If (SELECTED_SHAPE <> -1) Then Dim s As String s = InputBox("Enter the caption for a shape", "Caption",

theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaptionUpper) theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).sCaptionUpper = s theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).bSetUpperCaptionD own = False theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).updateShapeCaptio nPos

Else MsgBox "Object should be selected!" End If End Sub

5. Menambah caption titik/node dengan posisi di bawah:

Private Sub mnuAddCaptionLowerToBlock_Click() mnuAddCaptionUpperToBlock_Click theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).bSetUpperCaptionD own = True theBlockCollection(frmPeta.shp(SELECTED_SHAPE).Tag).updateShapeCaptio nPos End Sub