Implementasi Algoritma Dynamic Programming Untuk Menentukan Route Terpendek Pada Graph Multi Tahap (Multistage Graph)

(1)

IMPLEMENTASI ALGORITMA DYNAMIC PROGRAMMING

UNTUK MENENTUKAN ROUTE TERPENDEK PADA

GRAPH MULTI TAHAP (MULTISTAGE GRAPH)

SKRIPSI

Diajukan untuk melengkapi tugas dan memenuhi syarat mencapai gelar sarjana

PURWANDI

041421027

DEPARTEMEN MATEMATIKA

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

UNIVERSITAS SUMATERA UTARA

MEDAN

2008


(2)

PERSETUJUAN

Judul : IMPLEMENTASI ALGORITMA DYNAMIC

PROGRAMMING UNTUK MENENTUKAN ROUTE TERPENDEK PADA GRAPH MULTI TAHAP (MULTISTAGE GRAPH)

Kategori : SKRIPSI

Nama : PURWANDI

Nomor Induk Mahasiswa : 041421027

Program Studi : SARJANA (S1) MATEMATIKA

Departemen : MTEMATIKA

Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN

ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA

Medan, 2008

Komisi Pembimbing :

Pembimbing 2 Pembimbing 1

Drs. Marwan Harahap, M.Eng. Drs. Sawaluddin Nasution,M.IT

NIP. 130 422 443 NIP. 132 206 398

Diketahui / Disetujui Oleh

Departemn Matematika FMIPA USU Ketua,

Dr. Saib Suwilo, M.Sc. NIP. 131 796 149


(3)

PERNYATAAN

IMPLEMENTASI ALGORITMA DYNAMIC PROGRAMMING UNTUK MENENTUKAN ROUTE TERPENDEK PADA

GRAPH MULTI TAHAP (MULTISTAGE GRAPH)

SKRIPSI

Saya mengaku bahwa skripsi iniadalah hasil kerja saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing disebutkan sumbernya.

Medan, April 2008

PURWANDI 041421027


(4)

PENGHARGAAN

Puji dan syukur Penulis panjatkan kepada Tuhan Yang Maha Pemurah dan Maha Penyayang, dengan limpahan karunia-Nya skripsi ini dapat diselesaikan dalam waktu yang telah ditetapkan.

Ucapan terima kasih Penulis sampaikan kepada Drs. Sawaluddin Nasution, M.IT. dan Drs. Marwan Harahap, M.Eng, selaku pembimbing pada penyelesaian skripsi ini yang telah memberikan panduan dan penuh kepercayaan kepada penulis untuk menyempurnakan skripsi ini. Panduan ringkas, padat dan professional telah diberikan agar Penulis dapat menyelesaikan skripsi ini. Ucapan terima kasih juga ditujukan kepada Ketua dan sekretaris Departemen Dr. Saib Suwilo, M.Sc. dan Drs. Henry Rani Sitepu, M.Si., Dekan dan Pembantu Dekan Fakultas Matematika dan Imu Pengetahuan Alam Universitas Sumatera Utara, semua Dosen pada Departemen Matematika FMIPA USU, Pegawai di FMIPA USU, dan teman-teman kuliah, Akhirnya, tidak terlupakan kepada, Bapak, Ibu dan semua keluarga yang selama ini memberikan bantuan dan dorongan yang diperlukan. Semoga Tuhan Yang Maha Esa akan membalasnya..


(5)

ABSTRAK

Tulisan ini mengkaji tentang shortest path dengan Algoritma Dynamic Programming untuk mencari route terpendek dari sumber s ke tujuan t pada graph multi tahap ( Multistage Graph) dimana Dynamic Programming adalah metode pemecahan masalah dengan cara menguraikan solusi menjadi sekumpulan langkah (step) atau tahapan (stage) sedemikian hingga solusi dari persoalan dapat dipandang dari serangkaian keputusan yang saling berkaitan. yang kemudian diimplementasikan ke dalam suatu program dengan menggunakan Visual Basic 6.0.


(6)

The Implementation Of The Algorithm Of Dynamic Programming To Determine Shortest Route To Multistage Graph

ABSTRACT

This article studied about shortest path with the Dynamic Programming algorithm to search route shortest from the source s to the aim t in graph multi the stage (Multistage Graph) where Dynamic Programming was the solution method to the problem by means of untangling the solution to a collection steps or the stage so until the solution could be from the problem gazed at of a series of decision that mutually. that afterwards implementation in a program with used Visual Basic 6,0.


(7)

DAFTAR ISI

Hal

PERSETUJUAN ... ii

PERNYATAAN ... iii

PENGHARGAAN ... iv

ABSTRAK ... v

ABSTRACT ... vi

DAFTAR ISI ... vii

DAFTAR GAMBAR ... viii

BAB 1 PENDAHULUAN 1.1. Latar Belakang ... 1

1.2. Perumusan Masalah ... 2

1.3. Tujuan Penelitian ... 2

1.4. Metodologi Penelitian ... 3

1.5. Tinjauan Pustaka ... 4

BAB 2 LANDASAN TEORI 2.1. Konsep Dasar Graph ... 5

2.2. Graph Berlabel ... 6

2.3. Path Minimum ... 8

2.4. Representasi Graph Dalam Matriks ... 9

2.5. Graph Multi Tahap ... 11

2.6. Shortest Path ... 12

BAB 3 PEMBAHASAN 3.1. Dynamic Programming ... 15

3.2. Konsep Dasar Dalam Dynamic Programming ... 16

3.3. Analisis Dynamic Programming ... 19

3.4. Dua Pendekatan Dynamic Programming ... 20

3.5 Algoritma Dynamic Programming ... 20

3.6 Pseudo Code dan Flowchart Algoritma Dynamic Programming………. 21

3.6.1 Pseudo Code Mencari Lintasan Terpendek……….. 21

3.6.2 Pseudo Code Input Ukuran Matriks……...……….. 22

3.6.3 Pseudo Code Perhitungan Data Matriks……….. 23

3.6.4 Flowchart Algoritma Dynamic Programming………. 24

3.7.. Visual Basic 6.0 ... 28

3.5.1. Rancangan Program Visual Basic 6.0 ... 30

BAB 4 KESIMPULAN 4.1. Kesimpulan ... 35


(8)

DAFTAR PUSTAKA ... 36

LAMPIRAN DAFTAR GAMBAR Hal Gambar 2.1. Graph dengan 5 Verteks dan 6 Edge ... 5

Gambar 2.2. Digraph ... 6

Gambar 2.3. Gaph G dengan 7 Verteks ... 7

Gambar 2.4. Graph dengan 6 Verteks dan 10 Edge ... 9

Gambar 2.5. Graph dengan 5 Verteks dan 8 Edge ... 10

Gambar 2.6. Graph Multi Tahap ( Multistage Graph ) ... 12

Gambar 2.7. Shortest Path (Garis Tebal) ... 14

Gambar 3.0. Tahapan Fungsi Transisi ... 17

Gambar 3.1. Tahapan (Stage) Standard ... 17

Gambar 3.2. Return dan Transition Function... 18

Gambar 3.3. Flowchart Algoritma Dynamic Programming………... 23

Gambar 3.4 Route Jarak Terpendek 1. ... 25

Gambar 3.5. Route Jarak Terpendek 2 ... 27

Gambar 3.6. Form Menu Utama ... 30

Gambar 3.7. Form Entri Data Graph ... 30

Gambar 3.8. Form Cari Lintasan Terpendek ... 31

Gambar 3.9. Form Hitung Lintasan Terpendek ... 32

Gambar 3.10. Form Hasil dari Hitung dan Cari Lintasan Terpendek ... 33


(9)

ABSTRAK

Tulisan ini mengkaji tentang shortest path dengan Algoritma Dynamic Programming untuk mencari route terpendek dari sumber s ke tujuan t pada graph multi tahap ( Multistage Graph) dimana Dynamic Programming adalah metode pemecahan masalah dengan cara menguraikan solusi menjadi sekumpulan langkah (step) atau tahapan (stage) sedemikian hingga solusi dari persoalan dapat dipandang dari serangkaian keputusan yang saling berkaitan. yang kemudian diimplementasikan ke dalam suatu program dengan menggunakan Visual Basic 6.0.


(10)

The Implementation Of The Algorithm Of Dynamic Programming To Determine Shortest Route To Multistage Graph

ABSTRACT

This article studied about shortest path with the Dynamic Programming algorithm to search route shortest from the source s to the aim t in graph multi the stage (Multistage Graph) where Dynamic Programming was the solution method to the problem by means of untangling the solution to a collection steps or the stage so until the solution could be from the problem gazed at of a series of decision that mutually. that afterwards implementation in a program with used Visual Basic 6,0.


(11)

BAB 1

PENDAHULUAN

1.1.Latar Belakang

Permasalan pencarian rute terpendek merupakan suatu masalah yang sangat terkenal di dunia Informatika. Dari dahulu hingga sekarang telah dikembangkan berbagai algoritma untuk memecahkan permasalahan ini. Hingga saat ini telah banyak yang menemukan solusi untuk pencarian rute terpendek ini. Salah satunya yang terkenal adalah algoritma dynamic programming (algoritma Bellman – Ford), kemudian algoritma dijkstra yang juga merupakan algoritma yang cukup banyak dipakai dalam permasalahan ini.

Penentuan route terpendek dari satu titik ke titik yang lain adalah masalah yang sering ditemui dalam kehidupan sehari-hari. Berbagai kalangan menemui permasalahan serupa dengan variasi yang berbeda, contohnya seorang pengemudi yang mencari jalur terpendek dari tempat asal ke tempat tujuan, pengantar pesanan makanan cepat saji yang juga mencari jalur terpendek dari tempat asal ke tempat tujuan, dan juga seorang desainer jaringan komputer yang harus mendesain skema perutean pada jaringan yang dia tangani agar memaksimalkan performa jaringan dan meminimalkan beban yang harus ditangani oleh jaringan tersebut.

Seiring dengan waktu yang berjalan dan juga perkembangan ilmu pengetahuan dan teknologi permasalahan pencarian route terpendek ini telah terpecahkan dengan berbagai algoritma salah satunya dengan algoritma Dynamic Programming

Persoalan untuk menentukan route terpendek pada graph multitahap (multistage graph), dirumuskan sebagai kasus khusus dari persoalan aliran biaya minimal, dan algoritma efisien yang tersedia untuk menghitung route terpendek dan


(12)

biaya termurah. Route terpendek yang diperoleh akan meminimumkan fungsi linier lintasan seperti biaya dan jarak. Perumusan persoalan ini akan menjadi salah satu kegunaan dari route jarak terpendek terhadap biaya yang dianggarkan.

Andaikan diberikan sebuah jaringan G dengan m titik dan n garis serta biaya cij yang dihubungkan dengan tiap garis (i,j) dalam G. Masalahnya adalah menentukan route terpendek dan biaya termurah dari titik 1 ke titik m dalam G. Biaya dari route itu adalah jumlah biaya pada tiap garis dalam route.

Algoritma yang digunakan untuk menentukan route terpendek pada graph multitahap (multistage graph) adalah Dynamic Programming. Pada algoritma ini memperlihatkan bahwa penyelesaian optimal yang diperoleh. Untuk itu penulis akan meninjau suatu algoritma untuk menentukan route terpendek pada graph multitahap (multistage graph) , salah satu algoritma yang digunakan adalah Algoritma Dynamic Programming.

Algoritma Dynamic Programming adalah suatu metode pemecahan masalah dengan cara menguraikan solusi menjadi sekumpulan langkah (step) atau tahapan (stage) sedemikian sehingga solusi dari persoalan dapat dipandang dari serangkaian keputusan yang saling berkaitan.

Pada Algoritma Dynamic Programming rangkaian keputusan yang optimal dibuat dengan menggunakan prinsip optimalitas. Prinsip optimalitas yaitu jika solusi total optimal, maka bagian solusi sampai tahap ke-k juga optimal. Prinsip optimalitas berarti bahwa jika kita bekerja dari tahap k ke tahap k + 1, kita dapat menggunakan hasil optimal dari tahap k tanpa harus kembali ke tahap awal. Ongkos pada tahap k +1 = (ongkos yang dihasilkan pada tahap k ) + (ongkos dari tahap k ke tahap k + 1).Tulisan ini akan membahas bagaimana peranan Algoritma Dynamic Programming dalam menyelesaikan masalah route terpendek pada graph multitahap (multistage graph), serta menerapkannya dalam suatu program.


(13)

1.2. Perumusan Masalah

Permasalahan dalam tulisan ini adalah bagaimana peranan Algoritma Dynamic Programming dalam menyelesaikan masalah route terpendek pada graph multi tahap (multistage graph) dan menentukan biaya termurah dari titik 1 sampai titik n dalam G dengan menggunakan Microsoft Visual Basic 6.0..

1.3. Tujuan Penelitian

Tujuan dalam penelitian ini adalah untuk menerangkan suatu konsep dalam menentukan route terpendek dan biaya termurah dari sumber s sampai ke tujuan t pada suatu graph multitahap (mukt istage graph) dengan menggunakan Algoritma Dynamic Programming.

1.4. Metodologi Penelitian

Tulisan ini merupakan hasil studi literatur pada teori-teori jaringan kerja. Langkah-langkah yang akan dilakukan adalah :

1. Menguraikan tentang konsep route terpendek serta Dynamic Programming pada suatu jaringan kerja.

2. Menguraikan teori dasar graph dan terminologi-terminologi graph yang menunjang terhadap pembahasan.

3. Menjelaskan penggunaan dan pengembangan Algoritma Dynamic Programming dalam menentukan route terpendek pada graph multitahap (multistage graph) dan mengimplementasikannya ke dalam program Visual Basic 6.0.


(14)

Untuk mewujudkan maksud dan tujuan dari penelitian ini, penulis memanfaatkan buku-buku yang dipergunakan sebagai referensi diantaranya.

Stuart E. Dreyfus dan Averili M. Law dalam bukunya “ The Art And Theory Of Dynamic Programming”, memuat bahwa adanya dua pendekatan yang digunakan dalam algoritma dynamic programming yaitu maju (forward atau up-down) dan mundur (backward atau bottom-up). Misalkan x1, x2, …, xn menyatakan peubah (variable) keputusan yang harus dibuat masing-masing untuk tahap 1, 2, …, n. Maka,

1. Program dinamis maju. Program dinamis bergerak mulai dari tahap 1, terus maju ke tahap 2, 3, dan seterusnya sampai tahap n. Runtunan peubah keputusan adalah x1, x2, …, xn.

2. Program dinamis mundur. Program dinamis bergerak mulai dari tahap n, terus mundur ke tahap n – 1, n – 2, dan seterusnya sampai tahap 1. Runtunan peubah keputusan adalah xn, xn-1, …, x1.

Seymour Lipschutz, Ph.D dan Marc Lars Lipson, Ph.D dalam bukunya “Matematika Diskrit 2”, definisi graph adalah bahwa sebuah graph terdiri dari dua bagian yaitu : sebuah himpunan V = V (G) memiliki elemen-elemaen yang dinamakan verteks. Titik atau node. Kemudian sebuah kumpulan E = E (G), merupakan pasangan tak terurut dari verteks-verteks yang berbeda dinamakan edge. Sedang bkan multigraph G = G (V,E) terdiri dari suatu himpunan V (verteks) dan suatu himpunan E (edge) kecuali E mengandung multiple edge, yaitu beberapa edge yang 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.


(15)

BAB 2

LANDASAN TEORI

2.1. Konsep Dasar Graph

Sebelum sampai pada pendefenisian masalah lintasan terpendek, terlebih dahulu pada bagian ini akan diuraikan mengenai konsep-konsep dasar dari model graph dan representasinya dalam memodelkan masalah lintasan terpendek.

Definisi 2.1. Sebuah graph G adalah pasangan (V,E) dimana V adalah himpunan tak

kosong yang anggotanya disebut verteks dan E adalah himpunan yang anggotanya adalah pasangan tak berurut dari verteks V yang disebut edge.

Secara umum graph dapat digambarkan dengan suatu diagram dimana verteks ditunjukkan sebagai titik yang dinotasikan dengan vi , i = 1, 2, …,P dan edge

digambarkan dengan sebuah garis lurus atau garis lengkung yang menghubungkan dua verteks (vi, vj) dan dinotasikan dengan ek . Sebagai ilustrasi dapat dilihat gambar 2.1. yaitu suatu graph yang mempunyai lima verteks dan enam edge.

Gambar 2.1. Graph Dengan 5 Verteks dan 6 Edge V1

V2

e4

V4

V5

V3

e2

e5 e3 e6


(16)

Definisi 2.2. Suatu digraph G terdiri dari himpunan verteks-verteks V(G):{v1, v2, …},

himpunan edge-edge E(G):{e1, e2, …}, dan suatu fungsi Ψ yang mengawankan setiap

edge dalam E(G) ke suatu pasangan berurutan verteks ( vi , vj ).

Jika ek = (vi , vj) adalah suatu edge dalam G, maka vi disebut verteks awal ek dan vj

disebut verteks akhir ek . Arah edge adalah dari vi ke vj .

Perhatikan digraph G pada gambar 2.2. dibawah ini.

Gambar 2.2. Digraph

Jika G adalah graph (berarah atau tidak) dengan verteks V dan edge E, maka dapat ditulis G=(V,E).

2.2. Graph Berlabel

Hubungan antar verteks-verteks dalam graph perlu diperjelas. Hubungan tidak cukup hanya menunjukkan verteks-verteks mana yang berhubungan langsung, tetapi juga seberapa kuat hubungan itu. Sebagai contoh, andaikata suatu graph menyatakan “peta” suatu daerah. Verteks-verteks graph menyatakan kota-kota yang ada di daerah tersebut. Edge-edge dalam graph menyatakan jalan yang menghubungkan kota-kota tersebut.

Informasi tentang peta daerah perlu diperjelas dengan mencantumkan jarak antara 2 kota yang berhubungan. Informasi tentang jarak dibutuhkan karena dalam graph, letak verteks dan panjang edgenya tidak menyatakan jarak 2 kota yang

v2

v6

v3

v5

v4

v1

e1

e4

e3 e2 e

7

e6

e8


(17)

sebenarnya seperti halnya dengan peta yang sebenarnya. Jadi setiap garis dalam graph berhubungan dengan suatu label yang menyatakan bobot garis tersebut.

Definisi 2.3. Graph Berlabel (weighted graph) adalah suatu graph tanpa edge paralel

dimana setiap edgenya berhubungan dengan suatu bilangan riil tak negatif yang menyatakan bobot edge (w(e)) tersebut. Jumlah bobot semua edge disebut Total Bobot.

Matriks yang bersesuaian dengan graph berlabel G adalah matriks hubung A = (aij) dengan aij = bobot edge yang menghubungkan verteks vi dengan verteks vj. Jika

verteks vi tidak berhubungan langsung dengan verteks vj maka aij = ∞, dan aij = 0

jika i = j.

Contoh 2.1.

Dalam suatu propinsi, ada 8 kota (v1, v2, …, v8

Edge

) yang akan dihubungkan dengan jaringan listrik. Biaya pemasangan jaringan listrik yang mungkin dibuat antar 2 kota adalah sebagai berikut :

Kota yang dihubungkan Biaya per satuan e4 e7 e2 e8 e9 e1 e3 e10 e5 e11 e v 6

2 – v3

v4 – v6

v1 – v7

v3 – v4

v3 – v5

v1 – v2

v1 – v4

v6 – v8

v7 – v8

v5 – v6

v6 – v

3 4 5 5 5 15 15 15 15 15 18 7

a. Graph berlabel untuk menyatakan jaringan listrik di 8 kota dapat digambarkan pada gambar 2.3. dibawah ini. Angka dalam kurung menyatakan bobot edge yang bersangkutan. Bobot tersebut menyatakan biaya pengadaan jaringan listrik.


(18)

Gambar 2.3. Graph Jaringan listrik di 8 kota

b. Matriks hubung untuk menyatakan graph berlabel pada gambar 2.3. adalah matriks A = (aij) dengan aij

Jarak verteks v =

i dengan vj jika ada edge yang menghubungkan verteks vi

dengan vj

∞ Jika tidak ada edge yang menghubungkan verteks vi dengan v

0 jika i = j

j

1

v1 v2 v3 v4 v5 v6 v7 v8

v1 0 15 ∞ 15 ∞ ∞ ∞ ∞

v2 15 0 3 ∞ ∞ ∞ ∞ ∞

v3 ∞ 3 0 5 5 ∞ ∞ ∞

A = v4 15 ∞ 5 0 ∞ 4 ∞ ∞

v5 ∞ ∞ 5 ∞ 0 15 ∞ ∞

v6 ∞ ∞ ∞ 4 15 0 18 15

v7 5 ∞ ∞ ∞ ∞ 18 0 15

v8 ∞ ∞ ∞ ∞ ∞ 15 15 0

v1

v4

v6

v8

v7

v2

v3

v5

e2 (5) e3 (15)

e5 (15)

e6 (18)

e7 (4)

e8 (5)

e9 (5)

e4 (3)

e1 (15)

e10 (15)


(19)

2.3. Path Minimum

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

Definisi 2.4. Misalkan G adalah suatu graph. Dimana v dan w adalah 2 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 : v0 e1 v1 e2 v2 … vn-1 en vn dengan v0 = v; vn =

w; vi-1 dan vi adalah verteks-verteks ujung edge ei.

Path dengan panjang n dari v ke w adalah walk dari v ke w yang semua edgenya berbeda. Path dari v ke w dituliskan sebagai v = v0 e1 v1 e2 v2 … vn-1 en vn = w

dengan ei ≠ ej

(

ei1,ei2,...,eik

)

untuk i ≠ j.

Definisi 2.5. Lintasan adalah suatu barisan edge sedemikian rupa

sehingga verteks terminal

j

i

e berimpit dengan verteks awal

) 1 (j+

i

e untuk 1 ≤ j ≤ k – 1.

Contoh 2.2.

Gambar 2.4. Graph Dengan 6 Verteks dan 10 Edge

Pada gambar 2.4. diatas terdapat :

a. Semua edge berbeda (e1, e3, e4, dan e5 masing-masing muncul sekali). Ada

verteks yang berulang (v3 muncul 2 kali). Verteks awal dan verteks akhir tidak

v1

v2

v3

v6 v5

v4

e10

e9

e6

e5

e4

e7

e8

e3

e1


(20)

sama verteks awal = v1 dan verteks akhir = v4). Barisan ini merupakan Path dari v1

ke v4

b. Ada edge yang muncul lebih dari sekali, yaitu e dengan panjang 4.

5 (muncul 2 kali) berarti barisan

tersebut merupakan walk dari v1 ke v5 dengan panjang 5.

2.4. Representasi Graph Dalam Matriks

Matriks dapat digunakan untuk menyatakan suatu graph. Dengan menyatakan graph sebagai suatu matriks, maka perhitungan-perhitungan yang diperlukan dapat dilakukan dengan mudah.

Kesulitan utama merepresentasikan graph dalam suatu matriks adalah keterbatasan matriks untuk mencakup semua informasi yang ada dalam graph. Akibatnya ada bermacam-macam matriks untuk menyatakan suatu graph tertentu. Tiap-tiap matriks tersebut mempunyai keuntungan yang berbeda-beda dalam menyaring informasi yang dibutuhkan pada graph.

Misalkan G adalah sebuah graph dengan verteks-verteks v1, v2, …, vm dan

edge-edge e1, e2, …, en.

Definisi 2.6. Matriks adjacency

Misalkan A = (aij

1 jika {u, v} adalah edge, yaitu v

) adalah matriks m x m yang didefinisikan oleh

i adjacent terhadap v 0 lainnya

j

Maka A disebut matriks adjacency dari G. Perhatikan aij = aji , sehingga A adalah

sebuah matriks simetris. (Didefinisikan sebuah matriks adjacency untuk sebuah multigraph dengan pemisalan aij menyatakan jumlah edge {vi, vj }.)

Definisi 2.7. Matriks Insiden

Misalkan M = (mij

1 verteks v

) adalah matriks m x n yang didefinisikan oleh

i adalah incident pada edge ej.

0 lainnya

Maka M disebut matriks incidence dari G. aij =


(21)

Perhatikan gambar 2.6 berikut ini.

Gambar 2.5. Graph Dengan 5 Verteks dan 8 Edge

Pada gambar 2.5. Matriks adjacency A = (aij) dari graph G.

Karena G mempunyai 5 verteks maka A akan menjadimatriks 5 x 5. Dimana aij = 1 jika ada sebuah edge antara vi dan vj, dan aij

v

= 0 jika lainnya. Ini akan menghasilkan matriks berikut :

1 v2 v3 v4 v5

v1 0 1 1 1 1

A = v2 1 0 1 0 0

v3 1 1 0 1 1

v4 1 0 1 0 1

v5 1 0 1 1 0

Pada gambar 2.5. Matriks Incidence M = (mij) dari graph G.

Karena G mempunyai 5 verteks dan 8 edge maka M akan menjadi matris 5 x 8. Dimana mij =1 jika verteks vi anggota dari edge ej dan mij = 0 untuk lainnya. Ini akan

menghasilkan matriks berikut.

v4

v3

v5

v2

v1

e5

e8

e6

e7

e4

e3

e2


(22)

e1 e2 e3 e4 e5 e6 e7 e8

v1 1 1 1 0 1 0 0 0

A = v2 1 0 0 1 0 0 0 0

v3 0 0 1 1 0 0 1 1

v4 0 0 0 0 1 1 0 1

v5

2.5. Graph Multi Tahap

0 1 0 0 0 1 1 0

Misalkan G adalah sebuah graph berarah. Sebuah edge berarah e = [u,v] dikatakan mulai pada verteks awal u dan berahkhir di verteks akhir v, dan u dan v dikatakan adjacent.

Graph multi tahap (multistage graph) adalah graph yang tiap simpul di dalam graph tersebut menyatakan status, sedangkan V1, V2, … menyatakan tahap.

Gambar 2.6. Graph Multi Tahap (Multistage Graph)

1

3 2

4

6

7

8

9

11 10

5

12


(23)

2.6. Shortest Path

Setiap path dalam digraph mempunyai nilai yang dihubungkan dengan nilai path tersebut, yang nilainya adalah jumlah dari nilai edge path tersebut. Dari ukuran dasar ini dapat dirumuskan masalah seperti “ mencari lintasan terpendek antara dua vertek dan meminimumkan biaya”.

Banyak bidang penerapan mensyaratkan untuk menentukan lintasan terpendek berarah dari asal ke tujuan di dalam suatu distribusi aliran berarah. Algoritma yang diberikan dapat dimodifikasi dengan mudah untuk menghadapi lintasan berarah pada setiap iterasinya.

Suatu versi yang lebih umum dari masalah lintasan terpendek adalah menentukan lintasan terpendek dari sembarang verteks menuju ke setiap verteks lainnya. Pilihan lain adalah membuang kendala tak negatif bagi “jarak”. Suatu kendala lain dapat juga diberlakukan dalam suatu masalah lintasan terpendek.

Andaikan diberikan sebuah graph G dalam tiap edge (x,y) dihubungkan dengan verteks a (x,y) mewakili panjang dari edge. Dalam beberapa hal, panjang sebenarnya mewakili biaya atau beberapa nilai lainnya. Panjang dari lintasan adalah menentukan panjang jumlah dari masing-masing edge yang terdiri dari lintasan. Untuk 2 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 dan biaya termurah.

Pada persoalan ini akan terdorong untuk menyelesaikan suatu persoalan untuk menentukan lintasan terpendek dan biaya termurah dalam suatu jaringan dengan mengimplementasikannya ke dalam graf multi tahap dengan menggunakan algoritma dynamic programming

Definisi 2.8. Lintasan terpendek antara 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.


(24)

Contoh 2.3.

Gambar 2.7. Shortest Path (Garis Tebal)

Pada gambar 2.7. dapat dilihat bahwa setiap edge terletak pada path-path dari titik 1 ke titik 5. Edge merepresentasikan saluran dengan kapasitas tertentu (contohnya, air) dapat dialirkan melalui saluran. Sedangkan verteks merepresentasikan persimpangan saluran. Air mengalir melalui verteks pada verteks yang dilalui

Lintasan terpendek dari verteks pada graph di atas adalah P = {1 – 4, 4 – 5} dengan kapasitas 4.

3

5

2

X7

3

X5

1 2

4

X2

X4

1 3

X3

1 X6

5 X8


(25)

BAB 3

PEMBAHASAN

3.1. Dynamic Programming

Dynamic Programming adalah teknik manajemen sain yang diaplikasikan kepada persoalan yang melibatkan keputusan berurutan yang saling berkaitan. Program ini dikembangkan oleh Richard Bellman dan G. B Dantzig pada tahun 1940 – 1950. Sebagai sebuah konsep, D ynamic Programming lebih luwes dibanding program-program optimasi lainnya. Aplikasi Dynamic Programming telah terbukti baik pada pengelolaan persediaan, jaringan, penjadwalan kerja untuk karyawan, pengendalian produksi, perencanaan penjualan dan lain-lain bidang. Berbeda dengan linear programming, metode Simplex tidak dapat diterapkan di sini. Formulasi model dilakukan dengan unik sesuai dengan persoalannya.

Dynamic Programming adalah metode pemecahan masalah dengan cara menguraikan solusi menjadi sekumpulan langkah (step) atau tahapan (stage) sedemikian sehingga solusi dari persoalan dapat dipandang dari serangkaian keputusan yang saling berkaitan.

Pada penyelesaian persoalan dengan metode Dynamic Programming ini:terdapat sejumlah berhingga pilihan yang mungkin, solusi pada setiap tahap dibangun dari hasil solusi tahap sebelumnya, kita menggunakan persyaratan optimasi dan kendala untuk membatasi sejumlah pilihan yang harus dipertimbangkan pada suatu tahap.


(26)

3.2. Konsep Dasar Dalam Dynamic Programming

a. Dekomposisi

Persoalan Dynamic Programming dapat dipecah-pecah menjadi sub-persoalan atau tahapan yang lebih kecil dan berurutan. Setiap tahap disebut juga sebagai titik keputusan. Setiap keputusan yang dibuat pada suatu tahap akan mepengaruhi keputusan-keputusan pada tahap berikutnya.

b. Status

Status adalah kondisi awal (Sn) dan kondisi akhir (Sn-1) pada setiap tahap, dimana pada tahap tersebut keputusan dibuat (Dn). Status akhir pada sebuahtahap tergantung keada status awal dan keputusan yang dibuat pada tahap yangbersangkutan. Status akhir pada suatu tahap merupakan input bagi tahap berikutnya.

c. Variabel Keputusan dan Hasil

Keputusan yang dibuat pada setiap tahap (Dn) merupakan keputusan yang berorientasi kepada return yang diakibatkannya (Rn|∆n), tingkat maksimal atau minimal.

d. Fungsi Transisi

Fungsi transisi menjelaskan secara pasti bagaimana tahap-tahap saling

berhubungan. Fungsi ini berbentuk fungsi hubungan antar status pada setiap tahap yang beurutan. Fungsi transisi secara umum berbentuk : Sn-1 = Sn - Dn Di mana Sn-1 = status pada tahap n-1, atau status akhir pada tahap-n. Sn adalah status awal pada tahap-n.


(27)

Dn D

S

n- 1

n Sn- 1 Sn- 2

Rn R

e. Optimasi Tahap

n- 1

Gambar 3.1. Tahapan Fungsi Transisi

Optimasi tahap dalam Dynamic Programming adalah menentukan keputusan optimal pada setiap tahap dari berbagai kemungkinan nilai status inputnya. Fungsi umum dari keputusan optimal adalah :

fn(Sn, Dn) = return pada tahap-n dari nilai status input. Sn, dan keputusan, Dn. fn*(Sn) = return optimal pada tahap-n dari nilai input status, Sn.

f. Fungsi Rekursif

Fungsi rekursif biasanya digunakan pada berbagai program komputer, di mana nilai sebuah variabel pada fungsi itu merupakan nilai kumulatif dari nilai variable tersebut pada tahap sebelumnya. Pada DP, fungsi umum dituliskan sebagai : fn(Sn, Dn) = Rn + fn-1*(Sn-1,Dn-1)

Prosedur optimasi diawali dari tahap akhir menuju tahap awal ( backward ). Karakteristik programa dinamis adalah :

a. Persoalan dapat dipisahkan menjadi beberapa tahap (stages), di mana setiap tahap membutuhkan keputusan kebijakan yang standard dan saling berhubungan.

Dn D

S

n- 1

n Sn- 1 Sn- 2

Rn Rn- 1

Gambar 3.2. Tahapan (stage) Standard

n n-1


(28)

b. Setiap tahap memiliki sejumlah status (state). Secara umum, sekumpulan status ini merupakan berbagai kemungkinan kondisi yang timbul dari sistim persoalannya. Status ini memberikan informasi yang dibutuhkan setiap keputusan dan dampaknya pada tahap berikutnya. Jumlah status pada setiap tahap bisa definit atau infinit.

c. Setiap keputusan kebijakan yang dibuat pada suatu tahap, status pada tahap tersebut ditransformasi ke dalam status yang berkaitan pada tahap berikutnya. Hubungan antar status pada tahap yang berurutan bisa bersifat deterministic atau probabilistik.

Pada sebuah persoalan dengan n-tahap, ada dua input, yaitu : (1) state pada tahap-n (Sn) dan decision variable (Xn). Sedang outputnya adalah :(1) return atau akibat dari setiap Xn yang dipilih, fn(s, Xn); dan (2) status baru yang menjadi input pada tahap berikutnya (Sn-1). Hubungan antara Xn dan fn(s, Xn) ditentukan oleh return function. Sedang hubungan antar status pada tahap tertentu ditentukan oleh transition function.

Decision Decision Xn X

St at e St at e St at e n- 1

Ret urn Ret urn fn( Sn, Xn) fn- 1( Sn- 1, X

e. Keputusan pada tahap berikutnya bersifat independen terhadap keputusan sebelumnya. Untuk menyelesaikan persoalan Dinamic Programming,

n-Gambar 3.3. Return dan Transition Function

d. Solusi pada Dinamic Programming berprinsip kepada optimalitas yang dikembangkan oleh Bellman.


(29)

dimulai dari solusi awal pada suatu tahap, dan secara berurutan menuju tahap berikutnya dengan proses yang terbalik (backward induction process).

f. Solusi optimal yang dihasilkan pada setiap tahap berprinsip kepada hubungan dalam bentuk fungsi rekursif (recursion relationship). Secara umum bentuk fungsi rekursif adalah :

fn*(Sn) = max/min {fn(Sn, Xn)}.

Di mana fn*(Sn) = adalah hasil optimal dari keputusan pada tahap-n.

3.3. Analisis Dynamic Programming

Dynamic Programming: adalah metode pemecahan masalah dengan cara menguraikan solusi menjadi sekumpulan langkah (step) atau tahapan (stage) sedemikian sehingga solusi dari persoalan dapat dipandang dari serangkaian keputusan yang saling berkaitan.

Pada penyelesaian persoalan dengan Dynamic Programming terdapat sejumlah berhingga pilihan yang mungkin, solusi pada setiap tahap dibangun dari hasil solusi tahap sebelumnya, kita menggunakan persyaratan optimasi dan kendala untuk membatasi sejumlah pilihan yang harus dipertimbangkan pada suatu tahap.

Pada Dynamic Programming, rangkaian keputusan yang optimal dibuat dengan menggunakan Prinsip Optimalitas. Prinsip Optimalitas: jika solusi total optimal, maka bagian solusi sampai tahap ke-k juga optimal. Prinsip optimalitas berarti bahwa jika kita bekerja dari tahap k ke tahap k + 1, kita dapat menggunakan hasil optimal dari tahap k tanpa harus kembali ke tahap awal. ongkos pada tahap k +1 = (ongkos yang dihasilkan pada tahap k ) + (ongkos dari tahap k ke tahap k + 1) Dengan prinsip optimalitas ini dijamin bahwa pengambilan keputusan pada suatu tahap adalah keputusan yang benar untuk tahap-tahap selanjutnya.


(30)

3.4. Dua Pendekatan Dynamic Programming

• Dua pendekatan yang digunakan dalam dynamic programming yaitu: maju (forward atau up-down) dan mundur (backward atau bottom-up).

Misalkan x1, x2, …, xn menyatakan peubah (variable) keputusan yang harus dibuat masing-masing untuk tahap 1, 2, …, n. Maka,

1. Dynamic Programming maju. Dynamic Programming bergerak mulai dari tahap 1, terus maju ke tahap 2, 3, dan seterusnya sampai tahap n. Runtunan peubah keputusan adalah x1, x2, …, xn.

2. Dynamic Programming mundur. Dynamic Programming bergerak mulai dari tahap n, terus mundur ke tahap n – 1, n – 2, dan seterusnya sampai tahap 1. Runtunan peubah keputusan adalah xn, xn-1, …, x1.

Langkah-langkah Pengembangan Algoritma Dynamic Programming 1. Karakteristikkan struktur solusi optimal.

2. Definisikan secara rekursif nilai solusi optimal. 3. Hitung nilai solusi optimal secara maju atau mundur. 4. Konstruksi solusi optimal.

3.5 Algoritma Dynamic Programming:

Algoritma dynamic programming adalah sebagai berikut. Langkah 0 (inisialisasi):

- inisialisasi si = 0 dan di = mai untuk i = 1, 2, ..., n

Langkah 1:

- isi sa dengan 1 (karena simpul a adalah simpul asal lintasan terpendek, jadi

sudah pasti terpilih)

- isi da dengan (tidak ada lintasan terpendek dari simpul a ke a)

Langkah 2, 3, ... , n-1:


(31)

- isi sj dengan 1

- perbarui di, untuk i = 1, 2, 3, …, n dengan: di (baru) = min{di (lama), dj + mji }.

3.6 Pseudo Code dan Flowchart Algoritma Dynamic Programming

3.6.1 Pseudo Code Mencari Lintasan Terpendek

Private Sub cmdFindShortPath_Click() do_search = True

current = src dist_fc = 0

flxS.TextMatrix(1, current) = "True" flxS.Row = 1

flxS.Col = current

flxS.CellForeColor = vbRed flxS.CellFontBold = True flxDist.TextMatrix(1, current) = 0 Do While do_search

For i = 1 To MAX - 1

If ((myVl(flxMap.TextMatrix(current, i)) <> 0) And _

(myVl(flxDist.TextMatrix(1, i)) > myVl(flxMap.TextMatrix(current, i)) + dist_fc)) Then

flxDist.TextMatrix(1, i) = myVl(flxMap.TextMatrix(current, i) + dist_fc) flxPath.TextMatrix(1, i) = current

End If Next i min = INF

For i = 1 To MAX - 1

If ((myVl(flxDist.TextMatrix(1, i)) < min) And (flxS.TextMatrix(1, i) = "False")) Then

min = myVl(flxDist.TextMatrix(1, i)) current = i

dist_fc = myVl(flxDist.TextMatrix(1, i)) End If

Next i

flxS.TextMatrix(1, current) = "True" flxS.Row = 1

flxS.Col = current

flxS.CellForeColor = vbRed flxS.CellFontBold = True If (min = INF) Then

do_search = False End If

Loop


(32)

makeAllLines_Black

lblResult.Caption = "Lintasan : " current = dest

Do While current <> src

If (flxPath.TextMatrix(1, current) = "0") Then

lblResult.Caption = "NO PATH FROM " & flxMap.TextMatrix(0, src) & " TO " & flxMap.TextMatrix(0, dest) & "!"

lblTheDistance.Caption = "" Exit Sub

End If

lblResult.Caption = lblResult.Caption & flxMap.TextMatrix(0, current) addTO_RESULT (current)

lblResult.Caption = lblResult.Caption & " <- " current = myVl(flxPath.TextMatrix(1, current)) Loop

lblResult.Caption = lblResult.Caption & flxMap.TextMatrix(0, src) addTO_RESULT (src)

lblTheDistance.Caption = "Tujuan: " & flxDist.TextMatrix(1, dest) markLINES

End Sub

3.6.2 Pseudo Code Input Ukuran Matriks

Private Sub Form_Activate()

If SELECTED_SHAPE <> -1 Then

UpDownWidth.Value = Form1.shp(SELECTED_SHAPE).Width UpDownHeight.Value = Form1.shp(SELECTED_SHAPE).Height End If

End Sub

Private Sub UpDownWidth_Change() If SELECTED_SHAPE <> -1 Then

Form1.shp(SELECTED_SHAPE).Width = UpDownWidth.Value If Form1.shp(SELECTED_SHAPE).Shape = 1 Or

Form1.shp(SELECTED_SHAPE).Shape = 3 Then Form1.shp(SELECTED_SHAPE).Height = Form1.shp(SELECTED_SHAPE).Width

End If

Form1.theLineCollection.updateLines End If

End Sub

Private Sub UpDownHeight_Change() If SELECTED_SHAPE <> -1 Then

Form1.shp(SELECTED_SHAPE).Height = UpDownHeight.Value If Form1.shp(SELECTED_SHAPE).Shape = 1 Or


(33)

Form1.shp(SELECTED_SHAPE).Width = Form1.shp(SELECTED_SHAPE).Height End If Form1.theLineCollection.updateLines End If End Sub

3.6.3 Pseudo Code Perhitungan Data Matriks

Private Sub cmdCalcData_Click() Dim i As Integer

Dim j As Integer Dim toIndex As Integer

flxMap.Rows = Form1.theBlockCollection.Count + 1 flxMap.Cols = Form1.theBlockCollection.Count + 1 If Form1.theBlockCollection.Count > 0 Then

flxMap.FixedRows = 1 flxMap.FixedCols = 1 End If

For i = 0 To flxMap.Cols - 1 flxMap.ColWidth(i) = 300 Next i

For i = 1 To Form1.theBlockCollection.Count flxMap.Row = i

flxMap.Col = 0

flxMap.Text = Form1.theBlockCollection(i).sCaption flxMap.Row = 0

flxMap.Col = i

flxMap.Text = Form1.theBlockCollection(i).sCaption flxMap.Row = i

For j = 1 To flxMap.Cols - 1 flxMap.TextMatrix(i, j) = "0" flxMap.Row = i

flxMap.Col = j

flxMap.CellForeColor = vbBlack flxMap.CellFontBold = False Next j

For j = 1 To Form1.theLineCollection.Count

If Form1.theLineCollection(j).sFrom = Form1.theBlockCollection(i).TagID Then toIndex =

Form1.theBlockCollection.getIndexFromTag(Form1.theLineCollection(j).sTo) flxMap.Col = toIndex

flxMap.Text = "1"

flxMap.CellForeColor = vbRed flxMap.CellFontBold = True End If


(34)

Next i End Sub

3.6.4 Flowchart Algoritma Dynamic Programming

Gambar 3.4. Flowchart Algoritma Dynamic Programming Mulai

Input nilai R(n)

i. Gambar node I ke j

Error, graph mengandung loop

negatif

D(n-1) = | F(n-1) * (S(n-1)); D(n)

bernilai negatif

Ya Tidak

Selesai Lintasan Terpndek

Tahap n, D(n) = F(n) * (S(n))

Tahap n-1, D(n-1) = F(n-1) * (S(n-1))


(35)

Contoh 3.1 Sebuah rute dari St. Louis ke San Francisco melalui beberapa kota antara

seperti yang terlihat pada gambar jaringan berikut :

Tahap-1 Tahap-2 Tahap-3 Tahap-4

Gambar 3.5. Route Jarak Terpendek 1

Angka pada setiap garis penghubung merupakan jarak. Dari gambar rute tersebut, maka persoalan ini dapat dibagi menjadi empat tahap (nomor tahap dimulai dari kota tujuan beurutan ke kota asal).

Ta h a p- 1 :

X1

S1

f1( S1,X1) =

cs1 , x 1 f1*

( S1) X1*

10

8 6 6 8


(36)

Ta h a p- 2 :

X2

S2

f2( S2,X2) = cs2 ,x 2 +

f1*( S1) f2*( S2) X2*

8 9

5 3+ 6= 9 7+ 8= 15 9 8

6 2+ 6= 8 5+ 8= 13 8 8

7 7+ 6= 13 3+ 8= 11 11 9

Ta h a p- 3 :

X3

S3

f3( S3,X3) = cs3 ,x 3 + f2*( S2)

f3*( S3) X3*

5 6 7

2 6+ 9= 15 9+ 8= 17 4+ 11= 15 15 5 or 7

3 2+ 9= 11 7+ 8= 15 3+ 11= 14 11 5

4 5+ 9= 14 9+ 8= 17 4+ 11= 15 14 5

Ta h a p- 4 :

X4

S4

f4( S4,X4) = cs4 ,x 4 + f3*( S3)

f4*( S4) X4*

2 3 4

1 3+ 15= 18 5+ 11= 16 2+ 14= 16 16 3 or 4

Pembacaan tabel-tabel ini untuk menentukan tingkat optimal adalah dari tahap 4

→tahap-3 →tahap-2 →tahap-1.

Rute optimal dengan jarak minimal adalah :

1 →3 →5 →8 →10, dengan total jarak = 5 + 2 + 3 + 6 = 16, atau 1 →4 →5 →8 →10, dengan total jarak = 2 + 5 + 3 + 6 = 16.

Contoh 3.2 Berbagai alternatif rute yang bisa ditempuh dari kota-A menuju

kota-J dapat digambarkan sebagai berikut (angka pada garis penghubung adalah biaya transport) :


(37)

Gambar 3.5. Route Jarak Terpendek 2

Ta h a p 1 .

S1 D1 R1 f1*( S1)

H J 6 f1*( S1

= H )

I J 7 f1*( S1 =

I )

Ta h a p 2 .

S2 D2 R2 S1 f1*( S1)

R2 +

f1*( S1)

f2*( S2)

E H 5 H 6 11

I 3 I 7 10 f2*( S2 = E)

F H 7 H 6 13 f2

*

( S2 = F)

I 8 I 7 15

H

H 2 H 6 8 f2*( S2

= H )


(38)

Ta h a p 3 .

S3 D3 R3 S2 f2*( S2) R3 +

f2*( S2) f3

*

( S3)

B

E 4 E 10 14

F 2 F 13 15

G 5 G 8 13 f3*( S3 = B)

C

E 4 E 10 14 f3*( S3 = C)

F 3 F 13 16

G 7 G 8 15

D

E 2 E 10 12 f3*( S3 = D )

F 1 F 13 14

G 5 G 8 13

Ta h a p 4 .

S4 D4 R4 S3 f3*( S3)

R4 +

f3*( S3)

f4*( S4)

A

B 5 B 13 18

C 7 C 14 21

D 3 D 12 15 f4

*

( S4 =

A)

Optimasi minimasi total biaya dapat dibuat secara bertahap dengan arah Backtracking :

Pada Tahap 4, dengan S4 = A : D4 optimal = D, dengan biaya A →D = 3, S3 = D. Pada Tahap 3, dengan S3 = D : D3 optimal = E, dengan biaya D →E = 2, S2 = E. Pada Tahap 2, dengan S2 = E : D2 optimal = I, dengan biaya E →I = 3, S1 = I. Pada Tahap 1, dengan S1 = I : D1 optimal = J, dengan biaya I →J = 7, S0 = J. Rute dengan total biaya minimum = A → D →E →I →J = 3 + 2 + 3 + 7 = 15.


(39)

Visual Basic adalah bahasa pemrograman yang digunakan untuk membuat aplikasi Windows yang berbasis grafis (GUI-Graphical User Interface). Visual basic merupakan even – driven programming (pemrograman terkendali kejadian), artinya programan menunggu sampai adanya respon dari pemakai berupa even atau kejadian tertentu (tombol diklik , menu pilih, dan lain-lain). Ketika even terdeteksi, kode yang berhubungan dengan event (prosedur event) akan dijalankan,

Berikut ini adalah point- point terpenting dalam sejarah perkembangan Visual Basic , sebagai berikut :

a. Visual Basic pertama kali diperkenalkan tahun 1991 yaitu program Visual Basic untuk DOS dan untuk Windows.

b. Visual Basic 3.0 dirilis tahun 1993.

c. Visual Basic 4.0 dirilis pada akhir 1995 (tambahan dukungan untuk aplikasi 32 bit).

d. Visual Basic 5.0 dirilis pada tahun 1997.

e. Visual Basic terbaru adalah Versi 6.0 yang dirilis pada akhir tahun 1998.

Pada umumnya Microsoft selaku pembuat Visual Basic membuat tiga edisi Visual Basic, yaitu :

a. Standard Edition merupakan produk pasar.

b. Profesional Edition yang berisi tambahan Microsoft Jet Data Acces Esngine (Database) dan pembuatan server OLE automation.

c. Eterprise Edition adalah edisi Client-Server.

Visual Basic selain disebut sebagai sebuah bahasa pemrograman, juga sering disebut sebagai sarana untuk menghasilkan program-program aplikasi berbasis windows.

Beberapa manfaat dari Visual Basic adalah :

1. Mudah dalam membuat program aplikasi berbasis windows.

2. Memiliki compiler handal yang dapat menguji program (debugging) serta dapat menghasilkan program akhir berakhiran EXE yang bersifat executable atau dapat langsung dijalankan.


(40)

3. Memiliki beberapa tambahan instruksi atau perintah Wizard. Wizard adalah sarana yang mempermudah di dalam pembuatan aplikasi dengan mengotomatisasi tugas- tugas tertentu.

Sarana akses data yang lebih cepat dan handal untuk membuat aplikasi database yang berkemampuan tinggi.

3.7.1. Rancangan Program Visual Basic 6.0


(41)

Gambar 3.7. Form Entri Data Graph


(42)

(43)

(44)

(45)

BAB 4

KESIMPULAN DAN SARAN

4.1. Kesimpulan

Dari hasil dan analisis yang dilakukan diperoleh kesimpulan sebagai berikut:

1. Persoalan menentukan lintasan terpendek adalah salah satu bentuk aplikasi dari penggunaan teori graf. Dynamic programming berciri memecah persoalan menjadi bagian yang lebih kecil (sub problem atau stage) dimana keputusan dibuat secara berurutan dan memperlakukan persoalan dimana keputusan pada satu tahap mempengaruhi keputusan tahap berikutnya.

2. Dalam menyelesaikan persoalan dengan Dynamic Programming, kita dapat menggunakan 2 pendekatan berbeda yaitu

- Maju (forward atau up-down) : bergerak mulai dari tahap 1, terus maju ke tahap 2,3,..,n. Urutan variabel keputusan adalah x1,x2,...,xn

- Mundur(backward atau bottom-up) : bergerak mulai dari tahap n, terus mundur ke tahap n-1, n-2,..,2,1. Urutan variabel keputusan adalah xn xn- ,x2,x1.

4.2. Saran

Sebagai saran yang ditujukan kepada pembaca yang ingin menentukan shortest path (route terpendek) pada graf multitahap (multistage graph) dengan menggunakan Algoritma Dynamic Programming, agar dapat mengembangkan metode ini lebih luas lagi. Disini penulis hanya menyelesaikan dalam cakupan kecil yang dapat dikerjakan secara manual dan mengimplementasikannya pada Microsoft Visual Basic 6.0.


(46)

Untuk itu Penulis berharap, agar pembaca dapat menyelesaikan persoalan dalam cakupan besar, dan merekayasa suatu software untuk menyelesaikan suatu masalah dengan menggunakan software dan komputer sederhana.

DAFTAR PUSTAKA

Evans. J.R., Minieka. E., 1992. “Optimization Algorithms for Networks and Graphs.” Marcel Dekker, Inc.

Foulds. L.R., 1984. “Combinatorial Optimization for Undergraduates.” Springer – Verlag Newyork, Inc.

Johnsonbaugh. R. “Matematika Diskrit”, Edisi keempat, Jilid 2. PT. Prenhallindo Jakarta.

Jong Jek Siang, M.Sc. Drs. “Matematika Diskrit dan Aplikasinya pada Ilmu Komputer” , Penerbit ANDI Yogyakarta.

Lars Lipson Marc, Ph.D, Lipschutz Seymour, Ph.D. 2002“Matematika Diskrit 2”. Terjemahan Tim Editor Penerbit Salemba Teknika.

Mulyono. S. SE., M.Sc. “Riset Operasi”, Penerbit Fakultas Ekonomi Universitas Indonesia.

Rao. S.S. “Optimization”, Second Edition. Wiley Eastern Limited New Delhi.

Render.B., Stair.Jr.R.M., Hanna.M.E., 2003. “Quanttative Analisys for Management”, Eighth Edition. Pearson Education, Inc.

Siagian. P. 1987. “Penelitian Operasional”, Penerbit Universitas Indonesia.


(47)

(48)

Menu Program

Option Explicit Dim distX As Single Dim distY As Single

Public WithEvents theBlockCollection As myBlockCollection Public WithEvents theLineCollection As myLineCollection Private Sub Form_Load()

MAX_SHAPE = 0 DRAGGED_SHAPE = -1 SELECTED_SHAPE = -1 PREV_SELECTED_SHAPE = -1

Set theBlockCollection = New myBlockCollection Set theLineCollection = New myLineCollection MAX_LINE = 0

End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) DRAGGED_SHAPE = -1

update_from_to End Sub

Private Sub Form_Unload(Cancel As Integer) End

End Sub

Private Sub lblLineCap_MouseDown(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Form_MouseDown Button, Shift, X / Screen.TwipsPerPixelX + lblLineCap(index).Left, Y / Screen.TwipsPerPixelY + lblLineCap(index).Top

End Sub

Private Sub lblLineCap_MouseMove(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Form_MouseMove Button, Shift, X / Screen.TwipsPerPixelX + lblLineCap(index).Left, Y / Screen.TwipsPerPixelY + lblLineCap(index).Top

End Sub

Private Sub lblLineCap_MouseUp(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Form_MouseUp Button, Shift, X / Screen.TwipsPerPixelX + lblLineCap(index).Left, Y / Screen.TwipsPerPixelY + lblLineCap(index).Top

End Sub

Private Sub lblShapeCap_MouseDown(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Form_MouseDown Button, Shift, X / Screen.TwipsPerPixelX + lblShapeCap(index).Left, Y / Screen.TwipsPerPixelY + lblShapeCap(index).Top


(49)

End Sub

Private Sub lblShapeCap_MouseMove(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Form_MouseMove Button, Shift, X / Screen.TwipsPerPixelX + lblShapeCap(index).Left, Y / Screen.TwipsPerPixelY + lblShapeCap(index).Top

End Sub

Private Sub lblShapeCap_MouseUp(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Form_MouseUp Button, Shift, X / Screen.TwipsPerPixelX + lblShapeCap(index).Left, Y / Screen.TwipsPerPixelY + lblShapeCap(index).Top

End Sub

Private Sub mnuAddRect_Click()

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

Private Sub mnuAddSquare_Click()

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

Private Sub mnuAddElipse_Click()

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

Private Sub mnuAddCircle_Click()

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

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim i As Integer

For i = MAX_SHAPE To 1 Step -1 If (shp(i).Visible = True) And _

(X > shp(i).Left) And (X < shp(i).Left + shp(i).Width) _

And (Y > shp(i).Top) And (Y < shp(i).Top + shp(i).Height) Then DRAGGED_SHAPE = i

If SELECTED_SHAPE <> i Then

PREV_SELECTED_SHAPE = SELECTED_SHAPE SELECTED_SHAPE = i

End If

distX = X - shp(i).Left distY = Y - shp(i).Top lblID.Caption = shp(i).Tag Exit For

End If Next i End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If DRAGGED_SHAPE <> -1 Then

shp(DRAGGED_SHAPE).Left = X - distX shp(DRAGGED_SHAPE).Top = Y - distY theLineCollection.updateLines

theBlockCollection(shp(DRAGGED_SHAPE).Tag).updateShapeCaptionPos End If


(50)

End Sub

Private Sub mnuChangeBackColor_Click() If SELECTED_SHAPE <> -1 Then CommonDialog1.ShowColor

shp(SELECTED_SHAPE).BackColor = CommonDialog1.Color End If

End Sub

Private Sub mnuChangeBorderColor_Click() If SELECTED_SHAPE <> -1 Then CommonDialog1.ShowColor

shp(SELECTED_SHAPE).BorderColor = CommonDialog1.Color End If

End Sub

Private Sub mnuChangeRect_Click() theBlockCollection.changeShape (0) End Sub

Private Sub mnuChangeSize_Click() frmSize.Show , Me

End Sub

Private Sub mnuChangeSquare_Click() theBlockCollection.changeShape (1) End Sub

Private Sub mnuChangeElipse_Click() theBlockCollection.changeShape (2) End Sub

Private Sub mnuChangeCircle_Click() theBlockCollection.changeShape (3) End Sub

Private Sub mnuDeleteBlock_Click()

theBlockCollection.removeShape SELECTED_SHAPE SELECTED_SHAPE = -1

End Sub

Private Sub mnuDeleteLine_Click()

theLineCollection.deleteLine SELECTED_SHAPE, PREV_SELECTED_SHAPE End Sub

Private Sub mnuFindShortPath_Click() frmFindShortPath.Show

End Sub

Private Sub mnuFindAllPaths_Click() frmFindAllPaths.Show

End Sub

Private Sub mnuJoinLine_Click()


(51)

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

Else

MsgBox "Dua Objek Harus Dipilih!" End If

End Sub

Private Sub mnuJoinArrow_Click()

If (PREV_SELECTED_SHAPE <> -1) And (SELECTED_SHAPE <> -1) Then theLineCollection.AddLine Form1.shp(PREV_SELECTED_SHAPE).Tag, Form1.shp(SELECTED_SHAPE).Tag, True

Else

MsgBox "Dua Objek Harus Dipilih!" End If

End Sub

Private Sub mnuAddCaptionToLine_Click()

If (PREV_SELECTED_SHAPE <> -1) And (SELECTED_SHAPE <> -1) Then Dim s As String

s = InputBox("Masukkan Karakter")

theLineCollection.AddCaptionToLine Form1.shp(PREV_SELECTED_SHAPE).Tag, Form1.shp(SELECTED_SHAPE).Tag, s

Else

MsgBox "Dua object harus di pilih" End If

End Sub

Private Sub mnuAddCaptionToBlock_Click() If (SELECTED_SHAPE <> -1) Then Dim s As String

s = InputBox("Masukkan Karakter untuk sebuah bentuk", "Dynamic Program", theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaption)

theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaption = s

theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).updateShapeCaptionPos Else

MsgBox "Object harus di pilih" End If

End Sub

Private Sub mnuAddCaptionUpperToBlock_Click() If (SELECTED_SHAPE <> -1) Then

Dim s As String

s = InputBox("Masukkan Karakter untuk sebuah bentuk", "Dynamic Program", theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaptionUpper) theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaptionUpper = s

theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).bSetUpperCaptionDown = False theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).updateShapeCaptionPos Else

MsgBox "Object harus di pilih" End If

End Sub

Private Sub mnuAddCaptionLowerToBlock_Click() mnuAddCaptionUpperToBlock_Click

theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).bSetUpperCaptionDown = True theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).updateShapeCaptionPos End Sub

Private Sub mnuKeluar_Click() Dim keluar As Byte


(52)

If keluar = vbOK Then End

End If End Sub

Private Sub mnuLoad_Click()

CommonDialog1.Flags = cdlOFNHideReadOnly

CommonDialog1.Filter = "Trace ZR Flow Data|*.tzr|All Files|*.*" CommonDialog1.DefaultExt = "tzr"

CommonDialog1.ShowOpen

load_FILE CommonDialog1.FileName End Sub

Private Sub load_FILE(sFILE As String) On Error GoTo err_lf

Dim i As Integer

Dim mFileNum As Integer mFileNum = FreeFile If sFILE = "" Then Exit Sub For i = 1 To MAX_SHAPE Unload shp(i)

Unload lblShapeCap(i) Unload lblShapeCapUpper(i) Next i

MAX_SHAPE = 0

For i = theBlockCollection.Count To 1 Step -1 theBlockCollection.Remove i

Next i

For i = 1 To MAX_LINE Unload ln(i) Unload aDot(i) Unload arrUp(i) Unload arrDown(i) Unload lblLineCap(i) Next i

MAX_LINE = 0

For i = theLineCollection.Count To 1 Step -1 theLineCollection.Remove i

Next i

Open sFILE For Input As mFileNum Dim tempS As String

Dim lineCounter As Integer Dim shapeCounter As Integer Line Input #mFileNum, tempS shapeCounter = Val(tempS) Line Input #mFileNum, tempS lineCounter = Val(tempS) Dim xS As cBlock Dim sName As String For i = 1 To shapeCounter Line Input #mFileNum, tempS sName = tempS

Line Input #mFileNum, tempS

Set xS = theBlockCollection.AddShape(Val(tempS), sName) Line Input #mFileNum, tempS

xS.shapeLeft = Val(tempS) Line Input #mFileNum, tempS


(53)

xS.shapeTop = Val(tempS) Line Input #mFileNum, tempS xS.shapeWidth = Val(tempS) Line Input #mFileNum, tempS xS.shapeHeight = Val(tempS) Line Input #mFileNum, tempS xS.shapeBackColor = Val(tempS) Line Input #mFileNum, tempS xS.shapeBorderColor = Val(tempS) Line Input #mFileNum, tempS xS.sCaption = tempS

Line Input #mFileNum, tempS xS.sCaptionUpper = tempS Line Input #mFileNum, tempS

xS.bSetUpperCaptionDown = Val(tempS) xS.updateShapeCaptionPos

xS.Visible = True Next i

Line Input #mFileNum, tempS Line Input #mFileNum, tempS Dim sFrom As String

Dim sTo As String Dim psik_index As Integer Dim xL As cLine

For i = 1 To lineCounter

Line Input #mFileNum, tempS psik_index = InStr(1, tempS, ",") sFrom = Mid(tempS, 1, psik_index - 1) sTo = Mid(tempS, psik_index + 1) Line Input #mFileNum, tempS

Set xL = theLineCollection.AddLine(sFrom, sTo, Val(tempS)) Line Input #mFileNum, tempS

xL.sCaption = tempS Next i theLineCollection.updateLines Close mFileNum update_from_to Exit Sub err_lf:

MsgBox "Buka: " & sFILE & vbNewLine & Err.Description End Sub

Private Sub mnuSave_Click()

CommonDialog1.Flags = cdlOFNHideReadOnly + cdlOFNOverwritePrompt CommonDialog1.Filter = "Trace ZR Flow Data|*.tzr|All Files|*.*"

CommonDialog1.DefaultExt = "tzr" CommonDialog1.ShowSave Dim mFileNum As Integer mFileNum = FreeFile

If CommonDialog1.FileName = "" Then Exit Sub

Open CommonDialog1.FileName For Output As mFileNum Dim sDl As String

sDl = " " & vbTab & " <--"

Print #mFileNum, theBlockCollection.Count & sDl & "SHAPES" Print #mFileNum, theLineCollection.Count & sDl & "LINES" Dim xB As cBlock

For Each xB In theBlockCollection Print #mFileNum, xB.TagID


(54)

Print #mFileNum, xB.shapeLeft & sDl & xB.theObjectShape.Tag & ".LEFT" Print #mFileNum, xB.shapeTop & sDl & xB.theObjectShape.Tag & ".TOP" Print #mFileNum, xB.shapeWidth & sDl & xB.theObjectShape.Tag & ".WIDTH" Print #mFileNum, xB.shapeHeight & sDl & xB.theObjectShape.Tag & ".HEIGHT"

Print #mFileNum, xB.shapeBackColor & sDl & xB.theObjectShape.Tag & ".BACKCOLOR" Print #mFileNum, xB.shapeBorderColor & sDl & xB.theObjectShape.Tag & ".BORDERCOLOR" Print #mFileNum, xB.sCaption

Print #mFileNum, xB.sCaptionUpper If xB.bSetUpperCaptionDown Then

Print #mFileNum, "1" & sDl & "Caption down" Else

Print #mFileNum, "0" & sDl & "Caption up" End If

Next xB

Dim xL As cLine Print #mFileNum, " "

Print #mFileNum, "---- LINES ---- from,to ----" For Each xL In theLineCollection

Print #mFileNum, xL.sFrom & "," & xL.sTo If xL.bShowArrow Then

Print #mFileNum, "1" & sDl & "Arrow" Else

Print #mFileNum, "0" & sDl & "Line" End If

Print #mFileNum, xL.sCaption Next xL

Close mFileNum End Sub

Private Sub theBlockCollection_linkError(sERROR As String) MsgBox sERROR

End Sub

Private Sub theLineCollection_linkError(sERROR As String) MsgBox sERROR

End Sub

Private Sub update_from_to() On Error GoTo err_uft Dim sFrom As String Dim sTo As String sFrom = "?" sTo = "?"

If PREV_SELECTED_SHAPE <> -1 Then

sFrom = theBlockCollection(Form1.shp(PREV_SELECTED_SHAPE).Tag).sCaption End If

If SELECTED_SHAPE <> -1 Then

sTo = theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaption End If

lblFromTo.Caption = "Dari: " & sFrom & " Ke: " & sTo Exit Sub

err_uft:

Debug.Print "update_from_to: " & Err.Description End Sub

Mencari seluruh lintasan

Option Explicit Dim sFrom As String


(55)

Dim sTo As String Const arrow = " -> " Dim path_id As Integer

Private Sub cmdCalcData_Click() Dim i As Integer

Dim j As Integer Dim toIndex As Integer

flxMap.Rows = Form1.theBlockCollection.Count + 1 flxMap.Cols = Form1.theBlockCollection.Count + 1 If Form1.theBlockCollection.Count > 0 Then flxMap.FixedRows = 1

flxMap.FixedCols = 1 End If

For i = 0 To flxMap.Cols - 1 flxMap.ColWidth(i) = 300 Next i

For i = 1 To Form1.theBlockCollection.Count flxMap.Row = i

flxMap.Col = 0

flxMap.Text = Form1.theBlockCollection(i).sCaption flxMap.Row = 0

flxMap.Col = i

flxMap.Text = Form1.theBlockCollection(i).sCaption flxMap.Row = i

For j = 1 To flxMap.Cols - 1 flxMap.TextMatrix(i, j) = "0" flxMap.Row = i

flxMap.Col = j

flxMap.CellForeColor = vbBlack flxMap.CellFontBold = False Next j

For j = 1 To Form1.theLineCollection.Count

If Form1.theLineCollection(j).sFrom = Form1.theBlockCollection(i).TagID Then

toIndex = Form1.theBlockCollection.getIndexFromTag(Form1.theLineCollection(j).sTo) flxMap.Col = toIndex

flxMap.Text = "1"

flxMap.CellForeColor = vbRed flxMap.CellFontBold = True End If

Next j Next i End Sub

Private Sub cmdShowTest_Click() frmTest.Show

End Sub

Private Sub Form_Activate()

If PREV_SELECTED_SHAPE = -1 Or SELECTED_SHAPE = -1 Then lblFromTo.Caption = "Tidak ada objek yang dipilih"

cmdFindAllPaths.Enabled = False Else

cmdFindAllPaths.Enabled = True

sFrom = Form1.theBlockCollection(Form1.shp(PREV_SELECTED_SHAPE).Tag).sCaption sTo = Form1.theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaption

lblFromTo.Caption = "Dari: " & sFrom & " Ke: " & sTo End If


(56)

Private Sub findPaths(src As Integer, dest As Integer, p As String) Dim tc As String

Dim i As Integer tc = p

If (flxMap.TextMatrix(src, dest) = "1") Then

If Not (0 < InStr(1, tc, flxMap.TextMatrix(0, dest))) Then Dim s As String

s = tc s = s & arrow

s = s & flxMap.TextMatrix(0, dest) path_id = path_id + 1

txtOut.Text = txtOut.Text & path_id & ". " & s & vbNewLine End If

End If

For i = 1 To flxMap.Cols - 1

If (flxMap.TextMatrix(src, i) = "1") Then

If Not (0 < InStr(1, tc, flxMap.TextMatrix(0, i))) Then Dim s2 As String

s2 = tc

s2 = s2 & arrow

s2 = s2 & flxMap.TextMatrix(0, i) findPaths i, dest, s2

End If End If Next i

frmTest.listPaths.AddItem p If (Mid(p, Len(p)) = sTo) Then frmTest.listGoodPaths.AddItem p End If

End Sub

Private Sub printAllPaths(src As Integer, dest As Integer) Dim start As String

path_id = 0

frmTest.listPaths.Clear frmTest.listGoodPaths.Clear

txtOut.Text = txtOut.Text & "Paths from " & flxMap.TextMatrix(0, src) & " to " & flxMap.TextMatrix(0, dest) & vbNewLine

start = flxMap.TextMatrix(0, src) findPaths src, dest, start

If (path_id = 0) Then

txtOut.Text = txtOut.Text & "-- NO PATHS! --" & vbNewLine End If

txtOut.Text = txtOut.Text & vbNewLine & vbNewLine End Sub

Private Sub cmdFindAllPaths_Click() Dim i As Integer

Dim isrc As Integer Dim idest As Integer isrc = -1

idest = -1

For i = 1 To flxMap.Cols - 1

If (flxMap.TextMatrix(0, i) = sFrom) Then isrc = i

End If

If (flxMap.TextMatrix(0, i) = sTo) Then idest = i


(57)

End If Next i

If (isrc = -1) Or (idest = -1) Then MsgBox "Data ada yang salah" Exit Sub

End If

printAllPaths isrc, idest txtOut.SetFocus

txtOut.SelStart = Len(txtOut.Text) End Sub

Private Sub cmdCLS_Click() txtOut.Text = ""

End Sub

Mencari Lintasan Terpendek

Option Explicit Dim sFrom As String Dim sTo As String Const INF = 32767

Dim sRESULT(1 To 100) As String Dim iRES_SIZE As Integer Private Sub cmdCalcData_Click() Dim i As Integer

Dim j As Integer Dim toIndex As Integer

flxMap.Rows = Form1.theBlockCollection.Count + 1 flxMap.Cols = Form1.theBlockCollection.Count + 1 If Form1.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 Form1.theBlockCollection.Count flxMap.Row = i

flxMap.Col = 0

flxMap.Text = Form1.theBlockCollection(i).sCaption flxMap.Row = 0

flxMap.Col = i

flxMap.Text = Form1.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


(58)

For j = 1 To Form1.theLineCollection.Count

If Form1.theLineCollection(j).sFrom = Form1.theBlockCollection(i).TagID Then

toIndex = Form1.theBlockCollection.getIndexFromTag(Form1.theLineCollection(j).sTo) flxMap.Col = toIndex

flxMap.Text = Form1.theLineCollection(j).sCaption

If (flxMap.Text = "") Then flxMap.Text = "1" ' don't allow empty!!!! (for lines with no caption)

flxMap.CellForeColor = vbRed flxMap.CellFontBold = True End If

Next j Next i End Sub

Private Sub prepareFSP() Dim i As Integer flxS.Rows = 2 flxDist.Rows = 2 flxPath.Rows = 2 flxS.Cols = flxMap.Cols flxDist.Cols = flxMap.Cols flxPath.Cols = flxMap.Cols If flxS.Cols > 1 Then flxS.FixedRows = 1 flxDist.FixedRows = 1 flxPath.FixedRows = 1 flxS.FixedCols = 1 flxDist.FixedCols = 1 flxPath.FixedCols = 1 End If

For i = 0 To flxS.Cols - 1

flxS.ColWidth(i) = flxMap.ColWidth(i) flxDist.ColWidth(i) = flxMap.ColWidth(i) flxPath.ColWidth(i) = flxMap.ColWidth(i) flxS.TextMatrix(0, i) = flxMap.TextMatrix(0, i) flxDist.TextMatrix(0, i) = flxMap.TextMatrix(0, i) flxPath.TextMatrix(0, i) = flxMap.TextMatrix(0, i) Next i

For i = 1 To flxS.Cols - 1

flxS.TextMatrix(1, i) = "False" flxS.Row = 1

flxS.Col = i

flxS.CellForeColor = vbBlack flxS.CellFontBold = False flxDist.TextMatrix(1, i) = "INF" flxPath.TextMatrix(1, i) = "0" Next i

End Sub

Private Sub cmdFindShortPath_Click() prepareFSP

Dim src As Integer Dim dest As Integer

src = getIndexOfTabName(sFrom) dest = getIndexOfTabName(sTo) If (src = -1) Or (dest = -1) Then MsgBox "Data Salah Input" Exit Sub


(59)

flxS.Row = 1 flxDist.Row = 1 flxPath.Row = 1 Dim MAX As Integer MAX = flxMap.Cols Dim current As Integer Dim dist_fc As Integer Dim i As Integer Dim min As Integer Dim do_search As Boolean do_search = True

current = src dist_fc = 0

flxS.TextMatrix(1, current) = "True" flxS.Row = 1

flxS.Col = current

flxS.CellForeColor = vbRed flxS.CellFontBold = True flxDist.TextMatrix(1, current) = 0 Do While do_search

For i = 1 To MAX - 1

If ((myVl(flxMap.TextMatrix(current, i)) <> 0) And _

(myVl(flxDist.TextMatrix(1, i)) > myVl(flxMap.TextMatrix(current, i)) + dist_fc)) Then flxDist.TextMatrix(1, i) = myVl(flxMap.TextMatrix(current, i) + dist_fc)

flxPath.TextMatrix(1, i) = current End If

Next i min = INF

For i = 1 To MAX - 1

If ((myVl(flxDist.TextMatrix(1, i)) < min) And (flxS.TextMatrix(1, i) = "False")) Then min = myVl(flxDist.TextMatrix(1, i))

current = i

dist_fc = myVl(flxDist.TextMatrix(1, i)) End If

Next i

flxS.TextMatrix(1, current) = "True" flxS.Row = 1

flxS.Col = current

flxS.CellForeColor = vbRed flxS.CellFontBold = True If (min = INF) Then do_search = False End If

Loop

iRES_SIZE = 0 makeAllLines_Black

lblResult.Caption = "Lintasan : " current = dest

Do While current <> src

If (flxPath.TextMatrix(1, current) = "0") Then

lblResult.Caption = "NO PATH FROM " & flxMap.TextMatrix(0, src) & " TO " & flxMap.TextMatrix(0, dest) & "!"

lblTheDistance.Caption = "" Exit Sub

End If

lblResult.Caption = lblResult.Caption & flxMap.TextMatrix(0, current) addTO_RESULT (current)

lblResult.Caption = lblResult.Caption & " <- " current = myVl(flxPath.TextMatrix(1, current))


(60)

Loop

lblResult.Caption = lblResult.Caption & flxMap.TextMatrix(0, src) addTO_RESULT (src)

lblTheDistance.Caption = "Tujuan: " & flxDist.TextMatrix(1, dest) markLINES

End Sub

Private Sub markLINES() Dim i As Integer Dim tagFrom As String Dim tagTo As String

For i = iRES_SIZE To 2 Step -1

tagFrom = getShapeID_from_cap(sRESULT(i)) tagTo = getShapeID_from_cap(sRESULT(i - 1)) redLINE tagFrom, tagTo

Next i End Sub

Private Sub redLINE(sFrom As String, sTo As String) Dim xL As cLine

For Each xL In Form1.theLineCollection

If (xL.sFrom = sFrom) And (xL.sTo = sTo) Then xL.theObjectLine.BorderColor = vbRed xL.theObjectLine.BorderWidth = 5 End If

Next xL End Sub

Private Sub makeAllLines_Black() Dim xL As cLine

For Each xL In Form1.theLineCollection xL.theObjectLine.BorderColor = vbBlack xL.theObjectLine.BorderWidth = 2 Next xL

End Sub

Private Function getShapeID_from_cap(sCap As String) As String Dim xB As cBlock

For Each xB In Form1.theBlockCollection If xB.sCaption = sCap Then

getShapeID_from_cap = xB.TagID End If

Next xB End Function

Private Function getIndexOfTabName(s As String) As Integer Dim i As Integer

For i = 1 To flxMap.Cols - 1

If flxMap.TextMatrix(0, i) = s Then getIndexOfTabName = i

Exit Function End If


(61)

getIndexOfTabName = -1 End Function

Private Sub Form_Activate()

If PREV_SELECTED_SHAPE = -1 Or SELECTED_SHAPE = -1 Then lblFromTo.Caption = "nothing selected"

cmdFindShortPath.Enabled = False Else

cmdFindShortPath.Enabled = True

sFrom = Form1.theBlockCollection(Form1.shp(PREV_SELECTED_SHAPE).Tag).sCaption sTo = Form1.theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaption

lblFromTo.Caption = "Dari: " & sFrom & " ke: " & sTo End If

End Sub

Private Function myVl(s As String) As Integer If s = "INF" Then

myVl = INF Else

myVl = Val(s) End If

End Function

Private Sub addTO_RESULT(index As Integer) iRES_SIZE = iRES_SIZE + 1

sRESULT(iRES_SIZE) = flxMap.TextMatrix(0, index) End Sub

Input Ukuran Matriks

Option Explicit

Private Sub Form_Activate()

If SELECTED_SHAPE <> -1 Then

UpDownWidth.Value = Form1.shp(SELECTED_SHAPE).Width UpDownHeight.Value = Form1.shp(SELECTED_SHAPE).Height End If

End Sub

Private Sub UpDownWidth_Change() If SELECTED_SHAPE <> -1 Then

Form1.shp(SELECTED_SHAPE).Width = UpDownWidth.Value

If Form1.shp(SELECTED_SHAPE).Shape = 1 Or Form1.shp(SELECTED_SHAPE).Shape = 3 Then

Form1.shp(SELECTED_SHAPE).Height = Form1.shp(SELECTED_SHAPE).Width End If

Form1.theLineCollection.updateLines End If

End Sub

Private Sub UpDownHeight_Change() If SELECTED_SHAPE <> -1 Then

Form1.shp(SELECTED_SHAPE).Height = UpDownHeight.Value

If Form1.shp(SELECTED_SHAPE).Shape = 1 Or Form1.shp(SELECTED_SHAPE).Shape = 3 Then

Form1.shp(SELECTED_SHAPE).Width = Form1.shp(SELECTED_SHAPE).Height End If


(62)

End If End Sub

Tes lintasan terpendek

Option Explicit

Private Sub cmdDrawAll_Click() Dim i As Integer

Me.Cls

Me.ForeColor = vbBlack

For i = 0 To listPaths.ListCount - 1 drawPath (listPaths.List(i)) Next i

End Sub

Private Sub drawPath(s As String) Dim i As Integer

Dim c As String Dim prevX As Integer Dim prevY As Integer i = 1

CurrentX = 10 CurrentY = 10 prevX = -1 prevY = -1

If txtFirstChar.Text = "" Then txtFirstChar.Text = "A" Do While (Mid(s, i, 1) <> "")

c = Mid(s, i, 1)

CurrentX = (Asc(c) - Asc(txtFirstChar.Text)) * 40 + 10 If (prevX <> -1) Then

Line (prevX, prevY + TextHeight("A"))-(CurrentX, CurrentY) End If

prevX = CurrentX prevY = CurrentY Print c

i = i + 5

CurrentY = CurrentY + 40 Loop

End Sub

Private Sub listPaths_Click() Dim i As Integer

Me.Cls

Me.ForeColor = vbBlack

If (listPaths.ListIndex <> -1) Then

drawPath (listPaths.List(listPaths.ListIndex)) End If

End Sub

Private Sub listGoodPaths_Click() cmdDrawAll_Click

If (listGoodPaths.ListIndex <> -1) Then Me.ForeColor = vbRed

drawPath (listGoodPaths.List(listGoodPaths.ListIndex)) End If


(63)

(1)

For j = 1 To Form1.theLineCollection.Count

If Form1.theLineCollection(j).sFrom = Form1.theBlockCollection(i).TagID Then

toIndex = Form1.theBlockCollection.getIndexFromTag(Form1.theLineCollection(j).sTo) flxMap.Col = toIndex

flxMap.Text = Form1.theLineCollection(j).sCaption

If (flxMap.Text = "") Then flxMap.Text = "1" ' don't allow empty!!!! (for lines with no caption)

flxMap.CellForeColor = vbRed flxMap.CellFontBold = True End If

Next j Next i End Sub

Private Sub prepareFSP() Dim i As Integer flxS.Rows = 2 flxDist.Rows = 2 flxPath.Rows = 2 flxS.Cols = flxMap.Cols flxDist.Cols = flxMap.Cols flxPath.Cols = flxMap.Cols If flxS.Cols > 1 Then flxS.FixedRows = 1 flxDist.FixedRows = 1 flxPath.FixedRows = 1 flxS.FixedCols = 1 flxDist.FixedCols = 1 flxPath.FixedCols = 1 End If

For i = 0 To flxS.Cols - 1

flxS.ColWidth(i) = flxMap.ColWidth(i) flxDist.ColWidth(i) = flxMap.ColWidth(i) flxPath.ColWidth(i) = flxMap.ColWidth(i) flxS.TextMatrix(0, i) = flxMap.TextMatrix(0, i) flxDist.TextMatrix(0, i) = flxMap.TextMatrix(0, i) flxPath.TextMatrix(0, i) = flxMap.TextMatrix(0, i) Next i

For i = 1 To flxS.Cols - 1

flxS.TextMatrix(1, i) = "False" flxS.Row = 1

flxS.Col = i

flxS.CellForeColor = vbBlack flxS.CellFontBold = False flxDist.TextMatrix(1, i) = "INF" flxPath.TextMatrix(1, i) = "0" Next i

End Sub

Private Sub cmdFindShortPath_Click() prepareFSP

Dim src As Integer Dim dest As Integer

src = getIndexOfTabName(sFrom) dest = getIndexOfTabName(sTo) If (src = -1) Or (dest = -1) Then MsgBox "Data Salah Input" Exit Sub


(2)

flxS.Row = 1 flxDist.Row = 1 flxPath.Row = 1 Dim MAX As Integer MAX = flxMap.Cols Dim current As Integer Dim dist_fc As Integer Dim i As Integer Dim min As Integer Dim do_search As Boolean do_search = True

current = src dist_fc = 0

flxS.TextMatrix(1, current) = "True" flxS.Row = 1

flxS.Col = current

flxS.CellForeColor = vbRed flxS.CellFontBold = True flxDist.TextMatrix(1, current) = 0 Do While do_search

For i = 1 To MAX - 1

If ((myVl(flxMap.TextMatrix(current, i)) <> 0) And _

(myVl(flxDist.TextMatrix(1, i)) > myVl(flxMap.TextMatrix(current, i)) + dist_fc)) Then flxDist.TextMatrix(1, i) = myVl(flxMap.TextMatrix(current, i) + dist_fc)

flxPath.TextMatrix(1, i) = current End If

Next i min = INF

For i = 1 To MAX - 1

If ((myVl(flxDist.TextMatrix(1, i)) < min) And (flxS.TextMatrix(1, i) = "False")) Then min = myVl(flxDist.TextMatrix(1, i))

current = i

dist_fc = myVl(flxDist.TextMatrix(1, i)) End If

Next i

flxS.TextMatrix(1, current) = "True" flxS.Row = 1

flxS.Col = current

flxS.CellForeColor = vbRed flxS.CellFontBold = True If (min = INF) Then do_search = False End If

Loop

iRES_SIZE = 0 makeAllLines_Black

lblResult.Caption = "Lintasan : " current = dest

Do While current <> src

If (flxPath.TextMatrix(1, current) = "0") Then

lblResult.Caption = "NO PATH FROM " & flxMap.TextMatrix(0, src) & " TO " & flxMap.TextMatrix(0, dest) & "!"

lblTheDistance.Caption = "" Exit Sub

End If

lblResult.Caption = lblResult.Caption & flxMap.TextMatrix(0, current) addTO_RESULT (current)

lblResult.Caption = lblResult.Caption & " <- " current = myVl(flxPath.TextMatrix(1, current))


(3)

Loop

lblResult.Caption = lblResult.Caption & flxMap.TextMatrix(0, src) addTO_RESULT (src)

lblTheDistance.Caption = "Tujuan: " & flxDist.TextMatrix(1, dest) markLINES

End Sub

Private Sub markLINES() Dim i As Integer Dim tagFrom As String Dim tagTo As String

For i = iRES_SIZE To 2 Step -1

tagFrom = getShapeID_from_cap(sRESULT(i)) tagTo = getShapeID_from_cap(sRESULT(i - 1)) redLINE tagFrom, tagTo

Next i End Sub

Private Sub redLINE(sFrom As String, sTo As String) Dim xL As cLine

For Each xL In Form1.theLineCollection

If (xL.sFrom = sFrom) And (xL.sTo = sTo) Then xL.theObjectLine.BorderColor = vbRed xL.theObjectLine.BorderWidth = 5 End If

Next xL End Sub

Private Sub makeAllLines_Black() Dim xL As cLine

For Each xL In Form1.theLineCollection xL.theObjectLine.BorderColor = vbBlack xL.theObjectLine.BorderWidth = 2 Next xL

End Sub

Private Function getShapeID_from_cap(sCap As String) As String Dim xB As cBlock

For Each xB In Form1.theBlockCollection If xB.sCaption = sCap Then

getShapeID_from_cap = xB.TagID End If

Next xB End Function

Private Function getIndexOfTabName(s As String) As Integer Dim i As Integer

For i = 1 To flxMap.Cols - 1

If flxMap.TextMatrix(0, i) = s Then getIndexOfTabName = i

Exit Function End If


(4)

getIndexOfTabName = -1 End Function

Private Sub Form_Activate()

If PREV_SELECTED_SHAPE = -1 Or SELECTED_SHAPE = -1 Then lblFromTo.Caption = "nothing selected"

cmdFindShortPath.Enabled = False Else

cmdFindShortPath.Enabled = True

sFrom = Form1.theBlockCollection(Form1.shp(PREV_SELECTED_SHAPE).Tag).sCaption sTo = Form1.theBlockCollection(Form1.shp(SELECTED_SHAPE).Tag).sCaption

lblFromTo.Caption = "Dari: " & sFrom & " ke: " & sTo End If

End Sub

Private Function myVl(s As String) As Integer If s = "INF" Then

myVl = INF Else

myVl = Val(s) End If

End Function

Private Sub addTO_RESULT(index As Integer) iRES_SIZE = iRES_SIZE + 1

sRESULT(iRES_SIZE) = flxMap.TextMatrix(0, index) End Sub

Input Ukuran Matriks Option Explicit

Private Sub Form_Activate()

If SELECTED_SHAPE <> -1 Then

UpDownWidth.Value = Form1.shp(SELECTED_SHAPE).Width UpDownHeight.Value = Form1.shp(SELECTED_SHAPE).Height End If

End Sub

Private Sub UpDownWidth_Change() If SELECTED_SHAPE <> -1 Then

Form1.shp(SELECTED_SHAPE).Width = UpDownWidth.Value

If Form1.shp(SELECTED_SHAPE).Shape = 1 Or Form1.shp(SELECTED_SHAPE).Shape = 3 Then

Form1.shp(SELECTED_SHAPE).Height = Form1.shp(SELECTED_SHAPE).Width End If

Form1.theLineCollection.updateLines End If

End Sub

Private Sub UpDownHeight_Change() If SELECTED_SHAPE <> -1 Then

Form1.shp(SELECTED_SHAPE).Height = UpDownHeight.Value

If Form1.shp(SELECTED_SHAPE).Shape = 1 Or Form1.shp(SELECTED_SHAPE).Shape = 3 Then

Form1.shp(SELECTED_SHAPE).Width = Form1.shp(SELECTED_SHAPE).Height End If


(5)

End If End Sub

Tes lintasan terpendek Option Explicit

Private Sub cmdDrawAll_Click() Dim i As Integer

Me.Cls

Me.ForeColor = vbBlack

For i = 0 To listPaths.ListCount - 1 drawPath (listPaths.List(i)) Next i

End Sub

Private Sub drawPath(s As String) Dim i As Integer

Dim c As String Dim prevX As Integer Dim prevY As Integer i = 1

CurrentX = 10 CurrentY = 10 prevX = -1 prevY = -1

If txtFirstChar.Text = "" Then txtFirstChar.Text = "A" Do While (Mid(s, i, 1) <> "")

c = Mid(s, i, 1)

CurrentX = (Asc(c) - Asc(txtFirstChar.Text)) * 40 + 10 If (prevX <> -1) Then

Line (prevX, prevY + TextHeight("A"))-(CurrentX, CurrentY) End If

prevX = CurrentX prevY = CurrentY Print c

i = i + 5

CurrentY = CurrentY + 40 Loop

End Sub

Private Sub listPaths_Click() Dim i As Integer

Me.Cls

Me.ForeColor = vbBlack

If (listPaths.ListIndex <> -1) Then

drawPath (listPaths.List(listPaths.ListIndex)) End If

End Sub

Private Sub listGoodPaths_Click() cmdDrawAll_Click

If (listGoodPaths.ListIndex <> -1) Then Me.ForeColor = vbRed

drawPath (listGoodPaths.List(listGoodPaths.ListIndex)) End If


(6)