Anda di halaman 1dari 125

IMPLEMENTASI MOBILE TRACKING MENGGUNAKAN

METODE ANT COLONY OPTIMIZATION


DAN GOOGLE MAPS API


SKRIPSI


DONNY SANJAYA
111421056








PROGRAM STUDI EKSTENSI S1 ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI
UNIVERSITAS SUMATERA UTARA
MEDAN
2014
Universitas Sumatera Utara
IMPLEMENTASI MOBILE TRACKING MENGGUNAKAN
METODE ANT COLONY OPTIMIZATION
DAN GOOGLE MAPS API

SKRIPSI


Diajukan untuk melengkapi tugas dan memenuhi syarat memperoleh ijazah
Sarjana Ilmu Komputer


DONNY SANJAYA
111421056









PROGRAM STUDI EKSTENSI S1 ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI
UNIVERSITAS SUMATERA UTARA
MEDAN
2014
Universitas Sumatera Utara
iii

PERSETUJUAN



Judul : IMPLEMENTASI MOBILE TRACKING
MENGGUNAKAN METODE ANT COLONY
OPTIMIZATION DAN GOOGLE MAPS API
Kategori : SKRIPSI
Nama : DONNY SANJAYA
Nomor Induk Mahasiswa : 111421056
Program Studi : EKSTENSI S1 ILMU KOMPUTER
Departemen : ILMU KOMPUTER
Fakultas : FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI
INFORMASI UNIVERSITAS SUMATERA UTARA



Komisi Pembimbing:


Dosen Pembimbing II Dosen Pembimbing I




Drs. Dahlan Sitompul, M.Eng Ade Candra S.T, M.Kom
NIP. 19670725 200501 1 002 NIP. 19790904 200912 1 002


Diketahui/Disetujui oleh
Program Studi S1 Ilmu Komputer
Ketua,




Dr. Poltak Sihombing, M.Kom
NIP. 19620217 199103 1 001


Universitas Sumatera Utara
iv


PERNYATAAN



IMPLEMENTASI MOBILE TRACKING MENGGUNAKAN METODE ANT
COLONY OPTIMIZATION DAN GOOGLE MAPS API

SKRIPSI

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




Medan, Januari 2014





Donny Sanjaya
111421056

Universitas Sumatera Utara
v

PENGHARGAAN


Alhamdulillah saya ucapkan kepada Allah SWT yang telah melimpahkan rahmat dan
karunia-NYA serta salawat dan salam kepada junjungan atas Nabi Muhammad SAW
karena skripsi ini telah berhasil diselesaikan dalam waktu yang telah ditentukan.

Dalam penulisan skripsi ini penulis banyak mendapatkan bantuan serta dorongan
dari pihak lain. Sehingga dengan segala kerendahan hati penulis mengucapkan
terimakasih kepada:

1. Bapak Prof Dr Syahril Pasaribu, DTMH, MSc (CTM), SpA(K) selaku Rektor
Universitas Sumatera Utara.
2. Bapak Prof. Dr. Muhammad Zarlis selaku Dekan Fakultas Ilmu Komputer dan
Teknologi Informasi.
3. Bapak Drs. Poltak Sihombing, M.Kom selaku Ketua Program Studi Ilmu
Komputer Universitas Sumatera Utara dan sekaligus sebagai Dosen Pembanding
I.
4. Ibu Dian Rachmawati S.Si, M.Kom selaku koordinator Ekstensi S1 Ilmu
Komputer Universitas Sumatera Utara.
5. Dosen Pembimbing Bapak Ade Candra, ST, M.Kom dan Drs. Dahlan Sitompul,
M.Eng yang bersedia meluangkan waktu, pikiran, saran, panduan serta
memberikan pengetahuan dan motivasi dalam penyelesaian skripsi ini.
6. Dosen Pembanding II Bapak Drs. Marihat Situmorang, M.Kom.
7. Seluruh staf-staf Pengajar (Dosen) Fakultas Ilmu Komputer dan Teknologi
Informasi Universitas Sumatera Utara.
8. Ayahanda Sunardi dan ibunda Nadrah selaku orang tua kandung penulis yang
telah memberikan semangat, dorongan, serta doanya dalam menyelesaikan skripsi
ini.
9. Sahabat-sahabat penulis dan semua sahabat seangkatan yang sudah membantu dan
memberi semangat kepada penulis selama ini.

Dalam penyusunan skripsi ini, penulis menyadari bahwa masih banyak kekurangan,
untuk itu penulis mengharapkan saran dan kritik yang bersifat membangun dari semua
pihak demi kesempurnaan skripsi ini. Akhir kata penulis mengharapkan semoga skripsi
ini dapat bermanfaat dan membantu semua pihak yang memerlukannya.

Penulis
Universitas Sumatera Utara
vi

ABSTRAK




Mobile tracking adalah suatu kemajuan teknologi dalam perangkat lunak ponsel yang
memungkinkan bagi pengguna ponsel untuk melacak individu mendapatkan posisi
melalui teknologi Global Positioning System (GPS) yang dimilikinya. Koordinat yang
diterima oleh GPS ponsel akan disimpan kedalam database dan ditampilkan pada sebuah
peta menggunakan Google Maps API, kemudian dicari route terpendeknya. Dalam
pencarian route terpendek ini digunakan algoritma Ant Colony Optimization (ACO).
Algoritma ACO merupakan teknik probabilistik untuk menyelesaikan masalah komputasi
yang terinspirasi oleh perilaku semut dalam menemukan jalur dari koloninya menuju
makanan. Dalam algoritma ACO terdapat sejumlah semut buatan, yang ditugaskan untuk
mencari solusi terhadap suatu masalah optimisasi. Hasil uji coba pada tugas akhir ini juga
menunjukkan adanya efisiensi waktu dengan menggunakan aplikasi karena terdapat
perkiraan waktu yang disediakan oleh Google Map sehingga berguna bagi user.
Algoritma ACO adalah salah satu algoritma alternatif yang dapat digunakan untuk
penentuan jalur terpendek. Kecepatan menampilkan suatu rute sebuah map tergantung
pada jumlah kota yang diinputkan, provider dan kestabilan koneksi internet.

Katakunci : Ant Colony Optimization, Global Positioning System, Google Maps API,
Mobile Tracking.
Universitas Sumatera Utara
vii

IMPLEMENTATION OF MOBILE TRACKING USING
ANT COLONY OPTIMIZATION AND GOOGLE MAPS API

ABSTRACT




Mobile tracking is a technological advancement in mobile phone software that makes it
possible for mobile users to track individuals gain positions througlh the technology of
Global Positioning System (GPS). Coordinates received by the GPS phone will be stored
into the database and displayed on a map using the Google Maps API, then look for the
shortest path. In the search for the shortest path is used Ant Colony Optimization
algorithm (ACO). ACO algorithm is a probabilistic technique for solving computational
problems that are inspired by the behavior of ants in finding paths from the colony to the
food. In ACO algorithms are a number of artificial ants, which is assigned to find a
solution to an optimization problem. Results of trials in this final project also shows the
time efficiency by using the application because there are an estimated time provided by
Google Map so useful for the user. ACO algorithm is one of the alternative algorithm
that can be used to determine the shortest path. Speed display a map of a route depends
on the number of cities is entered, the provider and the stability of the internet
connection.

Keywords : Ant Colony Optimization. Google Maps API, Global Positioning System,
Mobile Tracking.

Universitas Sumatera Utara
viii

DAFTAR ISI




PERSETUJUAN ........................................................................................................ iii
PERNYATAAN ........................................................................................................ iv
PENGHARGAAN ..................................................................................................... v
ABSTRAK ................................................................................................................. vi
ABSTRACT ............................................................................................................... vii
DAFTAR ISI .............................................................................................................. viii
DAFTAR TABEL ...................................................................................................... x
DAFTAR GAMBAR ................................................................................................. xi

BAB 1 PENDAHULUAN ........................................................................................ 1
1.1 Latar Belakang .......................................................................................... 1
1.2 Rumusan Masalah ..................................................................................... 2
1.3 Batasan Masalah ....................................................................................... 2
1.4 Tujuan Penelitian ..................................................................................... 3
1.5 Manfaat Penelitian .................................................................................... 3
1.6 Metodologi Penelitian ............................................................................... 3
1.7 Sistematika Penulisan ............................................................................... 4


BAB 2 TINJAUAN PUSTAKA ............................................................................... 6
2.1 Teori Graf .................................................................................................. 6
2.1.1 Defenisi Graf ............................................................................ 6
2.1.2 Graf Berbobot .......................................................................... 8
2.1.3 Representasi Graf Pada Komputer ........................................... 8
2.2 Algoritma Ant colony Optimization ......................................................... 10
2.2.1 Ant Colony Optimization ......................................................... 10
2.2.1.1 Aturan transisi status ..................................................... 13
2.2.1.2 Aturan pembaruan feromone global ............................. 14
2.2.1.3 Aturan pembaruan feromone lokal ............................... 15
2.3 Google Maps API ..................................................................................... 15
2.3.1 Request URL Google Map ....................................................... 16
2.3.2 Geocoding ................................................................................ 16
2.3.3 Waypoint .................................................................................. 17
2.3.3.1 Perhitungan jarak antara dua waypoints ....................... 17
2.4 GPS ........................................................................................................... 18
2.4.1 Sumber Kesalahan ................................................................... 19
2.4.2 Kesalahan pada GPS ................................................................ 20
2.4.3 Tracking ................................................................................... 20

BAB 3 ANALISIS DAN PERANCANGAN SISTEM .......................................... 21
3.1 Analisis Sistem .......................................................................................... 21
3.1.1 Analisis Masalah ..................................................................... 22
3.1.2 Analisis Kebutuhan Sistem ...................................................... 22
3.1.2.1 Analisis Kebutuhan Fungsional .................................... 23
Universitas Sumatera Utara
ix

3.1.2.2 Analisis Kebutuhan Non-Fungsional ........................... 23
3.1.3 Pemodelan ................................................................................ 24
3.1.3.1 Use Case Diagram ......................................................... 24
3.1.3.2 Activity Diagram .......................................................... 25
3.1.3.3 Class Diagram ............................................................... 27
3.1.3.4 Sequence Diagram ........................................................ 27
3.2 Perancangan Sistem .................................................................................. 28
3.2.1 Flowchart Sistem ..................................................................... 28
3.2.2 Pseudocode Algorima ACO ..................................................... 30
3.2.3 Perancangan Database.............................................................. 31
3.2.4 Perancangan Tampilan ............................................................. 32
3.2.4.1 Halaman Login .............................................................. 32
3.2.4.2 Halaman User ................................................................ 33
3.2.4.3 Halaman Admin ............................................................ 34
3.2.4.4 Halaman Data User ....................................................... 36
3.2.4.5 Halaman About ............................................................. 37

BAB 4 IMPLEMENTASI DAN PENGUJIAN SISTEM ..................................... 38
4.1 Implementasi Sistem ................................................................................. 38
4.1.1 Implementasi Algoritma Ant Colony Optimization................. 38
4.2 Pengujian sistem ....................................................................................... 53
4.2.1 Pengujian Aplikasi User .......................................................... 54
4.2.2 Pengujian Aplikasi Admin ....................................................... 56
4.2.3 Pengujian Sistem Dengan 3 Buah Koordinat ........................... 60

BAB 5 KESIMPULAN DAN SARAN .................................................................... 62
5.1 Kesimpulan ............................................................................................... 62
5.2 Saran ......................................................................................................... 62

DAFTAR PUSTAKA

LAMPIRAN

Universitas Sumatera Utara
x

DAFTAR TABEL



Tabel 3.1 Pseudocode Algoritma ACO................................................................... 30
Tabel 3.2 Table Admin ........................................................................................... 31
Tabel 3.3 Tabel Client ............................................................................................. 31
Tabel 3.4 Tabel Track ............................................................................................. 32
Tabel 4.1. Koordinat Ponsel Yang Terlacak Oleh Apliaksi Mobile Tracking ........ 39
Tabel 4.2 Jarak Antar Kota ..................................................................................... 41
Tabel 4.3 Visibilitas Antar Kota ............................................................................. 42
Tabel 4.4 Feromon Antar Titik ............................................................................... 42
Tabel 4.5 Hasil Siklus I Algoritma Semut .............................................................. 48
Tabel 4.6 Feromon Antar Titik Pada Graf .............................................................. 48
Tabel 4.7 Kode Program Untuk Penentuan Route Terpendek ................................ 45

Universitas Sumatera Utara
xi

DAFTAR GAMBAR



Gambar 2.1 Graf G .................................................................................................... 7
Gambar 2.2 Graf Berbobot ........................................................................................ 8
Gambar 2.3 Diagram dan Matriks Keterhubungan Graf G ........................................ 9
Gambar 2.4 Mekanisme Pergerakan Koloni Semut ................................................... 12
Gambar 2.5 Flowchart Request URL Google Maps .................................................. 16
Gambar 2.6 Konstelasi Dua Puluh Empat GPS Satelit Dalam Enam Bidang Orbit. . 18
Gambar 3.1 Ilustrasi Jalur Terpendek dengan Jarak .................................................. 21
Gambar 3.2 Diagram Ishikawa Untuk Analisis Permasalahan Sistem ...................... 22
Gambar 3.3 Use-Case Diagram Pada Sistem ............................................................. 24
Gambar 3.4 Activity Diagram Pada Sistem ............................................................... 26
Gambar 3.5 Class Diagram Pada Sistem ................................................................... 27
Gambar 3.6 Sequence Diagram Pada Sistem ............................................................. 28
Gambar 3.7 Flowchart Sistem .................................................................................... 29
Gambar 3.8 Halaman Login ....................................................................................... 33
Gambar 3.9 Halaman User ......................................................................................... 34
Gambar 3.10 Halaman Admin ................................................................................... 35
Gambar 3.11 Halaman Data User .............................................................................. 36
Gambar 3.12 Halaman About .................................................................................... 37
Gambar 4.1 Graf Dengan Empat Vertex .................................................................... 41
Gambar 4.2 Tampilan Posisi Koordinat Dalam Google Maps .................................. 52
Gambar 4.3 Tampilan Route Perjalanan .................................................................... 53
Gambar 4.4 Tampilan Eksport ................................................................................... 53
Gambar 4.5 Tampilan Login ...................................................................................... 54
Gambar 4.6 Tampilan Pendaftaran ............................................................................ 54
Gambar 4.7 Tampilan Pemberitahuan Aktifasi.......................................................... 54
Gambar 4.8 Tampilan Halaman User ........................................................................ 55
Gambar 4.9 Tampilan Halaman Perubahan Data User .............................................. 56
Gambar 4.10 Tampilan Login Admin ........................................................................ 56
Gambar 4.11 Tampilan Halaman Admin ................................................................... 57
Gambar 4.12 Tampilan Hasil Tracking Koordinat User ........................................... 57
Gambar 4.13 Tampilan Hasil Perhitungan ................................................................. 58
Gambar 4.14 Tampilan Urutan Titik Sebelum Perhitungan ...................................... 58
Gambar 4.15 Tampilan Urutan Titik Setelah Perhitungan ........................................ 59
Gambar 4.16 Tampilan Hasil Perhitungan Dalam Matrix ......................................... 59
Gambar 4.17 Pengujian 3 buah Koordinat ................................................................. 60
Gambar 4.18 Fitur Oneway Trip dan Directions ....................................................... 60
Gambar 4.19 Fitur Oneway Trip by Walking dan Directions.................................... 61
Universitas Sumatera Utara
vi

ABSTRAK




Mobile tracking adalah suatu kemajuan teknologi dalam perangkat lunak ponsel yang
memungkinkan bagi pengguna ponsel untuk melacak individu mendapatkan posisi
melalui teknologi Global Positioning System (GPS) yang dimilikinya. Koordinat yang
diterima oleh GPS ponsel akan disimpan kedalam database dan ditampilkan pada sebuah
peta menggunakan Google Maps API, kemudian dicari route terpendeknya. Dalam
pencarian route terpendek ini digunakan algoritma Ant Colony Optimization (ACO).
Algoritma ACO merupakan teknik probabilistik untuk menyelesaikan masalah komputasi
yang terinspirasi oleh perilaku semut dalam menemukan jalur dari koloninya menuju
makanan. Dalam algoritma ACO terdapat sejumlah semut buatan, yang ditugaskan untuk
mencari solusi terhadap suatu masalah optimisasi. Hasil uji coba pada tugas akhir ini juga
menunjukkan adanya efisiensi waktu dengan menggunakan aplikasi karena terdapat
perkiraan waktu yang disediakan oleh Google Map sehingga berguna bagi user.
Algoritma ACO adalah salah satu algoritma alternatif yang dapat digunakan untuk
penentuan jalur terpendek. Kecepatan menampilkan suatu rute sebuah map tergantung
pada jumlah kota yang diinputkan, provider dan kestabilan koneksi internet.

Katakunci : Ant Colony Optimization, Global Positioning System, Google Maps API,
Mobile Tracking.
Universitas Sumatera Utara
vii

IMPLEMENTATION OF MOBILE TRACKING USING
ANT COLONY OPTIMIZATION AND GOOGLE MAPS API

ABSTRACT




Mobile tracking is a technological advancement in mobile phone software that makes it
possible for mobile users to track individuals gain positions througlh the technology of
Global Positioning System (GPS). Coordinates received by the GPS phone will be stored
into the database and displayed on a map using the Google Maps API, then look for the
shortest path. In the search for the shortest path is used Ant Colony Optimization
algorithm (ACO). ACO algorithm is a probabilistic technique for solving computational
problems that are inspired by the behavior of ants in finding paths from the colony to the
food. In ACO algorithms are a number of artificial ants, which is assigned to find a
solution to an optimization problem. Results of trials in this final project also shows the
time efficiency by using the application because there are an estimated time provided by
Google Map so useful for the user. ACO algorithm is one of the alternative algorithm
that can be used to determine the shortest path. Speed display a map of a route depends
on the number of cities is entered, the provider and the stability of the internet
connection.

Keywords : Ant Colony Optimization. Google Maps API, Global Positioning System,
Mobile Tracking.

Universitas Sumatera Utara


BAB 1


PENDAHULUAN




1.1 Latar Belakang


Mobile Tracking adalah suatu kemajuan teknologi dalam perangkat lunak ponsel yang
dapat membuat telepon bukan hanya alat untuk sekedar menelpon atau sms saja.
Namun ponsel telah menjadi alat multifungsi dengan berbagai fitur dan telah menjadi
kebutuhan yang wajib dimiliki berbagai lapisan masyarakat. Teknologi GPS terbaru
telah memungkinkan bagi pengguna ponsel untuk melacak individu mendapatkan
posisi mobile user.

Google Maps (GM) merupakan sebuah aplikasi pemetaan on-line yang cukup
popular. Pada GM, titik koordinat suatu tempat ditunjukan dengan sistem koordinat
geografis. Saat ini Google Maps adalah layanan pemetaan berbasis web yang populer.
Layanan Google Maps dapat ditambahkan kedalam sebuah website menggunakan
Google Maps API (Application Programming Interface). Google Maps API dapat
ditambahkan ke website menggunakan JavaScript. API tersebut menyediakan banyak
fasilitas dan utilitas untuk memanipulasi peta dan menambahkan konten ke peta
melalui berbagai layanan, memungkinkan untuk membuat aplikasi peta yang kuat
pada sebuah website.
[8]

Ant Colony Optimization (ACO) diadopsi dari perilaku koloni semut yang
dikenal sebagai sistem semut. Secara alamiah koloni semut mampu menemukan rute
Universitas Sumatera Utara
2

terpendek dalam perjalanan dari sarang ke tempat-tempat sumber makanan. Koloni
semut dapat menemukan rute terpendek antara sarang dan sumber makanan
berdasarkan jejak kaki pada lintasan yang telah dilalui. Semakin banyak semut yang
melalui suatu lintasan, maka akan semakin jelas bekas jejak kakinya. Hal ini akan
menyebabkan lintasan yang dilalui semut dalam jumlah sedikit, semakin lama akan
semakin berkurang kepadatan semut yang melewatinya, atau bahkan akan tidak
dilewati sama sekali. Sebaliknya, lintasan yang dilalui semut dalam jumlah banyak,
semakin lama akan semakin bertambah kepadatan semut yang melewatinya, atau
bahkan semua semut akan melalui lintasan tersebut.
[3]


Ant Colony Optimization (ACO) adalah salah satu algoritma alternatif yang
dapat digunakan untuk penentuan jalur terdekat. Selain prosesnya cepat dan
memberikan hasil yang bisa diterima, ACO juga mampu memberikan suatu solusi
pada waktu kapanpun. Mengingat prinsip algoritma yang didasarkan pada perilaku
koloni semut dalam menemukan jarak perjalanan paling pendek tersebut, ACO sangat
tepat digunakan untuk diterapkan dalam penyelesaian masalah optimasi, salah satunya
adalah untuk pengguna perangkat mobile dalam penentuan posisi dan jarak terdekat.


1.2 Rumusan masalah

Bagaimana menentukan jarak terdekat antara mobile user satu dengan yang lain pada
aplikasi mobile tracking menggunakan Google Maps API dengan Algoritma ACO.


1.3 Batasan masalah

Batasan masalah pada aplikasi ini sebagai berikut:
1. Mendeteksi posisi mobile user (Handphone).
2. Menentukan jarak terdekat antara mobile user satu dengan yang lain
dengan ACO.
3. Bahasa pemrograman yang digunakan adalah PHP menggunakan
framework CodeIgniter & Mysql, JavaScript, Jquery.
Universitas Sumatera Utara
3


1.4 Tujuan penelitian

Menerapkan konsep dan cara kerja algoritma Ant Colony Optimization (ACO) pada
aplikasi mobile tracking untuk menentukan jarak terdekat.


1.5 Manfaat penelitian

Diharapkan dapat membantu pengguna perangkat mobile dalam penentuan posisi
dan jarak terdekat.


1.6 Metodologi Penelitian

Penelitian ini akan dilaksanakan dengan mengikuti beberapa langkah yang akan
digunakan penulis, yaitu:

1. Studi Literatur
Tahap ini dilakukan dengan mencari jurnal, buku, tulisan ilmiah, e-book,
maupun artikel lain yang berhubungan dengan Algoritma Ant Colony, Google
Maps API, serta Pemrograman PHP pada Framework Codeigniter.

2. Analisis dan Perancangan Sistem
Dengan tahap ini digunakan untuk mengolah data dari hasil studi literatur dan
kemudian melakukan analisis dan perancangan sistem yang sudah disimpulkan
pada tahap analisis kedalam algoritma program, flowchart sistem, rancangan
aplikasi, dan pembuatan user interface aplikasi.

3. Implementasi Sistem
Mengimplemntasikan model dan skema pada tahap perancangan sistem. Model
dan skema diimplementasikan kedalam bahasa pemrograman PHP
menggunakan framework codeigniter yang dipadukan dengan penggunaan
Universitas Sumatera Utara
4

javascript sebagai pemrograman Google Maps API. Program yang dihasilkan
merupakan sebuah aplikasi berbasis web untuk mendeteksi latitude dan
longitude sebuah handphone.

4. Pengujian Sistem
Menguji apakah aplikasi yang dibuat telah berhasil berjalan sesuai dengan
keinginan dan melakukan perbaikan kesalahan jika masih terdapat error pada
aplikasi.

5. Dokumentasi
Tahap akhir dari penelitian yang dilakukan, yaitu membuat kesimpulan dan
laporan tentang penelitian yang telah dilakukan.


1.7 Sistematika Penulisan

Sistematika penulisan dari skripsi ini terdiri dari:

BAB 1 : PENDAHULUAN
Bab ini menjelaskan mengenai latar belakang pemilihan judul skripsi
Implementasi Mobile Tracking Menggunakan Metode Ant Colony
Optimazion Dan Google Maps API, rumusan masalah, batasan masalah,
tujuan penelitian, manfaat penelitian, metode penelitian dan sistematika
penulisan.

BAB 2 : TINJAUAN PUSTAKA
Bab ini membahas teori-teori yang berkaitan dengan Teori graf, Algoritma
Ant Colony, Google Maps API, serta Global Positioning System.

BAB 3 : ANALISIS DAN PERANCANGAN SISTEM
Bab ini akan membahas mengenai analisis kebutuhan sistem yang meliputi
analisis masalah, analisis kebutuhan sistem, pemodelan dan perancangan
sistem.
Universitas Sumatera Utara
5



BAB 4 : IMPLEMENTASI DAN PENGUJIAN
Bab ini akan membahas mengenai implementasi sistem dan pengujian
sistem agar aplikasi yang dirancang berjalan dengan baik.

BAB 5 : KESIMPULAN DAN SARAN
Bab ini memuat kesimpulan dari uraian bab-bab sebelumnya dan hasil
penelitian yang diperoleh. Bab ini juga memuat saran yang diharapkan
dapat bermanfaat untuk pengembangan selanjutnya.
Universitas Sumatera Utara


BAB 2


TINJAUAN PUSTAKA




2.1. Teori Graf

2.1.1 Definisi Graf

Graf G adalah pasangan (V(G),E(G)) dengan (V(G)) adalah himpunan tidak kosong
dan berhingga dari objek-objek yang disebut titik, (E(G)) adalah himpunan (mungkin
kosong) pasangan tak berurutan dari titik- titik berbeda di (V(G)) yang disebut sisi.
Banyaknya unsur di V(G) disebut order dari G dan dilambangkan dengan p(G), dan
banyaknya unsur di E(G) disebut ukuran dari G dan dilambangkan dengan q(G). Jika
graf yang dibicarakan hanya graf G, maka order dan ukuran dari G masing-masing
cukup ditulis p dan q. Graf dengan order p dan q disebut graf-(p,q).
[1]


Nama Graf diberikan karena graf dapat disajikan secara grafik atau gambar,
dan justru dengan bentuk gambar inilah sifat-sifat graf dapat dikenali secara detail.
Titik disajikan dalam bentuk noktah atau lingkaran kecil dan sisi disajikan dalam
bentuk garis atau kurva yang memasangkan dua titik.
[1]


Perhatikan graf G yang memuat himpunan titik V(G) dan himpunan sisi E(G)
seperti berikut ini.
V(G) = {a,b,c,d,e}
E(G) = {(a, b), (a, c), (a, d), (b, d), (b, c), (d, e)}
Universitas Sumatera Utara
7


Graf G tersebut secara lebih jelas dapat digambar sebagai berikut.









Gambar 2.1 Graf G

Graf G mempunyai 5 titik sehingga order G adalah p = 5. Graf G mempunyai 6 sisi
sehingga ukuran graf G adalah 6.

Graf G dengan himpunan titik dan sisi masing-masing
V(G) = {a, b, c, d, e}
E(G) = {(a, b), (a, c), (a, d), (b, d), (b, c), (d, e)}
Dapat juga ditulis dengan
V(G) = {a, b, c, d, e}
E(G) = {e1, e2, e3, e4, e5, e6}
Dengan
e1 = (a, b)
e2 = (a, c)
e3 = (a, d)
e4 = (b, d)
e5 = (b, c)
e6 = (d, e)

Sisi e = (a, b) dikatakan menghubungkan titik a dan b. Jika e = (a, b) adalah
sisi graf G, maka a dan b disebut terhubung langsung (adjacent), a dan e serta b dan e
disebut terkait langsung (incident), dan titik a dan b disebut ujung dari e. Dua sisi
G :
a c
d b
e
e1
e2
e3
e4 e6
Universitas Sumatera Utara
8


berbeda e1 dan e2 disebut terhubung langsung (adjacent), jika terkait langsung pada
satu titik yang sama. Untuk selanjutnya, sisi e = (a, b) akan ditulis e = ab.


2.1.2 Graf Berbobot

Graf berbobot adalah graf yang setiap sisinya diberi sebuah nilai atau bobot. Bobot
pada setiap sisi graf dapat berbeda-beda bergantung pada masalah yang dimodelkan.
Bobot dapat menyatakan jarak antara dua buah kota, biaya perjalanan antara dua buah
kota, waktu tempuh antara dua buah kota, waktu tempuh pesan antara simpul
komunikasi dengan simpul komunikasi lainya, ongkos produksi dan sebagainya. Graf
berbobot juga sering dikaitkan dengan istilah graf berlabel.
[7]

Untuk membuat label, masing-masing vertex diberi sebuah label dan setiap
edge diberikan sebuah nilai atau bobot. Tampilan graf berlabel dapat dilihat pada
Gambar 2.2.







Gambar 2.2 Graf Berbobot


2.1.3 Representasi Graf Pada Komputer

Meskipun menggambar merupakan cara yang mudah untuk menjelaskan suatu graf,
cara ini tentunya mempunyai kelemahan ketika akan menyimpan data tentang graf
dalam komputer, atau ketika akan mengkaji sifat-sifat sutau graf melalui hitungan
matematis. Merepresentasikan graf dalam bentuk matriks akan memberikan
P Q
R S
T
6
9
12
7
9
6
Universitas Sumatera Utara
9


V1 V2
V3 V4
v1 v2 v3 v4
v1
v2
v3
v4
kemudahan bagi sesorang yang senang menggunakan komputer ketika mengkaji
informasi atau menyelesaikan permasalahan yang melibatkan graf.
[1]


Matriks keterhubungan suatu graf G adalah matriks simetri dengan unsur 0 dan
1 dan memuat nilai 0 pada diagonal utamanya. Hal ini karena graf tidak memuat lup
dan tidak memuat sisi parallel.

Perhatikan contoh berikut. Misalkan graf G dengan himpunan titik
V(G) = {v1, v2, v3, v4}
Dan himpunan sisi
E(G) = {v1v2, v1v4, v2v3, v2v4, v3v4 }
Maka, diagram dan matriks keterhubungan graf G sebagai berikut.





A(0) = _
u 1 u 1
1 u 1 1
u 1 u 1
1 1 1 u
_

Gambar 2.3 Diagram dan Matriks Keterhubungan Graf G

Derajat suatu simpul deg(v) adalah banyaknya ruas yang menghubungkan suatu
simpul. Secara umum, jika graf G dengan order p (p 1) dengan himpunan titik V(G)
= {v1,v2, vp} dan A (G) = [aij], 1 i, j p adalah matriks keterhubungan dari G,
maka

deg (vi) = o
]
p
]=1


Hal yang sama juga berlaku jika menghitung derajat titik melalui kolom, yaitu

deg (vi) = o
]
p
]=1

Universitas Sumatera Utara
10



Dengan melihat matriks keterhubungan dari graf G dapat diperoleh bahwa

a11 + a12 + a13 + a14 = 0 + 1 + 0 + 1 = 2 = deg(v1),
a21 + a22 + a23 + a24 = 1 + 0 + 1 + 1 = 3 = deg(v2),
a31 + a32 + a33 + a34 = 0 + 1 + 0 + 1 = 2 = deg(v3), dan
a41 + a42 + a43 + a44 = 1 + 1 + 1 + 0 = 3 = deg(v4).

Dari diagram terlihat bahwa

deg(v1) = 2,
deg(v2) = 3,
deg(v3) = 2, dan
deg(v4) = 3.


2.2 Algoritma Ant Colony Optimization

Algoritma semut (Ant Colony) yang terinspirasi oleh tingkah laku semut dalam suatu
koloni. Semut mampu menemukan jalur terpendek dari sumber makanan ke sarang
mereka tanpa menggunakan isyarat visual dengan memanfaatkan informasi feromon.
Sambil berjalan, semut meninggalkan jejak feromon di tanah, dan feromon ini akan
membimbing semut lain untuk menemukan sumber makanan.
[6]


2.2.1 Ant Colony Optimization

Ant Colony Optimization (ACO) melakukan pendekatan menggunakan model
probabilistik untuk membangun kombinasi baru. Dalam pendekatannya, model
probabilistik berkembang selama proses pencarian dengan mengacu pada kombinasi
sebelumnya yang dibangun berulang selama proses pembelajaran.
[11]


Kontribusi utama algoritma ACO adalah yang meniru dari perilaku kolektif
seekor semut untuk memperbarui model probabilistik. Kemungkinan memilih
Universitas Sumatera Utara
11


komponen tergantung pada kualitas feromon yang merepresentasikan perjalanan
koloni semut. Jumlah feromon berkembang dengan menggabungkan dua mekanisme.
mekanisme pertama adalah langkah meletakkan feromon. Jejak feromon berhubungan
dengan kombinasi terbaik yang memungkinan untuk memilih jalur tersebut.
Mekanisme kedua adalah penguapan feromon. Jejak feromon akan semakin menurun
pada peninggalan jejak yang tidak dikunjungi.
[11]


Marco Dorigo (1992) menyatakan Ant Colony Optimization (ACO) adalah
pendekatan metaheuristik baru yang diusulkan untuk memecahkan masalah optimasi
kombinatorial yang sulit. Sumber inspirasi dari ACO adalah jejak feromon peletakan
dan mengikuti perilaku semut nyata yang menggunakan feromon sebagai media
komunikasi. Dalam analogi dengan contoh biologi, ACO didasarkan pada komunikasi
tidak langsung dari koloni agen sederhana, disebut (buatan) semut, dimediasi oleh
(buatan) jejak feromon. Jalan feromon di ACO berfungsi sebagai penyampai
informasi numerik yang semut gunakan untuk probabilistik membangun solusi untuk
masalah yang sedang diselesaikan dan dimana semut beradaptasi selama eksekusi
algoritma untuk mencerminkan pengalaman pencarian.
[5]

Perilaku semut yang cukup menarik adalah ketika mereka mencari makan, di
mana mereka dapat menemukan jalur terpendek antara sumber makanan dan sarang
mereka. Semut sampai pada titik keputusan di mana mereka harus memutuskan
apakah akan belok kiri atau kanan. Karena mereka tidak memiliki petunjuk yang
merupakan pilihan terbaik, mereka memilih acak. Hal ini dapat diharapkan bahwa
rata-rata, setengah dari semut memutuskan untuk berbelok ke kiri dan yang lainnya
berbelok ke kanan. Hal ini terjadi baik untuk semut bergerak dari kiri ke kanan (L)
dan untuk mereka yang pindah dari kanan ke kiri (R). Ketika berjalan dari sumber
makanan ke sarang dan sebaliknya, semut meletakkan suatu zat (yang disebut
feromon) di sepanjang jalur yang mereka lalui. Ketika zat tersebut disekresikan
sebagai isyarat seekor semut, maka semut yang lain dapat mengenalinya. Ketika
mencari makan, pada awalnya semut akan berkeliling di daerah sekitar sarangnya
secara acak. Begitu mengetahui ada makanan, semut akan menganalisa kualitas dan
kuantitas makanan tersebut dan membawa beberapa bagian ke sarangnya. Dalam
perjalanannya, mereka meninggalkan jejak berupa zat kimia, yang disebut feromon.
Universitas Sumatera Utara
12


Feromon ini akan membimbing semut lain untuk menemukan sumber makanan.
Jumlah feromon yang ditinggalkan oleh semut bergantung pada jumlah makanan yang
ditemukan. Semakin banyak makanan yang didapat, semakin banyak pula jumlah
feromon yang ditinggalkan. Sehingga semakin banyak semut yang melewati suatu
jalur, semakin kuat pula jejak feromon yang terkumpul di jalur tersebut. Cara semut
memanfaatkan feromon untuk menemukan jalur terpendek antara dua titik
ditunjukkan pada Gambar 2.4
[6]
.


Gambar 2.4 Mekanisme Pergerakan Koloni Semut.

Inisialisasi parameter-parameter algoritma.
1. Intensitas jejak semut antar kota dan perubahannya (ij).
2. Banyak kota (n) termasuk koordinat (x,y)atau jarak antar kota (dij) serta
kota berangkat dan kota tujuan.
3. Tetapan siklus-semut (Q).
4. Tetapan pengendali intensitas jejak semut(), nilai 0.
5. Tetapan pengendali visibilitas (), nilai 0.
6. Visibilitas antar kota = 1/dij (ij).
7. Banyak semut (m).
8. Tetapan penguapan jejak semut () , nilai harus > 0 dan < 1 untuk
mencegah jejak pheromone yang tak terhingga.
9. Jumlah siklus maksimum (NCmax) bersifat tetap selama algoritma
dijalankan, sedangkan ij akan selalu diperbaharui harganya pada setiap
Universitas Sumatera Utara
13


siklus algoritma mulai dari siklus pertama (NC=1) sampai tercapai jumlah
siklus maksimum(NC=NCmax) atau sampai terjadi konvergensi.

Aturan transisi digunakan oleh sistem semut, disebut sebagai random-proportional
rule diberikan oleh persamaan (1), yang memberikan probabilitas semut k di kota r
memilih untuk pindah ke kota s.

P
k
(r, s) = _
|:(,s)]
o
.|q(,s)]

|:(,u)]
o
.|q(,u)]

ue]
k
(r)
u
[iko s e [
k
(r) (1)

Dimana :
Pk(r, s) : Probabilitas semut k memilih untuk berpindah dari kota r ke kota s
(r,s) : jumlah feromon pada sisi dari simpul r ke simpul s.
(r,s) : (panjang sisi dari simpul r ke simpul s)
-1

(r,u) : jumlah feromon pada sisi dari simpul r ke simpul u.
(r,u) : (panjang sisi dari simpul r ke simpul u)
-1

Jk : himpunan yang berisi simpul simpul yang telah dikunjungi oleh
semut
u : simpul yang berada dalam Jk


2.2.1.1 Aturan Transisi Status

Dalam ACS (Ant Colony System) aturan transisi status adalah sebagai berikut: semut
diposisikan pada node r memilih kota s untuk berpindah dengan menerapkan aturan
yang diberikan oleh persamaan (2).
[4]


s = _
max||(r, u)]. |n(r, u)]
[
|
S
[iko q q
0
(2)

Dimana :
(r,u) : jumlah feromon pada sisi dari simpul r ke simpul s.
(r,u) : (panjang sisi dari simpul r ke simpul s )
-1

Universitas Sumatera Utara
14


: parameter perbandingan jumlah feromon relatif terhadap jarak
(merupakan parameter yang telah ditentukan sebelumnya)
q : bilangan random
q0 : parameter perbandingan terhadap simpul yang belum ditemuinya
S : simpul berikutnya yang dipilih berdasarkan persamaan (1).


2.2.1.2 Aturan Pembaruan Feromone Global

Dalam ACS hanya semut terbaik secara global (yaitu, perjalanan semut yang
terpendek dari awal sebuah jejak) yang diperbolehkan untuk meninggalkan feromon.
Pilihan ini, bersama-sama dengan penggunaan aturan pseudo-random-proportional,
dimaksudkan untuk membuat pencarian yang lebih terarah. Semut mencari di
lingkungan pada tour terbaik ditemukan sampai akhir iterasi algoritma. Pembaharuan
feromon global dilakukan setelah semua semut telah menyelesaikan tour mereka.
Tingkat feromon diperbarui dengan menerapkan aturan memperbarui persamaan
global (3).
[4]


(r, s) - (1 -o). (r, s) +o. A(r, s) (3)

Dimana:
(r,s) : nilai feromon akhir setelah mengalami pembaruan
: tetapan pengendali feromon.
: perubahan intensitas feromon.

Seperti halnya dalam sistem semut, pembaharuan feromon global dimaksudkan untuk
menyediakan sejumlah besar feromon untuk kunjungan terpendek. Persamaan. (3)
menyatakan bahwa hanya sebuah edge tour terbaik secara global akan menerima
penguatan. Jenis lain aturan pembaharuan feromon global, yang disebut iteration-best,
sebagai lawan di atas yang disebut global-best. Dalam persamaan (3). Juga, dengan
iterasi-terbaik edge yang menerima penguatan adalah yang termasuk tour terbaik dari
iterasi saat ini. Percobaan telah menunjukkan bahwa perbedaan antara dua skema
Universitas Sumatera Utara
15


minimal, dengan preferensi sedikit untuk global terbaik, karena yang digunakan dalam
percobaan berikutnya.


2.2.1.3 Aturan Pembaruan Feromone Lokal

Ketika membangun solusi (yaitu, tour) sebuah TSP, semut mengunjungi edge dan
mengubah tingkat feromon mereka dengan menerapkan aturan memperbarui lokal
persamaan (4).
[4]


(r, s) - (1 -p). (r, s) +p. A(r, s) (4)

dimana:
(r,s) : jumlah feromon pada sisi dari simpul r ke simpul s
: tetapan penguapan feromon.
: perubahan intensitas feromon.

Peran aturan memperbarui lokal ACS adalah untuk mengacak tour, sehingga kota-kota
di awal tour seekor semut dapat dieksplorasi selanjutnya oleh tour semut lain. Dengan
kata lain, efek dari pembaruan feromon lokal adalah untuk membuat edge berubah
secara dinamis. setiap kali semut menggunakan edge ini menjadi sedikit kurang
diinginkan (karena kehilangan beberapa feromon nya). Dengan cara ini semut akan
membuat lebih baik menggunakan informasi feromon. tanpa pembaruan feromon
lokal semua semut akan mencari di lingkungan yang terbatas pada tour terbaik
sebelumnya.


2.3 Google Maps API

Google Maps API merupakan aplikasi antarmuka yang dapat diakses lewat javascript
agar Google Maps dapat ditampilkan pada halaman web yang sedang dibangun.
[8]


Universitas Sumatera Utara
16


Developer merumuskan sebuah request URL
menggunkanan PHP di remote server
Aplikasi PHP membuat request ke Google
Maps
Request
Valid
Google Maps mengirimkan data ke user
menggunakan format data JSON
Google Maps mengirimkan
error atau hasil nol
PHP dapat menggunkanan fungsi cURL untuk
mengambil dan melakukan pengelolahan data JSON
Y
N
Ada 2 cara untuk mengakses data Google Maps, tergantung dari data yang
ingin diambil dan diuraikan dari Google Maps.
1. Mengakses data Google Maps tanpa menggunakanAPI key.
2. Mengakses data Google Maps menggunakan API key.
Pendaftaran API key dilakukan dengan data pendaftaran berupa nama domain web
yang kita bangun.

2.3.1 Request URL Google Map

Gambar 2.5 Flowchart Request URL Google Maps


2.3.2 Geocoding

Geocoding adalah proses mengubah alamat (seperti 1600 Amphitheatre Parkway,
Mountain View, CA) ke koordinat geografis (lintang 37,423021 dan bujur -
122,08379), yang dapat digunakan untuk menempatkan penanda atau posisi peta.
Universitas Sumatera Utara
17


Geocoding API Google menyediagakn cara langsung untuk mengakses geocoder
melalui HTTP. Selain itu, layanan ini memungkinkan kita untuk melakukan operasi
sebaliknya (berubah koordinat menjadi alamat), proses ini dikenal sebagai reverse
geocoding.
[8]


2.3.3 Waypoint

Waypoint adalah titik referensi dalam ruang fisik yang digunakan untuk tujuan
navigasi. Waypoint merupakan koordinat yang mengidentifikasi titik dalam ruang
fisik. Koordinat yang digunakan dapat bervariasi tergantung pada aplikasi. Untuk
navigasi darat koordinat berupa bujur dan lintang, sedangkan untuk navigasi udara
juga mencakup ketinggian. Waypoint biasanya digunakan untuk sistem navigasi pada
GPS dan jenis-jenis tertentu dari radio navigasi. Waypoint yang terletak di permukaan
bumi biasanya didefinisikan dalam dua dimensi (misalnya, bujur dan lintang),
sedangkan yang digunakan dalam atmosfer bumi atau di luar angkasa didefinisikan
dalam setidaknya tiga dimensi atau empat jika waktu merupakan salah satu koordinat
untuk beberapa titik yang berada di luar bumi. Waypoint ini digunakan untuk
membantu menentukan jalur routing yang tak terlihat untuk navigasi. Misalnya,
artificial airways " highways in the sky" yang diciptakan khusus untuk keperluan
navigasi udara dan hanya terdiri dari serangkaian waypoint abstrak di langit dimana
pilot menavigasi airways ini dirancang untuk memudahkan kontrol lalu lintas udara
dan routing lalu lintas antara lokasi pada saat bepergian. Waypoints abstrak semacam
ini telah dibuat praktis dengan teknologi navigasi modern, seperti land-based radio
beacons dan satelit berbasis GPS.
[8]


2.3.3.1 Perhitungan Jarak Antara Dua Waypoints

Untuk melakukan perhitungan jarak antara dua waypoints pada Google Maps
menggunakan persamaan hukum kosinus koordinat bola (spherical law of cosines).

= Acos(sin(z
1
) . sin(z
2
) +cos(z
21
) . cos(z
2
) . cos(
2
-
1
) . R()
Universitas Sumatera Utara
18



Dimana :
D : Jarak antar dua titik (km)
z
1
: Posisi titik i(1,2,n) pada garis lintang dalam derajat

1
: Posisi titik i(1,2,n) pada garis bujur dalam derajat
R : Jari-jari bumi (6371 km)

Karena untuk menggunakan persamaan ini nilai lintang dan bujur harus dalam radian,
sedangkan data masukan dari pengguna dalam derajat, maka terlebih dahulu
mengubah nilai derajat menjadi radian dengan membagi dengan 180 / . adalah
konstanta matematika yaitu 3,14.
[8]



2.4 GPS

Rancangan terbaru dari GPS dikembangkan dari sebuah prototype pada akhir 1960.
Rancangan ini berdasarkan pada rasi dua puluh empat satelit buatan manusia yang
mengorbit bumi setiap dua belas jam pada ketinggian 20.000 km dari permukaan laut.
Secara kolektif, ini berdasarkan konstelasi membentuk Segmen angkasa, seperti yang
ditunjukkan pada Gambar 2. setiap satelit terus mengirimkan pesan posisi, dengan
ketepatan waktu antara semua komponen sistem dan antar satelit. Waktu tersebut
dikelola oleh pemantauan transmisi satelit di lima stasiun darat yang dapat mengirim
pembaharuan ke satelit ketika penyimpangan yang tidak diinginkan terdeteksi.
Seperangkat stasiun membuat segmen ground.
[10]


Gambar 2.6 Konstelasi Dua Puluh Empat GPS Satelit Dalam Enam Bidang Orbit.
Universitas Sumatera Utara
19



Segmen ketiga adalah pengguna segmen peralatan yaitu terdiri dari apa yang telah
menjadi berbagai jenis penerima GPS yang dirancang untuk memanfaatkan sinyal
berbasis ruang untuk posisi akurat dan penentuan waktu. semua penerima tersebut
beroperasi pada prinsip yang sama yaitu estimasi waktu kedatangan sinyal dari
sedikitnya empat satelit terpisah, kemudian untuk mengetahui transmisi waktu dan
kecepatan cahaya untuk memperkirakan jarak antara pengguna dan satelit. Penerima
GPS kemudian menggunakan rentang untuk menghitung posisi pengguna.
[10]


Setiap sinyal GPS dirancang untuk membawa waktu yang tertera memungkinkan
penerima untuk mengetahui kapan sinyal meninggalkan satelit GPS. Sebuah peralatan
penerima yang dilengkapi dengan baik kemudian dapat mengukur ketika sinyal
menjangkau pengguna. Jika jam satelit dan jam pengguna secara sempurna
disinkronkan, jarak antara mereka dapat dihitung sebagai waktu tunda dikalikan
dengan kecepatan cahaya. Namun, meskipun jam GPS semua sangat tepat dan
disinkronkan dengan satu sama lain, jam pengguna juga dapat memiliki bias relatif
yang tidak diketahui terhadap waktu sistem GPS. Istilah pseudorange digunakan
untuk mengenali bahwa pengguna hanya dapat memperkirakan setiap sinyal GPS
waktu kedatangan relatif terhadap jam bias.
[10]


2.4.1 Sumber Kesalahan

Sumber kesalahan dari GPS pada umumnya diakibatkan oleh:
[9]


a. Ionosphere and troposphere delays, signal satelite lambat dalam menembus
atmosfer. Pada GPS yang baru telah dilengkapi oleh perhitungan rata-rata
delays (waktu tunda) untuk mengoreksi kesalahan yang terjadi.
b. Signal multipath, Kesalahan yang terjadi akibat signal dipantulkan oleh gedung
atau batuan besar, sebelum mencapai receiver.

c. Penerimaan satelite yang terganggu akibat gedung, interferensi gelombang
elektro magnetik, blok signal, sehingga GPS tidak bekerja dalam rumah
(indoor), dibawah permukaan air atau di bawah tanah.

Universitas Sumatera Utara
20



2.4.2 Kesalahan pada GPS

Kesalahan-kesalahan satelite, antara lain:
[9]

a. Receiver clock errors,
b. Orbital Error,
c. Satellite geometry/shading dan
d. Intentional degradation of the satellite signal.


2.4.3 Tracking

Tracking dalam per-istilahan GPS adalah melakukan kuisisi data koordinat secara
otomatis berdasarkan jalur yang kita lalui dan data tersebut disimpan dalam kartu
memori GPS secara otomatis.
[9]


Universitas Sumatera Utara



BAB 3


ANALISIS DAN PERANCANGAN SISTEM




3.1 Analisis Sistem

Persoalan penentuan jarak terdekat merupakan salah satu permasalahan optimasi. Graf
yang digunakan adalah suatu graf berbobot jarak antar user yang merupakan tempat-
tempat yang akan dilintasi. Untuk meminimumkan waktu atau biaya dalam melintasi
tempat-tempat, diperlukan informasi lintasan yang terpendek yang harus dilalui.
Permasalahan pencarian lintasan yang terpendek antar lokasi dapat diselesaikan
dengan algoritma ACO yang bekerja sebagai penentuan jalur terpendek antar titik,
untuk selanjutnya dapat diterapkan pada pencarian jalur terpendek pada berbagai
lokasi yang ingin diketahui. Contoh kasus yang akan diambil adalah pencarian jalur
terpendek antara titik A dan titik D.


Gambar 3.1 Ilustrasi Jalur Terpendek dengan Jarak
Universitas Sumatera Utara
22


Pada Gambar 3.1 diketahui koordinat pengguna yang digunakan sebagai banyak
kota yang dikunjungi kemudian sistem ini akan mencari jarak terdekat menggunakan
algoritma ant colony optimization (ACO) dalam penentuan jarak terdekatnya.


3.1.1 Analisis Masalah

Untuk mengidentifikasi masalah menggunakan diagram ishikawa (fishbone diagram).
Masalah yang akan diidentifikasi yaitu sebuah perangkat mobile yang memiliki
fasilitas GPS belum digunakan secara maksimal. Bahkan untuk membeli sebuah
perangkat GPS saat ini masih relatif mahal sehingga hanya orang tertentu saja yang
menggunakanya. Dengan adanya fasilitas GPS jarak yang akan ditempuh dapat
dihitung secara komputasi, sehingga waktu yang digunakan akan jauh lebih efektif
daripada perhitungan secara manual. Permasalahan tersebut dapat dilihat melalui
sebuah diagram ishikawa pada Gambar 3.2.


Gambar 3.2 Diagram Ishikawa Untuk Analisis Permasalahan Sistem


3.1.2 Analisis Kebutuhan Sistem

Analisis Kebutuhan Sistem meliputi analisis kebutuhan fungsional sistem dan analisis
kebutuhan non-fungsional sistem.



Penentuan jarak terdekat dari
sebuah koordinat ponsel
Method Machine
Materials Man
Kesulitan dalam
pembuatan peta terbaru
Pencarian jarak terdekat
masih manual
Memiliki keterbatasan
dalam memproses data
Harga perangkat GPS
relatif mahal

Universitas Sumatera Utara
23


3.1.2.1 Kebutuhan Fungsional Sistem

Kebutuhan fungsional yang harus dimiliki oleh aplikasi mobile tracking dalam
penentuan jarak terdekat yaitu :
1. Fasilitas gps sebuah ponsel untuk membaca koordinat.
2. Sistem akan melakukan perhitungan jarak terdekat pada google maps
menggunakan algoritma ant colony optimization.
3. Sistem dapat menampilkan route yang akan dilalui sebagai jarak terdekat.


3.1.2.2 Kebutuhan Non-Fungsional Sistem

Kebutuhan non-fungsional adalah kebutuhan yang harus dipenuhi agar aplikasi yang
dirancang mendapat umpan-balik yang baik dari pengguna aplikasi. Kebutuhan non-
fungsional yang harus dipenuhi aplikasi yang dirancang adalah sebagai berikut:
a. Performa
Sistem harus mampu melaksanakan setiap tugas secara utuh dalam selang
waktu yang tidak terlalu lama sesuai dengan ukuran data input yang
diberikan.
b. Informasi
Sistem harus mampu menyediakan informasi tentang data-data yang akan
digunakan pada sistem.
c. Ekonomi
Sistem harus dapat bekerja dengan baik tanpa harus mengeluarkan biaya
tambahan dalam penggunaan perangkat keras maupun perangkat lunak.
d. Kontrol
Sistem yang telah dibangun harus tetap dikontrol setelah selesai dirancang
agar fungsi dan kinerja sistem tetap terjaga dan dapat memberikan hasil
yang sesuai dengan keinginan pengguna.
e. Efisiensi
Sistem harus dirancang sesederhana mungkin agar memudahkan pengguna
dalam menggunakan atau menjalankan aplikasi tersebut.
f. Pelayanan
Universitas Sumatera Utara
24


Sistem yang telah dirancang bisa dikembangkan ke tingkat yang lebih
kompleks lagi bagi pihak-pihak yang ingin mengembangkan sistem
tersebut.


3.1.3 Pemodelan


Pemodelan aplikasi yang dirancang bertujuan untuk menggambarkan semua kondisi
dan bagian-bagian yang berperan dalam sistem yang dirancang. Pemodelan aplikasi
dilakukan dengan membuat use-case diagram, activity diagram, class diagram, dan
sequence diagram.


3.1.3.1 Use-Case Diagram


Untuk menganalisa komponen-komponen yang berperan dalam sistem yang
dirancang, penulis menggunakan use-case diagram agar proses penganalisaan
komponen dapat dilakukan dengan mudah. Use-case diagram sistem pada aplikasi
yang dirancang dapat dilihat pada Gambar 3.3.

Gambar 3.3. Use-Case Diagram Pada Sistem

User
Daftar
Login
Admin
Hitung
Perjalanan
Eksport data
Kordinat Ponsel
Profil User
Data User
<< Extends >>
Long-Lat
<< Extends >>
Hasil Perhitungan
<< include >>
<< Include >>
Durasi Dalam
Matriks
<< include >>
Peta Graph
<< include >>
Universitas Sumatera Utara
25


3.1.3.2 Activity Diagram

Untuk menganalisa aktivitas-aktivitas yang akan berlangsung selama aplikasi
dijalankan diperlukan sebuah activity diagram. Activity diagram sistem pada aplikasi
yang dirancang dapat dilihat pada Gambar 3.4.
Universitas Sumatera Utara
26


Activity diagram

Gambar 3.4. Activity Diagram Pada Sistem
Universitas Sumatera Utara
27


3.1.3.3 Class Diagram
Class diagram untuk sistem yang dirancang dapat dilihat seperti pada Gambar 3.5.

Gambar 3.5. Class Diagram Pada Sistem

3.1.3.4 Sequence Diagram

Sequence diagram untuk sistem yang dirancang dapat dilihat seperti pada Gambar 3.6.

Universitas Sumatera Utara
28



Gambar 3.6. Sequence Diagram Pada Sistem



3.2 Perancangan Sistem


3.2.1 Flowchart Sistem

Flowchart merupakan bagan yang menunjukkan arus pekerjaan secara keseluruhan
dari sistem. Flowchart menjelaskan tentang urutan-urutan dari prosedur yang ada di
dalam sistem dengan menggunakan simbol-simbol.

Flowchart pembuatan aplikasi mobile tracking dapat dilihat seperti pada
Gambar 3.7.

Universitas Sumatera Utara
29



Gambar 3.7. Flowchart Sistem
Universitas Sumatera Utara
30


3.2.2 Pseudocode Algoritma ACO

Pseudocode adalah teknik untuk menuliskan algoritma secara hight-level tanpa
tergantung pada sebuah bahasa pemrograman. Penulisan pseudocode biasanya ditulis
dengan menggunakan bahasa inggris dan diberi tambahan notasi matematika.

Pseudeocode Algoritma ACO ditunjukkan oleh tabel 3.1 dibawah ini:

Tabel 3.1 Pseudocode Algoritma ACO

Baris
Kode
Pseudocode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ALGORITMA Ant Colony Optimization
{algortima untuk menghitung jarak terpendek menggunakan ACO}

DEKLARASI
alfa,beta,asF:double;
i,j,m,Q:integer;

DESKRIPSI
Set parameter(alfa,beta,asF,m,Q)
while stopping criterion not satisfied do
position each ant in a starting node
repeat
for each ant do
choose next node by applying the state
transition rule
apply local pheromone update
end for
until every ant has built a solution
update best solution
apply global pheromone update
end while
Output (Jarak terpendek)


Universitas Sumatera Utara
31


3.2.3 Perancangan Database

Tabel yang penulis gunakan dalam pembuatan aplikasi mobile tracking yaitu
tb_admin, tb_client dan tb_track. Rincian masing-masing table diuraikan pada
table dibawah ini.



1. Tabel Admin
Tabel admin merupakan table yang digunakan untuk menyimpan account
admin yaitu username dan password sebagai autentikasi untuk masuk ke
menu admin.

Tabel 3.2 Tabel Admin
Field Type
id_admin int(10)
Nama varchar(200)
Username varchar(200)
Password varchar(200)

2. Tabel Client
Tabel Client digunakan untuk menyimpan data user dan melacak
koordinatnya. Dimana setiap kali user melakukan login maka koordinat
pada database selalu diperbaharui

Tabel 3.3 Tabel Client
Field Type
id_client int(10)
Nama varchar(200)
username varchar(200)
password varchar(200)
Universitas Sumatera Utara
32


Field Type
jenis_kelamin enum('Pria', 'Wanita')
no_hp varchar(15)
Alamat varchar(200)
Lat double
Long double
Gambar varchar(120)
id_session varchar(100)
Aktif enum('Y', 'N')


3. Tabel Track
Tabel track digunakan untuk menyimpan semua data perjalanan masing-
masing user.


Table 3.4 Tabel Track
Field Type
id_track int(10)
id_client int(10)
Lat double
Long double
Time datetime
session_login varchar(160)


3.2.4 Perancangan Tampilan

3.2.4.1 Halaman Login

Halaman login merupakan sebagai authentikasi data untuk mengakses halaman utama
aplikasi. Halaman ini digunakan sebagai pembatasan hak akses terhadap fitur-fitur
yang ada di aplikasi. Agar dapat masuk kedalam aplikasi, maka pengguna harus
Universitas Sumatera Utara
33


memiliki username dan password yang sudah terdaftar sebelumnya. Kemudian setelah
pengguna dapat melakukan proses login maka sistem akan mendapatkan koordinat
ponsel kemudian disimpan kedalam database. Tampilan dapat dilihat pada gambar 3.8


Gambar 3.8 Halaman login


Keterangan:
1. Label yang berisi logo aplikasi
2. Label Username.
3. Label File Tujuan.
4. Text box untuk menampilkan input username.
5. Text box untuk menampilkan input password.
6. Tombol untuk memproses input login.
7. Tombol untuk menampilkan dialog pendaftaran.

3.2.4.2 Halaman User

Halaman User adalah halaman yang digunakan sebagai antar-muka user setelah
berhasil melakukan proses login. Halaman ini juga akan menampilkan posisinya
berada berdasarkan koordinat yang diterima. Rancangan halaman user dapat dilihat
seperti pada Gambar 3.7

Mobile Tracking
(1)

Username
(2)

Text Box
(3)

Password
(4)

Text Box
(5)

Login
(6)
daftar
(7)

Universitas Sumatera Utara
34



Gambar 3.9 Halaman User
Keterangan:
1. Label untuk menampilkan text proses pelacakan koordinat ponsel.
2. Label untuk menampilkan map.
3. Label untuk menampilkan alamat latitude dan longitude.
4. Tombol untuk menampilkan form edit profile.
5. Tombol untuk menampilkan form logout.

3.2.4.3 Halaman Admin

Halaman admin adalah halaman yang digunakan sebagai antar-muka admin setelah
berhasil melakukan proses login. Pada halaman ini digunakan untuk melakukan
pelacakan posisi user dan perhitungan jarak terdekatnya. Rancangan halaman admin
dapat dilihat seperti pada Gambar 3.10

Tracking location pocessing...
(1)

YYYY-mm-dd
Edit profile
(4)
LogOut
()

Lat !
(")

Long !

#ap
($)

Universitas Sumatera Utara
35



Gambar 3.10 Halaman Admin
Keterangan:
1. Label untuk menampilkan tujuan.
2. Text box untuk menampilkan input tujuan.
3. Tombol untuk menampilkan form add.
4. Label untuk menampilkan pilih jalur.
5. checkbox untuk menampilkan jalur yang akan dilalui.
6. Label untuk menampilkan eksport.
7. Label untuk menampilkan edit route.
8. Label untuk menampilkan mobile tracking.
9. Tombol untuk menampilkan form perhitungan jalur yang dilewati.
10. Tombol untuk menampilkan data client.
11. Tombol untuk mengulangi proses.
12. Tombol untuk melakukan refresh halaman.
13. Tombol untuk melakukan pengujian javascript.
14. Tombol untuk menampilkan halaman about.
15. Tombol untuk keluar dari halaman login.
16. Label untuk menampilkan maps.
17. Label untuk menampilkan hasil perhitungan.
18. Label untuk menampilkan jalur yang akan dilalui.



#ap
(16)

Tujuan
(1)

Text %ox
(2)
add
(3)

Pilih jalur
(4)

&alking ('alan kaki)
(5)

Bic(cling ()aik sepeda)
*+oid ,ig,-a(s (.indari /alan ra(a)
*+oid toll roads (.indari /alan tol)
Es!ort
(6)

Edit "oute
(#)

$o%ile Tra&ing
(')

Tracking #o%ile
(()

.itung 0er/alanan T10
.itung 0er/alanan * - 2
)ata *lient
(1+)

Ulangi lagi
(11)

"efresh ,alaman
(12)

Pengujian ja-as&ri!t
(13)

.%out
(14)

Logout
(15)

Lama per/alanan dan pan/ang per/alanan
(1#)

'alan (ang dilalui
(1')

Universitas Sumatera Utara
36



3.2.4.4 Halaman Data User

Halaman data user ini merupakan rancangan yang digunakan untuk manajemen data
user yang sudah terdaftar sebagai user, form ini hanya ditampilkan pada menu admin
sebagai manajemen data user.


Gambar 3.11 Halaman Data User
Keterangan:
1. Label untuk menampilkan tujuan.
2. Text box untuk menampilkan input tujuan.
3. Tombol untuk menampilkan form add.
4. Label untuk menampilkan pilih jalur.
5. checkbox untuk menampilkan jalur yang akan dilalui.
6. Label untuk menampilkan eksport.
7. Label untuk menampilkan edit route.
8. Label untuk menampilkan mobile tracking.
9. Tombol untuk menampilkan form perhitungan jalur yang dilewati.
10. Tombol untuk menampilkan data user.
11. Tombol untuk mengulangi proses.
12. Tombol untuk melakukan refresh halaman.
Data User
[16]

Tujuan
(1)

Text %ox
(2)
add
(3)

Pilih jalur
(4)

&alking ('alan kaki)
(5)

Bic(cling ()aik sepeda)
*+oid ,ig,-a(s (.indari /alan ra(a)
*+oid toll roads (.indari /alan tol)
Es!ort
(6)

Edit "oute
(#)

$o%ile Tra&ing
(')

Tracking #o%ile
(()

.itung 0er/alanan T10
.itung 0er/alanan * - 2
)ata *lient
(1+)

Ulangi lagi
(11)

"efresh ,alaman
(12)

Pengujian ja-as&ri!t
(13)

.%out
(14)

Logout
(15)

Universitas Sumatera Utara
37


13. Tombol untuk melakukan pengujian javascript.
14. Tombol untuk menampilkan halaman about.
15. Tombol untuk keluar dari halaman login.
16. Label untuk menampilkan data user.

3.2.4.5 Halaman About

Halaman about berfungsi untuk menampilkan informasi tentang profil penulis. Profil
penulis meliputi biodata penulis serta data akademik. Rancangan about dapat dilihat
seperti pada Gambar 3.12.


Gambar 3.12 Halaman About

Judul Skripsi
Tentang Penulis
Fakultas
Universitas Sumatera Utara


BAB 4


IMPLEMENTASI DAN PENGUJIAN SISTEM




4.1 Implementasi Sistem

4.1.1 Implementasi Algoritma Ant Colony Optimization

Proses yang dilakukan pertama kali adalah yaitu melacak posisi koordinat
sebuah ponsel. Koordinat yang berhasil dilacak kemudian akan disimpan kedalam
database. Data dapat dilihat seperti pada Tabel 4.1.

Tabel 4.1. Koordinat Ponsel Yang Terlacak Oleh Apliaksi Mobile Tracking

ID
NAMA Lat Long
Alamat
1
Donny Sanjaya 3,5855251 98,6312905
Jl. Merpati
2
Ridho Satrya Akbar 3,5678042 98,6422931
Jl. Setia Budi
3
Rajab Sihotang 3,5731014 98,6535551
Jl. Mesjid
4
Chandra Kurniawan 3,5673288 98,6607754
Jl. Jamin Ginting


Jika masing-masing koordinat diatas digambarkan pada tampilan graf maka
dapat kita lihat titik yang akan dilewati dalam pencarian jarak terdekat. Waypoint
menunjukkan lokasi dari suatu tempat, dan dihitung menggunakan latitude (lintang)
dan longitude (bujur). Untuk perhitungan yang lebih tepat dari jarak antara dua tempat
yang jauh, rumus jarak lingkaran besar dapat digunakan. Rumus yang menggunakan
sifat trigonometri dari suatu koordinat termasuk sinus, cosinus, arccosinus dan
perkiraan jari-jari bumi, maka jarak dari suatu tempat dapat dihitung.
Universitas Sumatera Utara
39

Langkah-langkah untuk menghitung jarak antara dua waypoint adalah sebagai
berikut :

Mengkonversi bujur dan lintang dua waypoint dari representasi desimal ke radian
dibagi dengan 180 / , atau 57,29578.

1. Jarak antara Jl. Merpati(1) dan Jl. Setia Budi(2)
Pengukuran lintang dan bujur untuk Jalan Merpati adalah
Lintang 3,5855251, Bujur 98,6312905
Pengukuran bujur dan lintang untuk Jalan Setia Budi adalah
Lintang 3,5678042, Bujur 98,6422931
Bagi dengan 180 / , sehingga diperoleh
Jalan Merpati : Lintang radian = 0,062579218
Bujur radian = 1,721440765
Jalan Setia Budi : Lintang radian = 0,06226993
Bujur radian = 1,721632796

Hitung jarak dua waypoints dengan rumus
= Acos(sin(z
1
) . sin(z
2
) +cos(z
21
) . cos(z
2
) . cos(
2

1
) . R
D = Acos(sin(0,062579218) . sin(0,06226993) +
cos(0,062579218) .cos(0,06226993) .
cos(1,721632796-1,721440765)) . 6371
Maka jarak = 2,318 km

2. Jarak antara Jalan Setia Budi(2) dan Jalan Mesjid(3)
Pengukuran bujur dan lintang untuk Jalan Setia Budi adalah
Lintang 3,5678042, Bujur 98,6422931
Pengukuran lintang dan bujur untuk Jalan Mesjid adalah
Lintang 3,5731014, Bujur 98,6535551


Universitas Sumatera Utara
40

Bagi dengan 180 / , sehingga diperoleh
Jalan Setia Budi : Lintang radian = 0,06226993
Bujur radian = 1,721632796
Jalan Mesjid : Lintang radian = 0,062362384
Bujur radian = 1,721829355

Hitung jarak dua waypoints dengan rumus
= Acos(sin(z
1
) . sin(z
2
) +cos(z
1
) . cos(z
2
) . cos(
2

1
) . R
D = Acos(sin(0,06226993) . sin(0,062362384)+
cos(0,06226993) .cos(0,062362384) .
cos(1,721829355-1,721632796)) . 6371
Maka jarak = 1,382 km

3. Jarak antara Jalan Mesjid(3) dan Jalan Jamin Ginting(4)
Jalan Mesjid : Lintang radian = 0,062362383938
Bujur radian = 1,721829355293
Jalan Jamin Ginting : Lintang radian = 0,062261633061
Bujur radian = 1,721955373301
Maka jarak = 1,027 km

4. Jarak antara Jalan Merpati(1) dan Jalan Jamin Ginting(4)
Jalan Merpati : Lintang radian = 0,062579218408
Bujur radian = 1,721440764716
Jalan Jamin Ginting : Lintang radian = 0,062261633061
Bujur radian = 1,721955373301
Maka jarak = 3,847 km

5. Jarak antara Jalan Setia Budi (2) dan Jalan Jamin Ginting (4)
Jalan Setia Budi : Lintang radian = 0,062269930356
Bujur radian = 1,721632796312

Universitas Sumatera Utara
41

Jalan Jamin Ginting : Lintang radian = 0,062261633061
Bujur radian = 1,721955373301
Maka jarak = 2,052 km

6. Jarak antara Jalan Merpati (1) dan Jalan Mesjid (3)
Jalan Merpati : Lintang radian = 0,062579218408
Bujur radian = 1,721440764716
Jalan Mesjid : Lintang radian = 0,062362383938
Bujur radian = 1,721829355293
Maka jarak = 2,830 km

Tampilan graf dapat dilihat pada Gambar 4.1.








Gambar 4.1 Graf Dengan Empat Vertex

Dari graf diatas, jarak antar kota dapat ditampilkan dimasukan kedalam sebuah tabel.
Kemudian akan dicari route terpendeknya.

Tabel 4.2 Jarak Antar Kota
Kota ke- 1 2 3 4
1 0 2,318 2,830 3,847
2 2,318 0 1,381 2,052
3 2,830 1,381 0 1,027
4 3,847 2,052 1,027 0

1 2
4 3
2,318 km
2,830 km
3,847 km
2,052 km
1,027 km
1,381 km
Universitas Sumatera Utara
42

Berikut ini langkah-langkah perhitungan route terpendek menggunakan algoritma
semut.

Parameterparameter yang digunakan adalah:
Alfa () = 1.00
Beta () = 1.00
Rho () = 0.50
ij awal = 0.01
Maksimum siklus (NCmax) = 1
Tetapan siklus semut (Q) = 1
Banyak semut (m) = 3
Dari jarak kota yang telah diketahui dapat dihitung visibilitas antar kota (ij) = 1/dij

Tabel 4.3 Visibilitas Antar Kota
Kota ke- 1 2 3 4
1 0 0,431406 0,353357 0,259943
2 0,431406 0 0,724113 0,487329
3 0,353357 0,724113 0 0,97371
4 0,259943 0,487329 0,97371 0

Intensitas feromon antar titik (ij) akan diperlihatkan pada table 4.4 dibawah ini :

Tabel 4.4 Feromon Antar Titik
Kota ke- 1 2 3 4
1
0 0,01 0,01 0,01
2 0,01 0 0,01 0,01
3 0,01 0,01 0 0,01
4 0,01 0,01 0,01 0

Nilai dari parameter visibilitas () dan intensitas feromon () ini nantinya akan
digunakan dalam persamaan probabilitas dan merupakan parameter yang
mempengaruhi semut dalam pemilihan titik berikutnya ( aturan transisi).

Universitas Sumatera Utara
43

Mencari titik tujuan berikutnya dengan perhitungan probabilitas :

Siklus ke-1
Semut ke 1:
- Daftar semut 1 ke tujuan
- Probabilitas dari kota 1 ke setiap kota berikutnya dapat dihitung dengan persamaan
P
k
(r, s) = _
|(r, s)]
u
. |q(r, s)]
[
_ |(r, u)]
u
. |q(r, u)]
[
uc]
k
()
u

[(r,u)]

.[(r,u)]

= (0.01*0) + (0.01*0,431406) + (0.01*0,353357) + (0.01*0,259943)


= 0,01045
dengan demikian dapat dihitung probabilitas dari kota 1 menuju setiap kota =
Kota 1 = 0.00
Kota 2 = (0.01)1.00 . (0,431406)1.00 / 0,01045 = 0,412829
Kota 3 = (0.01)1.00 . (0,353357)1.00/ 0,01045 = 0,338141
Kota 4 = (0.01)1.00 . (0,259943)1.00/ 0,01045 = 0.248749

- Probabilitas Komulatif = 0,000 0,413 0,751 1,000
- Bilangan Random = 0.679
- Memeriksa qk-1 < r qk Kota yang dipilih adalah 3
- Daftar semut = 1 3
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

(1,3 )=
1
2,830 . 4
=
1
11,32
=0,088
(1,3) (10,50 ).(0,01)+(0,088)
(1,3) 0,093
Menghitung probabilitas dari titik 3 ke titik berikutnya:
P
k
(r, s) = _
|(r, s)]
u
. |q(r, s)]
[
_ |(r, u)]
u
. |q(r, u)]
[
uc]
k
()
u

[(r,u)]

.[(r,u)]

= (0.01*0,353357) + (0.01*0,724113) + (0.01*0,97371)


= 0,0205118
Universitas Sumatera Utara
44

Kota 1 = (0.01)1.00 . (0, 353357)1.00 / 0,0205118 = 0,172270
Kota 2 = (0.01)1.00 . (0,724113)1.00 / 0,0205118 = 0,353023
Kota 3 = 0
Kota 4 = (0.01)1.00 . (0, 97371)1.00/ 0,0205118 = 0,474707

- Probabilitas Komulatif = 0,172270 0,525292758 0,525292758 1,000
- Bilangan Random = 0.479
- Memeriksa qk-1 < r qk Kota yang dipilih adalah 2
- Daftar semut = 1 3 2
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

(3,2 )=
1
1,381 . 4
=
1
5,524
=0,1810
(3,2) (10,50 ).(0,01)+(0,1810)
(3,2) 0,186

Titik tujuan selanjutnya hanya ke titik 4
- Daftar semut = 1 3 2 4
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

(2,4 )=
1
2,052 . 4
=
1
8,208
=0,1218
(2,4) (10,50 ).(0,01)+( 0,1218)
(2,4) 0,1268


Semut ke 2:
- Daftar semut 1 ke tujuan
- Probabilitas dari kota 1 ke setiap kota berikutnya dapat dihitung dengan persamaan
P
k
(r, s) = _
|(r, s)]
u
. |q(r, s)]
[
_ |(r, u)]
u
. |q(r, u)]
[
uc]
k
()
u

Universitas Sumatera Utara
45

[(r,u)]

.[(r,u)]

= (0.01*0) + (0.01*0,431406) + (0.01*0,353357) + (0.01*0,259943)


= 0,01045
dengan demikian dapat dihitung probabilitas dari kota 1 menuju setiap kota =
Kota 1 = 0.00
Kota 2 = 0,412829
Kota 3 = 0,338141
Kota 4 = 0.248749
- Probabilitas Komulatif = 0,000 0,413 0,751 1,000
- Bilangan Random = 0.497
- Memeriksa qk-1 < r qk Kota yang dipilih adalah 2
- Daftar semut = 1 2
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

(1,2 )=
1
2,318 . 4
=
1
9,272
=0,1078
(1,2) (10,50 ).(0,01)+(0,1078)
(1,2) 0,1128
Menghitung probabilitas dari titik 2 ke titik berikutnya:
P
k
(r, s) = _
|(r, s)]
u
. |q(r, s)]
[
_ |(r, u)]
u
. |q(r, u)]
[
uc]
k
()
u

[(r,u)]

.[(r,u)]

= (0.01*0,431406) + (0.01*0) + (0.01*0,724113) + (0.01*0,487329)


= 0,01643
Kota 1 = (0.01)1.00 . (0,431406)1.00 / 0,01643 = 0,0087
Kota 2 = 0.00
Kota 3 = (0.01)1.00 . (0,724113)1.00 / 0,01643 = 0,5926
Kota 4 = (0.01)1.00 . (0,487329)1.00 / 0,01643 = 0.3988
- Probabilitas Komulatif = 0,263 0,263 0,703 1,000
- Bilangan Random = 0.598
- Memeriksa qk-1 < r qk Kota yang dipilih adalah 3
- Daftar semut = 1 2 3
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
Universitas Sumatera Utara
46

( t,v )=
1
L
nn
.C

(2,3 )=
1
1,1381 . 4
=
1
4,5524
=0,21966
(2,3) (10,50 ).(0,01)+(0,21966)
(2,3) 0,2247
Titik tujuan selanjutnya hanya ke titik 4
- Daftar semut = 1 2 3 4
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

(3,4 )=
1
1,027 . 4
=
1
4,108
=0,2434
(3,4) (10,50 ).(0,01)+( 0,2434)
(3,4) 0,2484

Semut ke 3:
- Daftar semut 1 ke tujuan
- Probabilitas dari kota 1 ke setiap kota berikutnya dapat dihitung dengan persamaan
P
k
(r, s) = _
|(r, s)]
u
. |q(r, s)]
[
_ |(r, u)]
u
. |q(r, u)]
[
uc]
k
()
u

[(r,u)]

.[(r,u)]

= (0.01*0) + (0.01*0,431406) + (0.01*0,353357) + (0.01*0,259943)


= 0,01045
dengan demikian dapat dihitung probabilitas dari kota 1 menuju setiap kota =
Kota 1 = 0.00
Kota 2 = 0,412829
Kota 3 = 0,338141
Kota 4 = 0.248749
- Probabilitas Komulatif = 0,000 0,413 0,751 1,000
- Bilangan Random = 0.721
- Memeriksa qk-1 < r qk Kota yang dipilih adalah 3
- Daftar semut = 1 3
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
Universitas Sumatera Utara
47

( t,v )=
1
L
nn
.C

(1,3 )=
1
2,830 . 4
=
1
11,32
=0,088
(1,3) (10,50 ).(0,01)+(0,088)
(1,3) 0,093

Menghitung probabilitas dari titik 3 ke titik berikutnya:
P
k
(r, s) = _
|(r, s)]
u
. |q(r, s)]
[
_ |(r, u)]
u
. |q(r, u)]
[
uc]
k
()
u

[(r,u)]

.[(r,u)]

= (0.01*0,353357) + (0.01*0,724113) + (0.01*0,97371)


= 0,0205118
Kota 1 = 0,172270
Kota 2 = 0,353023
Kota 3 = 0
Kota 4 = 0,474707

- Probabilitas Komulatif = 0,172270 0,525292758 0,525292758 1,000
- Bilangan Random = 0.519
- Memeriksa qk-1 < r qk Kota yang dipilih adalah 2
- Daftar semut = 1 3 2
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

(3,2 )=
1
1,381 . 4
=
1
5,524
=0,1810
(3,2) (10,50 ).(0,01)+(0,1810)
(3,2) 0,186
Titik tujuan selanjutnya hanya ke titik 4
- Daftar semut = 1 3 2 4
- Melakukan pembaruan lokal feromon menggunakan persamaan (3):
(t,v) (1 ). (t,v)+ (t,v)
( t,v )=
1
L
nn
.C

Universitas Sumatera Utara
48

(2,4 )=
1
2,052 . 4
=
1
8,208
=0,1218
(2,4) (10,50 ).(0,01)+( 0,1218)
(2,4) 0,1268

Hasil rute semut pada siklus 1 adalah rute:
Hasil pencarian dari siklus pertama seperti yang terlihat pada tabel 4.5 berikut:

Tabel 4.5 Hasil Siklus I Algoritma Semut
Semut Route Panjang
Semut 1 1 3 2 4 6,263 Km
Semut 2 1 2 3 4 4,726 Km
Semut 3 1 3 2 4 6,263 Km

Melakukan pembaruan global feromon menggunakan persamaan (4)
(t,v)(1 ). (t,v) +. (t,v)
( t,v )= _
I
gb
-1
[iko (t, :) e routc tcrboik
u

Melakukan pembaruan global untuk rute terbaik pada siklus I:
Rute terbaik adalah 1 2 3 4 dengan panjang I
gb
= 4,726 Km, sehingga diperoleh
( t,v )=
1
4,726
= u,2116
(t,v)(1 ). (t,v) +. (t,v)
(1,2)(10,1 ).( 0,1128) +(0,1).( u,2116)
(1,2)0,12268
(2,3)(10,1 ).( 0,2247) +(0,1).( u,2116)
(2,3) 0,22339
(3,4)(10,1 ).( 0,248) +(0,1).( u,2116)
(3,4) 0,24436
Melakukan pembaruan global untuk rute lainnya:
(t,v)(1 ). (t,v) +. (t,v)
(t,v) = 0
(1,3)(1 0,1) (0,093) +(0,1).(0)
(1,3)0,0837
Universitas Sumatera Utara
49

(2,4)(1 0,1) (0,126) +(0,1).(0)
(2,4)0,1143

Intensitas feromon pada setiap titik setelah diperbaharui (ij hasil dari siklus I) akan
ditunjukkan oleh tabel 4.6 di bawah ini.

Tabel 4.6 Feromon Antar Titik Pada Graf
1 2 3 4
1 - 0,12268 0,0837 0
2 0,12268 - 0,22339 0,1143
3 0,0837 0,22339 - 0,24436
4 0 0,1143 0,24436 -

Dari tabel diatas terlihat bahwa terjadi perubahan nilai feromon. Untuk titik
yang sering dikunjungi oleh semut terjadi penambahan intensitas feromon, sedangkan
pada titik yang jarang dikunjungi semut terjadi pengurangan nilai intensitas feromon
(evaporasi). Nilai intensitas feromon yang baru inilah yang akan digunakan untuk
melakukan perhitungan pada siklus berikutnya.

Untuk melakukan perhitungan perjalanan, kemudian melakukan pencarian
jalur terdekat, penulis melakukannya dengan cara mengimplementasikan kode
program yang dapat dilihat seperti pada Tabel 4.7.

Tabel 4.7. Kode Program Untuk Penentuan Route Terpendek
Baris
Kode
Kode Program
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function AntColony(mode) {
var alfa = 1.0;
var beta = 1.0;
var rho = 0.5;
var asymptoteFactor = 0.01;
var pher = new Array();
var nextPher = new Array();
var prob = new Array();
var numAnts = 20;
var numWaves = 20;

for (var i = 0; i < numActive; ++i) {
pher[i] = new Array();
nextPher[i] = new Array();
}

Universitas Sumatera Utara
50

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
for (var i = 0; i < numActive; ++i) {
for (var j = 0; j < numActive; ++j) {
pher[i][j] = 1;
nextPher[i][j] = 0.0;
}
}

var lastNode = 0;
var startNode = 0;
var numSteps = numActive - 1;
var numValidDests = numActive;

if (mode == 1) {
lastNode = numActive - 1;
numSteps = numActive - 2;
numValidDests = numActive - 1;
}

for (var wave = 0; wave < numWaves; ++wave) {
for (var ant = 0; ant < numAnts; ++ant) {
var curr = startNode;
var currDist = 0;
for (var i = 0; i < numActive; ++i) {
visited[i] = false;
}
currPath[0] = curr;
for (var step = 0; step < numSteps;
++step) {
visited[curr] = true;
var cumProb = 0.0;
for (var next = 1; next <
numValidDests; ++next) {
if (!visited[next]) {
prob[next] =
Math.pow(pher[curr][next], alfa) * Math.pow(dur[curr][next],
0.0 - beta);
cumProb += prob[next];
}
}
var guess = Math.random() * cumProb;
var nextI = -1;
for (var next = 1; next <
numValidDests; ++next) {
if (!visited[next]) {
nextI = next;
guess -= prob[next];
if (guess < 0) {
nextI = next;
break;
}
}
}
currDist += dur[curr][nextI];
currPath[step+1] = nextI;
curr = nextI;
}
currPath[numSteps+1] = lastNode;
currDist += dur[curr][lastNode];

// k2-rewire:
Universitas Sumatera Utara
51

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
var lastStep = numActive;
if (mode == 1) {
lastStep = numActive - 1;
}
var changed = true;
var i = 0;
while (changed) {
changed = false;
for (; i < lastStep - 2 && !changed;
++i) {
var cost =
dur[currPath[i+1]][currPath[i+2]];
var revCost =
dur[currPath[i+2]][currPath[i+1]];
var iCost =
dur[currPath[i]][currPath[i+1]];
var tmp, nowCost, newCost;
for (var j = i+2; j < lastStep
&& !changed; ++j) {
nowCost = cost + iCost +
dur[currPath[j]][currPath[j+1]];
newCost = revCost +
dur[currPath[i]][currPath[j]]
+
dur[currPath[i+1]][currPath[j+1]];
if (nowCost > newCost) {
currDist += newCost - nowCost;
// Reverse the detached road
segment.
for (var k = 0; k <
Math.floor((j-i)/2); ++k) {
tmp = currPath[i+1+k];
currPath[i+1+k] = currPath[j-
k];
currPath[j-k] = tmp;
}
changed = true;
--i;
}
cost +=
dur[currPath[j]][currPath[j+1]];
revCost +=
dur[currPath[j+1]][currPath[j]];
}
}
}

if (currDist < bestTrip) {
bestPath = currPath;
bestTrip = currDist;
}

for (var i = 0; i <= numSteps; ++i) {
nextPher[currPath[i]][currPath[i+1]]
+= (bestTrip - asymptoteFactor * bestTrip) / (numAnts *
(currDist - asymptoteFactor * bestTrip));
}
}

for (var i = 0; i < numActive; ++i) {
Universitas Sumatera Utara
52

137
138
139
140
141
142
143
144
for (var j = 0; j < numActive; ++j) {
pher[i][j] = pher[i][j] * (1.0 - rho) + rho
* nextPher[i][j];
nextPher[i][j] = 0.0;
}
}
}
}

Keterangan:
1. Baris 1 s/d 144: Blok Algoritma Ant Colony Optimization dalam penentuan
route terpendek .

Sebagai contoh, beberapa koordinat ponsel yang digunakan dapat dilihat pada
Gambar 4.1, kemudian dihitung menggunakan algortima ACO untuk menhgasilkan
rute perjalanan tercepat, output yang dihasilkan dapat dilihat seperti pada Gambar 4.2.


Gambar 4.2 Posisi Koordinat Dalam Google Maps


Universitas Sumatera Utara
53


Gambar 4.3 Route Perjalanan

Pada tampilan Export merupakan hasil perhitungan jarak terdekat antar kota
sesuai urutan pada menu export to csv, merupakan durasi perjalanan masing-masing
kota yang ditampilkan dalam matrix. Tampilan Export dapat dilihat pada Gambar 4.4.


Gambar 4.4 Export

4.2. Pengujian Sistem

Perangkat lunak yang dirancang memerlukan pengujian data dengan melakukan
pengujian dari sisi user untuk mendapatkan koordinat ponsel dan menentukan jarak
Universitas Sumatera Utara
54

terdekatnya. Hal tersebut betujuan untuk mengetahui bagaimana kinerja aplikasi
secara garis besar sebelum aplikasi dijalankan.

4.2.1 Pengujian Aplikasi User

Untuk melakukan pengujian aplikasi yang dirancang, saat aplikasi ini pertama kali
dijalankan, akan muncul sebuah form login. Form login digunakan sebagai autentikasi
untuk masuk ke menu utama user, tampilan dapat dilihat pada Gambar 4.5.

Gambar 4.5 Login

Jika belum terdaftar di aplikasi, user dapat mendaftarkan ke dengan menekan tombol
daftar, kemudian user harus mengisi data pada form pendaftaran seperti Gambar 4.6.


Gambar 4.6 Pendaftaran
Universitas Sumatera Utara
55

Setelah data sudah terisi dengan benar maka, data akan diverifikasi oleh admin agar
user dapat melakukan login, tampilan setelah melakukan pendaftaran dilihat pada
gambar 4.7.


Gambar 4.7 Pemberitahuan Aktifasi

Setelah mengisikan username dan password pada form login, aplikasi akan
melakukan authentikasi data kemudian akan diarahkan pada tampilan utama, dapat
dilihat pada gambar 4.8

Gambar 4.8 Halaman User
Universitas Sumatera Utara
56

Menu yang tersedia pada aplikasi user hanya edit profile dan logout. Untuk
melakukan perubahan data dapat dilihat pada gambar 4.9.

Gambar 4.9. Halaman Perubahan Data User

4.2.2 Pengujian Aplikasi Admin

Untuk masuk ke tampilan utama admin terlebih dahulu akan melakukan pengisian
username dan password sebagai autentikasi untuk masuk ke admin, tampilan login
admin dapat dilihat pada Gambar 4.10.


Gambar 4.10 Login Admin
Universitas Sumatera Utara
57

Apabila proses login admin berhasil maka, akan diarahkan pada bagian menu utama
dmin. Tampilan dapat dilihat pada gambar 4.11.


Gambar 4.11 Halaman Admin

Untuk melacak posisi user, pilih tombol lacak user maka peta akan menampilkan
posisi user berdasarkan koordinat yang sudah tersimpan didatabase sebelumnya.
Tampilan dapat dilihat pada gambar 4.12.


Gambar 4.12 Hasil Tracking Koordinat User

Universitas Sumatera Utara
58

Setelah posisi user sudah dilacak, kemudian dapat dilakukan perhitungan untuk
penentuan jarak terdekat. untuk melihat hasil perhitungan perjalanan dapat dilihat
pada gambar 4.13


Gambar 4.13 Hasil Perhitungan
Route awal untuk melalui semua titik yaitu 1->2->3->4->5->6->7->8. Hasil dapat
dilihat pada Gambar 4.14.


Gambar 4.14 Urutan Titik Sebelum Perhitungan

Universitas Sumatera Utara
59

Untuk melihat route tercepat yang harus dilalui setelah perhitungan dengan
menggunakan algoritma ACO untuk yaitu 1->4->6->7->2->3->5->8. Hasil dapat
dilihat pada Gambar 4.15.


Gambar 4.15 Urutan Titik Setelah Perhitungan.

Menekan tombol durasi dalam matrix untuk memulai melihat hasil perhitungan yang
disajikan dalam sebuah matrix. tampilan dapat dilihat seperti pada Gambar 4.16.


Gambar 4.16 Hasil Perhitungan Dalam Matrix.
Universitas Sumatera Utara
60

4.2.3 Pengujian Sistem Dengan 3 Buah Koordinat

Pengujian dengan 3 buah koordinat adalah pengujian dalam melakukan proses
penentuan jarak antar pengguna sejumlah 3 tempat dengan lokasi titik dapat
ditentukan melalui tombol. Pengujian pemasukan data dengan 3 tempat dapat dilihat
pada Gambar 4.17.


Gambar 4.17 Pengujian 3 buah Koordinat


4.2.4 Fungsi Fitur One Way Trip


Setelah titik lokasi yang ingin dituju telah diinputkan pada layar maka user dapat
memilih fitur pencarian. Fitur one way trip akan mencari rute terpendek dimana lokasi
yang pertama diinputkan adalah lokasi awal dan lokasi terakhir menjadi lokasi tujuan.
Ujicoba dilakukan dengan 3 node. Hasilnya sebagai berikut :

Universitas Sumatera Utara
61


Gambar 4.18 Fitur Oneway Trip dan Directions

Selain itu fitur ini bisa ditempuh dengan jalan (by walking). Hasilnya sebagai berikut:



Gambar 4.19 Fitur Oneway Trip by Walking dan Directions

Dari Gambar diatas dapat dilihat jarak tempuh total dan rute yang ditempuh dari fitur
one way trip by walking lebih kecil dibandingkan fitur one way trip by driving hal ini
disebabkan berbedanya akses jalan yang dapat ditempuh oleh keduanya.
Universitas Sumatera Utara


BAB 5


KESIMPULAN DAN SARAN




5.1 Kesimpulan

Dari penelitian tentang penentuan jalur terpendek menggunakan algoritma Ant Colony
Optimization, dapat diambil kesimpulan sebagai berikut:

1. Aplikasi mobile tracking dalam penentuan jarak terdekat dengan dukungan
Sistem Informasi Geografis ini dapat menunjukkan rute terpendek antara
ponsel.

2. Kecepatan menampilkan suatu rute pada map tergantung pada jumlah kota
yang diinputkan, provider dan kestabilan koneksi internet.


5.2 Saran

Adapun saran yang dapat penulis berikan untuk mengembangkan penelitian ini adalah
sebagai berikut:
Universitas Sumatera Utara
63

1. Diharapkan pengembangan pada aplikasi ini supaya memiliki fitur yang lebih
banyak dan lebih menarik. Contohnya fitur untuk melacak truk pengiriman
barang, melacak sebuah lokasi toko, restoran dan tempat-tempat lainya.

2. Diharapkan pengembangan pada aplikasi ini menggunakan platform yang
berbeda (android, iOS, dll) untuk melacak koordinat ponsel.
Universitas Sumatera Utara


DAFTAR PUSTAKA

Sumber Dari Buku
[1] Abdusakir, Azizah,N.N. & Novandika, F.F. 2009. Teori graf. Malang.UIN-Malang
Press.

[2] Basuki,A.P, 2011. Membangun Web Berbasis PHP dengan Framework
Codeigniter, Lokomedia:Yogyakarta.

[3] Dorigo, M. & Gambardella, L.M .1997. Ant Colony for the Travelling Salesman
Problem. Cambridge. Massachussets. London. England .

[4] Dorigo, M. & Stutzle,T. 2004. Ant Colony Optimization. The MIT Press,
Massachusetts.

[5] Dorigo, M. 1996. The Ant Colony Optimization Metaheuristic: Algorithms,
Applications, and Advances. Universit Libre de Bruxelles.

[6] Dorigo, M. 1996. Ant Colony System: A Cooperative Learning Approach to the
Traveling Salesman Problem. Universit Libre de Bruxelles

[7] Munir, Rinaldi. 2005. Matematika Diskrit. Edisi ketiga. Bandung: Informatika.

[8] Sirenden,B.H. & Dachi, E.L. 2012. Buat Sendiri Aplikasi Petamu Menggunakan
Codeigniter dan Google Maps API.Andi:Yogyakarta.

[9] Siswanto. 2005. Pengantar Sistem Informasi Geografik.UPN Press:Surabaya.

[10] Sklar. J,R. 2003. Interference Mitigation Approaches for the Global Positioning
System. Lincoln Laboratory Journal Volume 14. 167-180.

[11] Solnon, Christine. 2010. Ant Colony Optimization and Constraint Programming.
ISBN :987-1-84821-130-8. England :Wiley.

[12] Wardhana. 2010. Menjadi master PHP dengan Framework Codeigniter. Elex
Media Komputindo:Jakarta.

Sumber Dari Jurnal Online
[13] Google Developers. Getting Started - Google Maps JavaScript API v3 (online).
https://developers.google.com/maps/documentation/javascript/tutorial
(5 Mei 2013).
[14] CodeIgniter User Guide. (online). http://www.codeigniter.com (5 Mei 2013).


Universitas Sumatera Utara
LISTING PROGRAM

1. Halaman Admin
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-
microsoft-com:vml" itemscope itemtype="http://schema.org/Product">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>

<meta itemprop="name" content="OptiMap">
<meta itemprop="description" content="Fastest roundtrip solver with
ACO">
<title>SANJAYA - Ant Colony Optimazion for Google Maps API</title>
<link rel="stylesheet" href="<?php echo base_url().'media/style.css';
?>" type="text/css" media="screen">
<link rel="stylesheet" href="<?php echo base_url().'media/print.css';
?>" type="text/css" media="print">
<link type="text/css" href="<?php echo base_url().'media/jquery-ui-
1.8.16.custom.css'; ?>" rel="stylesheet" />
<script type="text/javascript" src="<?php echo
base_url().'media/jquery.min.js'; ?>"></script>
<script type="text/javascript" src="<?php echo
base_url().'media/jquery-ui.min.js'; ?>"></script>

<meta name="viewport" content="initial-scale=1.0, user-scalable=no"
/>
<script type="text/javascript"
src="http://www.google.com/jsapi"></script>
<script type="text/javascript" src="<?php echo
base_url().'media/BpTspSolver.js'; ?>"></script>
<script type="text/javascript" src="<?php echo
base_url().'media/tsp.js'; ?>"></script>
<script type="text/javascript" src="<?php echo
base_url().'media/directions-export.js'; ?>"></script>

<script type="text/javascript">

</script>

<script type="text/javascript">
jQuery.noConflict();
function onBodyLoad() {
google.load("maps", "3", {callback: init,
other_params:"sensor=false"});
}

function loadAtStart(lat, lng, zoom) {
var center = new google.maps.LatLng(lat, lng);
initMap(center, zoom, document.getElementById("map"));
directionsPanel = document.getElementById("my_textual_div");

tsp = new BpTspSolver(gebMap, directionsPanel);
tsp.setDirectionUnits("m");

<?php foreach ($mobile->result() as $row){?>
Universitas Sumatera Utara
tsp.addWaypoint(new google.maps.LatLng(<?php echo "$row-
>lat"; ?>, <?php echo "$row->long"; ?>));
<?php }?>

google.maps.event.addListener(tsp.getGDirectionsService(),
"error", function() {
alert("Request failed: " +
reasons[tsp.getGDirectionsService().getStatus().code]);
});
}


function init() {
if (google.loader.ClientLocation != null) {
latLng = new
google.maps.LatLng(google.loader.ClientLocation.latitude,
google.loader.ClientLocation.longitude);
loadAtStart(google.loader.ClientLocation.latitude,
google.loader.ClientLocation.longitude, 8);
} else {
loadAtStart(3.5855598,98.67395720000002, 14);
}
}

function toggle(divId) {
var divObj = document.getElementById(divId);
if (divObj.innerHTML == "") {
divObj.innerHTML = document.getElementById(divId +
"_hidden").innerHTML;
document.getElementById(divId + "_hidden").innerHTML = "";
} else {
document.getElementById(divId + "_hidden").innerHTML =
divObj.innerHTML;
divObj.innerHTML = "";
}
}


jQuery(function() {
jQuery( "#accordion" ).accordion({
collapsible: true,
autoHeight: false,
clearStyle: true
});
jQuery("input:button").button();
jQuery("#dialogProgress" ).dialog({
height: 140,
modal: true,
autoOpen: false
});
jQuery("#progressBar").progressbar({ value: 0 });
jQuery("#dialogTomTom" ).dialog({
height: 480,
width: 640,
modal: true,
autoOpen: false
});
jQuery("#dialogGarmin" ).dialog({
height: 480,
width: 640,
Universitas Sumatera Utara
modal: true,
autoOpen: false
});
});

(function() {
var po = document.createElement('script'); po.type =
'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(po, s);
})();


</script>

</head>

<body onLoad="onBodyLoad()">
<h2>Ant Colony Optimization - Untuk Menentukan Jalur Terdekat</h2>
<table class='mainTable'>
<tr>
<td class='left' style='vertical-align: top'>
<div id="leftPanel">
<div id="accordion" style='width: 300pt'>
<h3><a href="#" class='accHeader'>Tujuan</a></h3>
<div>
<form name="address" onSubmit="clickedAddAddress(); return
false;">
Tambah alamat tujuan :
<table>
<tr>
<td><input name="addressStr" type="text"></td>
<td><input type="button" value="Add!"
onClick="clickedAddAddress()"></td>
</tr>
</table>
</form>
Atau <a href="#" onClick="toggle('bulkLoader');
document.listOfLocations.inputList.focus();
document.listOfLocations.inputList.select(); return false;">
Berapa Alamat or (lat, lng)</a>.
<div id="bulkLoader"></div>
</div>

<h3><a href="#" class='accHeader'>Pilihan Jalur</a></h3>
<div>
<form name="travelOpts">
<input id="walking" type="checkbox"/>
Walking (Jalan kaki)<br>
<input id="bicycling" type="checkbox"/>
Bicycling (Naik sepeda)<br>
<input id="avoidHighways" type="checkbox"/>
Avoid highways (Hindari jalan raya)<br>
<input id="avoidTolls" type="checkbox"/>
Avoid toll roads
(Hindari jalan tol)
</form>
</div>

Universitas Sumatera Utara
<h3><a href="#" class='accHeader'>Export</a></h3>
<div>
<div id="exportGoogle"></div>
<div id="exportDataButton"></div>
<div id="exportData"></div>
<div id="exportLabelButton"></div>
<div id="exportLabelData"></div>
<div id="exportAddrButton"></div>
<div id="exportAddrData"></div>
<div id="exportOrderButton"></div>
<div id="exportOrderData"></div>
<div id="garmin"></div>
<div id="tomtom"></div>
<div id="durations" class="pathdata"></div>
<div id="durationsData"></div>
</div>

<h3><a href="#" class='accHeader'>Edit Route</a></h3>
<div>
<div id="routeDrag"></div>
<div id="reverseRoute"></div>
</div>

<h3><a href="#" class='accHeader'>Mobile Tracking</a></h3>
<div>
<input id='button3' class="calcButton" type='button'
value='Lacak User' onClick='TrackMobile()'>
<input id="button1" class="calcButton" type="button"
value="Hitung Perjalanan TSP" onClick="directions(0,
document.forms['travelOpts'].walking.checked,
document.forms['travelOpts'].bicycling.checked,
document.forms['travelOpts'].avoidHighways.checked,
document.forms['travelOpts'].avoidTolls.checked)">
<input id="button2" class="calcButton" type="button"
value="Hitung Perjalanan dari A - Z" onClick="directions(1,
document.forms['travelOpts'].walking.checked,
document.forms['travelOpts'].bicycling.checked,
document.forms['travelOpts'].avoidHighways.checked,
document.forms['travelOpts'].avoidTolls.checked)">
</div>
</div>
<input id='button3' class="calcButton" type='button' value='Data
Clinet' onClick="popup('<?php echo base_url() ?>adminweb/data',
'Win1', 1500, 600); return false">
<input id='button3' class="calcButton" type='button' value='Ulangi
Lagi' onClick='startOver()'>
<input id='button3' class="calcButton" type='button' value='Refresh
Halaman' onClick='RefreshPage()'>
<input id='button3' class="calcButton" type='button'
value='Pengujian Javascript' onClick='testJS()'>
<input id='button3' class="calcButton" type='button' value='About'
onClick="popup('http://www.sanjayamediatama.com/templates/default/img
/index.html', 'Win1', 600, 600); return false">
<input id='button3' class="calcButton" type='button' value='Logout'
onclick="window.location='<?php echo base_url() ?>adminweb/logout';">
</td>
<td class='right' style='vertical-align: top'>
<?php echo ! empty($kanan) ? $this->load->view($kanan) : ''; ?>
</td>
</tr>
Universitas Sumatera Utara
</table>

<!-- Hidden stuff -->
<div id="bulkLoader_hidden" style="visibility: hidden;">
<form name="listOfLocations" onSubmit="clickedAddList(); return
false;">
<textarea name="inputList" rows="10" cols="70">Isikan tujuan
perbarisnya</textarea><br>
<input type="button" value="Tambahkan daftar Tujuan"
onClick="clickedAddList()">
</form></div>
<div id="exportData_hidden" style="visibility: hidden;"></div>
<div id="exportLabelData_hidden" style="visibility: hidden;"></div>
<div id="exportAddrData_hidden" style="visibility: hidden;"></div>
<div id="exportOrderData_hidden" style="visibility: hidden;"></div>
<div id="durationsData_hidden" style="visibility: hidden;"></div>

<div id="dialogProgress" title="Hitung perjalanan...">
<div id="progressBar"></div>
</div>

<div id="dialogTomTom" title="Export to TomTom">
<iframe name='tomTomIFrame' style='width: 580px; height:
400px'></iframe>
</div>

<div id="dialogGarmin" title="Export to Garmin">
<iframe name='garminIFrame' style='width: 580px; height:
400px'></iframe>
</div>

</body>
</html>

2. Admin Controller

<?php
class Adminweb extends CI_Controller {

function __construct(){
parent::__construct();
$this->load->model('M_mobile', '', TRUE);
}

function index(){
$this->load->view('loginadmin');
}

function aco(){
$this->auth->restrict_admin();
$data['mobile'] = $this->M_mobile-
>all_track();
$data['kanan'] = "map";
$this->load->view('adminweb',$data);
}

function data(){
$data['mobile'] = $this->M_mobile-
>all_track();
Universitas Sumatera Utara
$data['query'] = $this->M_mobile-
>data_client();
$data['kanan'] = "data";
$this->load->view('adminweb',$data);
}

/**
* Pindah ke halaman update
*/
function edit($id_client)
{
$data['mobile'] = $this->M_mobile-
>all_track();
$client = $this->M_mobile-
>get_client_by_id($id_client)->row();


$data['default']['id_client']
= $client->id_client;
$data['default']['nama']
= $client->nama;
$data['default']['username'] =
$client->username;
$data['default']['password'] =
$client->password;
$data['default']['jenis_kelamin'] =
$client->jenis_kelamin;
$data['default']['no_hp']
= $client->no_hp;
$data['default']['alamat']
= $client->alamat;
$data['default']['aktif']
= $client->aktif;
$data['default']['lat']
= $client->lat;
$data['default']['long']
= $client->long;
$data['kanan'] = "editclient";

$this->load->view('adminweb',$data);
}

function proses_simpan(){
$id_client = $this->input-
>post('id_client');
$password = $this->input->post('password');


if (empty($password)){
$profile = array(
'username' =>
$this->input->post('username'),
'nama'
=> $this->input->post('nama'),
'jenis_kelamin' =>
$this->input->post('jenis_kelamin'),
'no_hp'
=> $this->input->post('no_hp'),
'aktif'
=> $this->input->post('aktif'),
Universitas Sumatera Utara
'alamat' =>
$this->input->post('alamat')
);
}else{
$profile = array(
'username' =>
$this->input->post('username'),
'password' =>
md5($password),
'nama'
=> $this->input->post('nama'),
'jenis_kelamin' =>
$this->input->post('jenis_kelamin'),
'no_hp'
=> $this->input->post('no_hp'),
'aktif'
=> $this->input->post('aktif'),
'alamat' =>
$this->input->post('alamat')
);
}


$this->M_mobile-
>update_profile($id_client,$profile);

$this->session-
>set_flashdata('message', 'profile berhasil diupdate!');
redirect('adminweb/data');


}


/**
* Hapus data
*/
function hapus($id_data)
{
$this->M_mobile->hapus($id_data);
redirect('adminweb/data');
}

/**
* Memproses login
*/
function proses_login()
{
$username = $this->input->post('username');
$password = $this->input->post('password');
$success = $this->auth-
>admin_login($username,$password);
if($success)
{
redirect('adminweb/aco');
}
else
{
$this->session-
>set_flashdata('message', 'Maaf, username dan atau password
Universitas Sumatera Utara
Anda salah, Atau Account anda sedang diblokir, silahkan Hubungi
administrator untuk mengaktifkan kembali!!');
redirect('adminweb');
}

}


/**
* Memproses logout
*/
function logout()
{
$this->session->sess_destroy();
redirect('adminweb', 'refresh');
}
}

3. Halaman User

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- <script type="text/javascript" src="jquery-
1.6.2.min.js"></script> -->
<script type="text/javascript" src="<?php echo
base_url().'media/jquery-1.7.2.js'; ?>"></script>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"
/>
<style>
html{
height:100%;
}
body{
height:100%;
}
#canvas{
height:80%;
}

</style>
<title>Peta Dinamis Pertamaku</title>
<script type="text/javascript"
src="http://maps.googleapis.com/maps/api/js?key=AIzaSyCeCAhmBV1aJRpEy
TpQzwZV-NS_zIfGdSE&sensor=false&language=id"></script>

<script type="text/javascript">
//Mendeklarasikan Array untuk menampung marker dan balloon yang
ada sehiingga mempermudah saat memanggilnya kembali
var markers = new Array();
var infowindows = new Array();

var refreshId = setInterval(function()
{
$('#tracking').fadeOut("slow").load('<?php echo
base_url(); ?>index.php/tracking/proses').fadeIn("slow");
}, 1000);

Universitas Sumatera Utara
var refreshId2 = setInterval(function()
{
$('#koordinat').fadeOut("slow").load('<?php echo
base_url(); ?>index.php/tracking/koordinat').fadeIn("slow");
}, 1000);

var refreshId3 = setInterval(function(){
navigator.geolocation.getCurrentPosition(foundLocation,
noLocation);
}, 10000);

function noLocation() {
alert("Sensor GPS tidak ditemukan");
}

function foundLocation(position) {
var lat = position.coords.latitude;
var lon = position.coords.longitude;

$('#koordinat2').fadeOut("slow").html("Latitude: " + lat
+ "<br>Longitude: " + lon).fadeIn("slow");
var uri = "<?php echo
base_url().'index.php/tracking/simpanlokasi'; ?>";
$.ajax({
type: 'POST',
async: false,
dataType: "html",
url: uri,
data: "lat="+lat+"&long="+lon,
success: function(data) {

}
});
}


/* Melakukan refresh setiap beberapa detik sekali */
var refreshId4 = setInterval(function(){updatedata();}, 12000);

function updatedata(){
var lat = 0;
var long = 0;

for(var i=0;i<markers.length;i++){

var uri = "<?php echo
base_url().'index.php/tracking/ambildata1'; ?>";
$.ajax({
type: 'POST',
async: false,
dataType: "html",
url: uri,
data: "id="+i,
success: function(data) {
lat=data;
}
});

var uri = "<?php echo
base_url().'index.php/tracking/ambildata2'; ?>";
Universitas Sumatera Utara
$.ajax({
type: 'POST',
async: false,
dataType: "html",
url: uri,
data: "id="+i,
success: function(data) {
long = data;
}
});

var myLatLng = new
google.maps.LatLng(lat,long);
markers[i].setPosition(myLatLng);
infowindows[i].setPosition(myLatLng);

}

}

function initialize(){
var myLatLng = new google.maps.LatLng(3.5674094,
98.66089480000005);
var myOptions = {
zoom: 14,
center:myLatLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}

map = new google.maps.Map(
document.getElementById('canvas'),myOptions);

<?php foreach ($tampil->result() as $row){?>
var marker= new google.maps.Marker({
position:new google.maps.LatLng(<?php echo
"$row->lat"; ?>, <?php echo "$row->long"; ?>),
map:map,
title:"Saya disini <?php echo "$row->nama";
?>"
});
marker.setIcon({ url: "http://4.bp.blogspot.com/-
hNcYtcecKTs/T82Sd4ZNn7I/AAAAAAAABWc/l4P-UrOR4rg/s400/Blackberry.png",
scaledSize: new google.maps.Size(30, 24) , anchor: new
google.maps.Point(15, 12)});
markers.push(marker);

var infowindow= new google.maps.InfoWindow({
content:"<img
src='http://www.sanjayamediatama.com/templates/default/img/trackaco.p
ng' width='100' align='left' /><?php echo "$row->nama <br> $row-
>alamat<br>HP : $row->no_hp" ?>",
size: new google.maps.Size(50,50),
position:new google.maps.LatLng(<?php echo
"$row->lat"; ?>, <?php echo "$row->long"; ?>)
});
infowindow.open(map);

infowindows.push(infowindow);
<?php }?>

Universitas Sumatera Utara
}
</script>
</head>
<div id="tracking"></div>
<div id="koordinat"></div>
<?php
$message = $this->session->flashdata('message');
echo $message == '' ? '' : '<p id="message"
align="center">' . $message . '</p>';
?>
<body onLoad="initialize()">
<div id="canvas"></div>
<div id="koordinat2"></div>
<?php echo anchor('tracking/profile', 'Edit Profile',
'title="Keluar dari Halaman"');?> | <?php echo
anchor('client/logout', 'LogOut', 'title="Keluar dari Halaman"');?>
</body>
</html>

4. User Controller

<?php
class Client extends CI_Controller {

function __construct(){
parent::__construct();
$this->load->model('M_mobile', '', TRUE);
}

public function index()
{
if($this->auth->is_logged_in() == false)
{
$this->load->view('login');
}
else
{
redirect('tracking');
}
}

function login(){
$this->load->view('login');
}

function daftar(){
$this->load->view('daftar');
}

function proses_daftar(){
$password = $this->input->post('password');
$username = $this->input->post('username');

if (empty($password) || empty($username)){
$this->session-
>set_flashdata('message', 'username atau password masih
kosong!');
redirect('client/daftar');
}else{
$daf = array(
Universitas Sumatera Utara
'id_client' =>
$this->input->post('id_client'),
'username' =>
$username,
'password' =>
md5($password),
'nama'
=> $this->input->post('nama'),
'jenis_kelamin' =>
$this->input->post('jenis_kelamin'),
'no_hp'
=> $this->input->post('no_hp'),
'aktif'
=> $this->input->post('aktif'),
'alamat' =>
$this->input->post('alamat')
);
$this->M_mobile-
>tambah_client($daf);
}


$this->session-
>set_flashdata('message', 'data berhasil disimpan, tunggu max
2x24 jam. data akan segera diaktifkan!');
redirect('client/login');


}

/**
* Memproses login
*/
function proses_login()
{
$username = $this->input->post('username');
$password = $this->input->post('password');
$success = $this->auth-
>do_login($username,$password);
if($success)
{
redirect('tracking');
}
else
{
$this->session-
>set_flashdata('message', 'Maaf, username dan atau password
Anda salah, Atau Account anda sedang diblokir, silahkan Hubungi
administrator untuk mengaktifkan kembali!!');
redirect('client');
}

}


/**
* Memproses logout
*/
function logout()
{
Universitas Sumatera Utara
$this->session->sess_destroy();
redirect('client/login', 'refresh');
}

}

5. Tracking Controller

<?php
class Tracking extends CI_Controller {

function __construct(){
parent::__construct();
$this->load->model('M_mobile', '', TRUE);
}

function index(){
$data['tampil'] = $this->M_mobile-
>get_track();
$this->load->view('track',$data);
}

function profile(){
$client = $this->M_mobile-
>get_client_by_id($this->session->userdata('id_client'))-
>row();

$data['default']['id_client'] =
$client->id_client;
$data['default']['username'] =
$client->username;
$data['default']['password'] =
$client->password;
$data['default']['nama'] =
$client->nama;
$data['default']['jenis_kelamin'] =
$client->jenis_kelamin;
$data['default']['no_hp'] =
$client->no_hp;
$data['default']['alamat'] =
$client->alamat;
$this->load->view('profile',$data);
}

function proses_simpan(){
$id_client = $this->input-
>post('id_client');
$password = $this->input->post('password');


if (empty($password)){
$profile = array(
'username' =>
$this->input->post('username'),
'nama'
=> $this->input->post('nama'),
'jenis_kelamin' =>
$this->input->post('jenis_kelamin'),
'no_hp'
=> $this->input->post('no_hp'),
Universitas Sumatera Utara
'alamat' =>
$this->input->post('alamat')
);
}else{
$profile = array(
'username' =>
$this->input->post('username'),
'password' =>
md5($password),
'nama'
=> $this->input->post('nama'),
'jenis_kelamin' =>
$this->input->post('jenis_kelamin'),
'no_hp'
=> $this->input->post('no_hp'),
'alamat' =>
$this->input->post('alamat')
);
}


$this->M_mobile-
>update_profile($id_client,$profile);

$this->session-
>set_flashdata('message', 'profile berhasil diupdate!');
redirect('tracking');


}

function simpanlokasi(){
$id_client = $this->session-
>userdata('id_client');
$lat = $this->input->post('lat');
$long = $this->input->post('long');
$tangal = date("Y-m-d H:i:s");
$session_login = $this->session-
>userdata('session_id');
$latlong = array(
'id_track' =>
$this->input->post('id_track'),
'id_client' =>
$id_client,
'lat' =>
$lat,
'long'
=> $long,
'time'
=> $tangal,
'session_login' =>
$session_login
);


$jml = $this->M_mobile-
>valid_lokasi($session_login)->num_rows();
if($jml == 0){
$this->M_mobile-
>track_lokasi($latlong);
Universitas Sumatera Utara
}

$this->M_mobile-
>update_lokasi($id_client,$lat,$long);


}


function ambildata1(){
$id = $this->input->post('id');
$lat = $this->M_mobile->get_LatLong($id)->row();
echo $lat->lat;
}

function ambildata2(){
$id = $this->input->post('id');
$long = $this->M_mobile->get_LatLong($id)->row();
echo $long->long;
}

function proses(){
echo "tracking location processing ...";
}

function koordinat(){
$this->load->view('koordinat');
}

}

6. Ant Colony

(function() {

var tsp; // singleton
var gebMap; // The map DOM object
var directionsPanel; // The driving directions DOM object
var gebDirectionsResult; // The driving directions returned from
GMAP API
var gebDirectionsService;
var gebGeocoder; // The geocoder for addresses
var maxTspSize = 100; // A limit on the size of the problem,
mostly to save Google servers from undue load.
var maxTspBF = 0; // Max size for brute force, may seem
conservative, but ma
var maxTspDynamic = 15; // Max size for brute force, may seem
conservative, but many browsers have limitations on run-time.
var maxSize = 10; // Max number of waypoints in one Google
driving directions request.
var maxTripSentry = 2000000000; // Approx. 63 years., this long a
route should not be reached...
var avoidHighways = false; // Whether to avoid highways. False by
default.
var avoidTolls = false; // Whether to avoid toll roads. False by
default.
var travelMode;
var distIndex;
var waypoints = new Array();
var addresses = new Array();
Universitas Sumatera Utara
var GEO_STATUS_MSG = new Array();
var DIR_STATUS_MSG = new Array();
var labels = new Array();
var addr = new Array();
var wpActive = new Array();
var addressRequests = 0;
var addressProcessing = false;
var requestNum = 0;
var currQueueNum = 0;
var wayArr;
var legsTmp;
var distances;
var durations;
var legs;
var dist;
var dur;
var visited;
var currPath;
var bestPath;
var bestTrip;
var nextSet;
var numActive;
var costForward;
var costBackward;
var improved = false;
var chunkNode;
var okChunkNode;
var numDirectionsComputed = 0;
var numDirectionsNeeded = 0;
var cachedDirections = false;
var requestLimitWait = 1000;
var fakeDirResult; // Object used to store travel info like travel
mode etc. Needed for route renderer.

var onSolveCallback = function(){};
var onProgressCallback = null;
var originalOnFatalErrorCallback = function(tsp, errMsg) {
alert("Request failed: " + errMsg); }
var onFatalErrorCallback = originalOnFatalErrorCallback;
var doNotContinue = false;
var onLoadListener = null;
var onFatalErrorListener = null;

var directionunits;



/* Computes a near-optimal solution to the TSP problem,
* using Ant Colony Optimization and local optimization
* in the form of k2-opting each candidate route.
* Run time is O(numWaves * numAnts * numActive ^ 2) for ACO
* and O(numWaves * numAnts * numActive ^ 3) for rewiring?
*
* if mode is 1, we start at node 0 and end at node numActive-1.
*/
function AntColony(mode) {
var alfa = 0.1; // Pentingnya jalan sebelumnya
var beta = 2.0; // Pentingnya jangka waktu
var rho = 0.1; // Tingkat pembusukan jalan
feromon
Universitas Sumatera Utara
var asymptoteFactor = 0.9; // Ketajaman dari reward sebagai
solusi mendekati solusi terbaik
var pher = new Array();
var nextPher = new Array();
var prob = new Array();
var numAnts = 20;
var numWaves = 20;

for (var i = 0; i < numActive; ++i) {
pher[i] = new Array();
nextPher[i] = new Array();
}

for (var i = 0; i < numActive; ++i) {
for (var j = 0; j < numActive; ++j) {
pher[i][j] = 1;
nextPher[i][j] = 0.0;
}
}

var lastNode = 0;
var startNode = 0;
var numSteps = numActive - 1;
var numValidDests = numActive;

if (mode == 1) {
lastNode = numActive - 1;
numSteps = numActive - 2;
numValidDests = numActive - 1;
}

/*perhitungan ACO sesuai jumlah semut dan siklus*/
for (var wave = 0; wave < numWaves; ++wave) {
for (var ant = 0; ant < numAnts; ++ant) {
var curr = startNode;
var currDist = 0;
for (var i = 0; i < numActive; ++i) {
visited[i] = false;
}
currPath[0] = curr;
for (var step = 0; step < numSteps; ++step) {
visited[curr] = true;
var cumProb = 0.0;
/* probabiitas semut*/
for (var next = 1; next < numValidDests; ++next)
{
if (!visited[next]) {
prob[next] = Math.pow(pher[curr][next],
alfa) * Math.pow(dur[curr][next], 0.0 - beta);
cumProb += prob[next];
}
}
/*Mengambil bilangan random untuk menentukan kota
yg akan ditempuh selanjutnya*/
var guess = Math.random() * cumProb;
var nextI = -1;
for (var next = 1; next < numValidDests; ++next)
{
if (!visited[next]) {
nextI = next;
Universitas Sumatera Utara
guess -= prob[next];
if (guess < 0) {
nextI = next;
break;
}
}
}
currDist += dur[curr][nextI];
currPath[step+1] = nextI;
curr = nextI;
}
currPath[numSteps+1] = lastNode;
currDist += dur[curr][lastNode];

// k2-rewire:
var lastStep = numActive;
if (mode == 1) {
lastStep = numActive - 1;
}
var changed = true;
var i = 0;
while (changed) {
changed = false;
for (; i < lastStep - 2 && !changed; ++i) {
var cost =
dur[currPath[i+1]][currPath[i+2]];
var revCost =
dur[currPath[i+2]][currPath[i+1]];
var iCost =
dur[currPath[i]][currPath[i+1]];
var tmp, nowCost, newCost;

for (var j = i+2; j < lastStep && !changed;
++j) {
nowCost = cost + iCost +
dur[currPath[j]][currPath[j+1]];
newCost = revCost +
dur[currPath[i]][currPath[j]] + dur[currPath[i+1]][currPath[j+1]];

if (nowCost > newCost) {
currDist += newCost - nowCost;
// Membalikkan ruas jalan terpisah
for (var k = 0; k < Math.floor((j-
i)/2); ++k) {
tmp = currPath[i+1+k];
currPath[i+1+k] = currPath[j-k];
currPath[j-k] = tmp;
}
changed = true;
--i;
}

cost += dur[currPath[j]][currPath[j+1]];
revCost += dur[currPath[j+1]][currPath[j]];
}
}
}

if (currDist < bestTrip) {
bestPath = currPath;
Universitas Sumatera Utara
bestTrip = currDist;
}
/*Local Update And Decay Pheromone*/
for (var i = 0; i <= numSteps; ++i) {
nextPher[currPath[i]][currPath[i+1]] += (bestTrip
- asymptoteFactor * bestTrip) / (numAnts * (currDist -
asymptoteFactor * bestTrip));
}
}

/*Apply global pheromone update */
for (var i = 0; i < numActive; ++i) {
for (var j = 0; j < numActive; ++j) {
pher[i][j] = pher[i][j] * (1.0 - rho) + rho *
nextPher[i][j];
nextPher[i][j] = 0.0;
}
}
}
}


function makeLatLng(latLng) {
return(latLng.toString().substr(1,latLng.toString().length-2));
}

function makeDirWp(latLng, address) {
if (address != null && address != "")
return ({ location: address, stopover: true });
return ({ location: latLng,
stopover: true });
}

function getWayArr(curr) {
var nextAbove = -1;
for (var i = curr + 1; i < waypoints.length; ++i) {
if (wpActive[i]) {
if (nextAbove == -1) {
nextAbove = i;
} else {
wayArr.push(makeDirWp(waypoints[i], addresses[i]));
wayArr.push(makeDirWp(waypoints[curr], addresses[curr]));
}
}
}
if (nextAbove != -1) {
wayArr.push(makeDirWp(waypoints[nextAbove],
addresses[nextAbove]));
getWayArr(nextAbove);
wayArr.push(makeDirWp(waypoints[curr], addresses[curr]));
}
}

function getDistTable(curr, currInd) {
var nextAbove = -1;
var index = currInd;
for (var i = curr + 1; i < waypoints.length; ++i) {
if (wpActive[i]) {
index++;
if (nextAbove == -1) {
Universitas Sumatera Utara
nextAbove = i;
} else {
legs[currInd][index] = legsTmp[distIndex];
dist[currInd][index] = distances[distIndex];
dur[currInd][index] = durations[distIndex++];
legs[index][currInd] = legsTmp[distIndex];
dist[index][currInd] = distances[distIndex];
dur[index][currInd] = durations[distIndex++];
}
}
}
if (nextAbove != -1) {
legs[currInd][currInd+1] = legsTmp[distIndex];
dist[currInd][currInd+1] = distances[distIndex];
dur[currInd][currInd+1] = durations[distIndex++];
getDistTable(nextAbove, currInd+1);
legs[currInd+1][currInd] = legsTmp[distIndex];
dist[currInd+1][currInd] = distances[distIndex];
dur[currInd+1][currInd] = durations[distIndex++];
}
}

// membuat jalur
function directions(mode) {
if (cachedDirections) {
// Bypass Google directions lookup if we already have the
distance and duration matrices.
// Melewati jalur pencarian arah Google jika kita sudah
memiliki matriks jarak dan durasi.
doTsp(mode);
}
wayArr = new Array();
numActive = 0;
numDirectionsComputed = 0;
for (var i = 0; i < waypoints.length; ++i) {
if (wpActive[i]) ++numActive;
}
numDirectionsNeeded = numActive * (numActive - 1);

for (var i = 0; i < waypoints.length; ++i) {
if (wpActive[i]) {
wayArr.push(makeDirWp(waypoints[i], addresses[i]));
getWayArr(i);
break;
}
}

// Roundtrip
if (numActive > maxTspSize) {
alert("Too many locations! You have " + numActive + ", but max
limit is " + maxTspSize);
} else {
legsTmp = new Array();
distances = new Array();
durations = new Array();
chunkNode = 0;
okChunkNode = 0;
if (typeof onProgressCallback == 'function') {
onProgressCallback(tsp);
}
Universitas Sumatera Utara
nextChunk(mode);
}
}

function nextChunk(mode) {
// alert("nextChunk");
chunkNode = okChunkNode;
if (chunkNode < wayArr.length) {
var wayArrChunk = new Array();
for (var i = 0; i < maxSize && i + chunkNode < wayArr.length;
++i) {
wayArrChunk.push(wayArr[chunkNode+i]);
}
var origin;
var destination;
origin = wayArrChunk[0].location;
destination = wayArrChunk[wayArrChunk.length-
1].location;
var wayArrChunk2 = new Array();

for (var i = 1; i < wayArrChunk.length - 1; i++) {
wayArrChunk2[i-1] = wayArrChunk[i];
}

chunkNode += maxSize;
if (chunkNode < wayArr.length-1) {
chunkNode--;
}

var myGebDirections = new google.maps.DirectionsService();

myGebDirections.route({
origin: origin,
destination: destination,
waypoints: wayArrChunk2,
avoidHighways: avoidHighways,
avoidTolls: avoidTolls,
unitSystem: directionunits,
travelMode: travelMode },
function(directionsResult, directionsStatus) {
if (directionsStatus == google.maps.DirectionsStatus.OK) {
requestLimitWait = 1000;
//alert("Request completed!");
// Save legs, distances and durations
fakeDirResult = directionsResult;
for (var i = 0; i < directionsResult.routes[0].legs.length;
++i) {
++numDirectionsComputed;
legsTmp.push(directionsResult.routes[0].legs[i]);

durations.push(directionsResult.routes[0].legs[i].duration.value);

distances.push(directionsResult.routes[0].legs[i].distance.value);
}
if (typeof onProgressCallback == 'function') {
onProgressCallback(tsp);
}
okChunkNode = chunkNode;
nextChunk(mode);
Universitas Sumatera Utara
} else if (directionsStatus ==
google.maps.DirectionsStatus.OVER_QUERY_LIMIT) {
requestLimitWait *= 2;
setTimeout(function(){ nextChunk(mode) },
requestLimitWait);
} else {
var errorMsg = DIR_STATUS_MSG[directionsStatus];
var doNotContinue = true;
alert("Request failed: " + errorMsg);
}
});
} else {
readyTsp(mode);
}
}

function readyTsp(mode) {
//alert("readyTsp");
// Get distances and durations into 2-d arrays:
distIndex = 0;
legs = new Array();
dist = new Array();
dur = new Array();
numActive = 0;
for (var i = 0; i < waypoints.length; ++i) {
if (wpActive[i]) {
legs.push(new Array());
dist.push(new Array());
dur.push(new Array());
addr[numActive] = addresses[i];
numActive++;
}
}
for (var i = 0; i < numActive; ++i) {
legs[i][i] = null;
dist[i][i] = 0;
dur[i][i] = 0;
}
for (var i = 0; i < waypoints.length; ++i) {
if (wpActive[i]) {
getDistTable(i, 0);
break;
}
}

doTsp(mode);
}

function doTsp(mode) {
visited = new Array();
for (var i = 0; i < numActive; ++i) {
visited[i] = false;
}
currPath = new Array();
bestPath = new Array();
nextSet = new Array();
bestTrip = maxTripSentry;
visited[0] = true;
currPath[0] = 0;
cachedDirections = true;
Universitas Sumatera Utara


//hanya menggunakan metode ant colony
AntColony(mode);

prepareSolution();
}

// solusi akhir
function prepareSolution() {
var wpIndices = new Array();
for (var i = 0; i < waypoints.length; ++i) {
if (wpActive[i]) {
wpIndices.push(i);
}
}
var bestPathLatLngStr = "";
var directionsResultLegs = new Array();
var directionsResultRoutes = new Array();
var directionsResultOverview = new Array();
var directionsResultBounds = new
google.maps.LatLngBounds();

for (var i = 1; i < bestPath.length; ++i) {
directionsResultLegs.push(legs[bestPath[i-1]][bestPath[i]]);
}

for (var i = 0; i < bestPath.length; ++i) {
bestPathLatLngStr +=
makeLatLng(waypoints[wpIndices[bestPath[i]]]) + "\n";

directionsResultBounds.extend(waypoints[wpIndices[bestPath[i]]]);

directionsResultOverview.push(waypoints[wpIndices[bestPath[i]]]);
}
directionsResultRoutes.push({
legs: directionsResultLegs,
bounds: directionsResultBounds,
copyrights: "Map data 2013 Google",
overview_path: directionsResultOverview,
warnings: new Array(),
});
gebDirectionsResult = fakeDirResult;
gebDirectionsResult.routes = directionsResultRoutes;

if (onFatalErrorListener)
google.maps.event.removeListener(onFatalErrorListener);
onFatalErrorListener =
google.maps.event.addListener(gebDirectionsService, 'error',
onFatalErrorCallback);

if (typeof onSolveCallback == 'function') {
onSolveCallback(tsp);
}
}

function reverseSolution() {
for (var i = 0; i < bestPath.length / 2; ++i) {
var tmp = bestPath[bestPath.length-1-i];
bestPath[bestPath.length-1-i] = bestPath[i];
Universitas Sumatera Utara
bestPath[i] = tmp;
}
prepareSolution();
}

function reorderSolution(newOrder) {
var newBestPath = new Array(bestPath.length);
for (var i = 0; i < bestPath.length; ++i) {
newBestPath[i] = bestPath[newOrder[i]];
}
bestPath = newBestPath;
prepareSolution();
}

function removeStop(number) {
var newBestPath = new Array(bestPath.length - 1);
for (var i = 0; i < bestPath.length; ++i) {
if (i != number) {
newBestPath[i - (i > number ? 1 : 0)] = bestPath[i];
}
}
bestPath = newBestPath;
prepareSolution();
}

function addWaypoint(latLng, label) {
var freeInd = -1;
for (var i = 0; i < waypoints.length; ++i) {
if (!wpActive[i]) {
freeInd = i;
break;
}
}
if (freeInd == -1) {
if (waypoints.length < maxTspSize) {
waypoints.push(latLng);
labels.push(label);
wpActive.push(true);
freeInd = waypoints.length-1;
} else {
return(-1);
}
} else {
waypoints[freeInd] = latLng;
labels[freeInd] = label;
wpActive[freeInd] = true;
}
return(freeInd);
}

function addAddress(address, label, callback) {
addressProcessing = true;
gebGeocoder.geocode({ address: address }, function(results,
status) {
if (status == google.maps.GeocoderStatus.OK) {
addressProcessing = false;
--addressRequests;
++currQueueNum;
if (results.length >= 1) {
var latLng = results[0].geometry.location;
Universitas Sumatera Utara
var freeInd = addWaypoint(latLng, label);
address = address.replace("'", "");
address = address.replace("\"", "");
addresses[freeInd] = address;
if (typeof callback == 'function')
callback(address, latLng);
}
} else if (status ==
google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
setTimeout(function(){ addAddress(address, label, callback)
}, 100);
} else {
--addressRequests;
alert("Failed to geocode address: " + address + ". Reason: "
+ GEO_STATUS_MSG[status]);
++currQueueNum;
addressProcessing = false;
if (typeof(callback) == 'function')
callback(address);
}
});
}

function swapWaypoints(i, j) {
var tmpAddr = addresses[j];
var tmpWaypoint = waypoints[j];
var tmpActive = wpActive[j];
var tmpLabel = labels[j];
addresses[j] = addresses[i];
addresses[i] = tmpAddr;
waypoints[j] = waypoints[i];
waypoints[i] = tmpWaypoint;
wpActive[j] = wpActive[i];
wpActive[i] = tmpActive;
labels[j] = labels[i];
labels[i] = tmpLabel;
}

BpTspSolver.prototype.startOver = function() {
waypoints = new Array();
addresses = new Array();
labels = new Array();
addr = new Array();
wpActive = new Array();
wayArr = new Array();
legsTmp = new Array();
distances = new Array();
durations = new Array();
legs = new Array();
dist = new Array();
dur = new Array();
visited = new Array();
currPath = new Array();
bestPath = new Array();
bestTrip = new Array();
nextSet = new Array();
travelMode = google.maps.DirectionsTravelMode.DRIVING;
numActive = 0;
chunkNode = 0;
okChunkNode = 0;
Universitas Sumatera Utara
addressRequests = 0;
addressProcessing = false;
requestNum = 0;
currQueueNum = 0;
cachedDirections = false;
onSolveCallback = function(){};
onProgressCallback = null;
doNotContinue = false;
directionunits = google.maps.UnitSystem.METRIC;
GEO_STATUS_MSG[google.maps.GeocoderStatus.OK] = "Success.";
GEO_STATUS_MSG[google.maps.GeocoderStatus.INVALID_REQUEST] =
"Request was invalid.";
GEO_STATUS_MSG[google.maps.GeocoderStatus.ERROR] = "There was a
problem contacting the Google servers.";
GEO_STATUS_MSG[google.maps.GeocoderStatus.OVER_QUERY_LIMIT] =
"The webpage has gone over the requests limit in too short a period
of time.";
GEO_STATUS_MSG[google.maps.GeocoderStatus.REQUEST_DENIED] = "The
webpage is not allowed to use the geocoder.";
GEO_STATUS_MSG[google.maps.GeocoderStatus.UNKNOWN_ERROR] = "A
geocoding request could not be processed due to a server error. The
request may succeed if you try again.";
GEO_STATUS_MSG[google.maps.GeocoderStatus.ZERO_RESULTS] = "No
result was found for this GeocoderRequest.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.INVALID_REQUEST] =
"The DirectionsRequest provided was invalid.";

DIR_STATUS_MSG[google.maps.DirectionsStatus.MAX_WAYPOINTS_EXCEEDED] =
"Too many DirectionsWaypoints were provided in the DirectionsRequest.
The total allowed waypoints is 8, plus the origin and destination.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.NOT_FOUND] = "At
least one of the origin, destination, or waypoints could not be
geocoded.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.OK] = "The response
contains a valid DirectionsResult.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.OVER_QUERY_LIMIT] =
"The webpage has gone over the requests limit in too short a period
of time.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.REQUEST_DENIED] =
"The webpage is not allowed to use the directions service.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.UNKNOWN_ERROR] = "A
directions request could not be processed due to a server error. The
request may succeed if you try again.";
DIR_STATUS_MSG[google.maps.DirectionsStatus.ZERO_RESULTS] = "No
route could be found between the origin and destination.";
}

/* end (edited) OptiMap code */
/* start public interface */

function BpTspSolver(map, panel, onFatalError) {
if (tsp) {
alert('You can only create one BpTspSolver at a time.');
return;
}

gebMap = map;
directionsPanel = panel;
gebGeocoder = new google.maps.Geocoder();
gebDirectionsService = new google.maps.DirectionsService();
Universitas Sumatera Utara
onFatalErrorCallback = onFatalError; // only for fatal errors,
not geocoding errors
tsp = this;
}

BpTspSolver.prototype.addAddressWithLabel = function(address,
label, callback) {
++addressRequests;
++requestNum;
tsp.addAddressAgain(address, label, callback, requestNum - 1);

}

BpTspSolver.prototype.addAddress = function(address, callback) {
tsp.addAddressWithLabel(address, null, callback);
};

BpTspSolver.prototype.addAddressAgain = function(address, label,
callback, queueNum) {
if (addressProcessing || queueNum > currQueueNum) {
setTimeout(function(){ tsp.addAddressAgain(address, label,
callback, queueNum) }, 100);
return;
}
addAddress(address, label, callback);
};

BpTspSolver.prototype.addWaypointWithLabel = function(latLng,
label, callback) {
++requestNum;
tsp.addWaypointAgain(latLng, label, callback, requestNum - 1);
};

BpTspSolver.prototype.addWaypoint = function(latLng, callback) {
tsp.addWaypointWithLabel(latLng, null, callback);
};

BpTspSolver.prototype.addWaypointAgain = function(latLng, label,
callback, queueNum) {
if (addressProcessing || queueNum > currQueueNum) {
setTimeout(function(){ tsp.addWaypointAgain(latLng, label,
callback, queueNum) }, 100);
return;
}
addWaypoint(latLng, label);
++currQueueNum;
if (typeof(callback) == 'function') {
callback(latLng);
}
}

BpTspSolver.prototype.getWaypoints = function() {
var wp = [];
for (var i = 0; i < waypoints.length; i++) {
if (wpActive[i]) {
wp.push(waypoints[i]);
}
}
return wp;
};
Universitas Sumatera Utara

BpTspSolver.prototype.getAddresses = function() {
var addrs = [];
for (var i = 0; i < addresses.length; i++) {
if (wpActive[i])
addrs.push(addresses[i]);
}
return addrs;
};

BpTspSolver.prototype.getLabels = function() {
var labs = [];
for (var i = 0; i < labels.length; i++) {
if (wpActive[i])
labs.push(labels[i]);
}
return labs;
};

BpTspSolver.prototype.removeWaypoint = function(latLng) {
for (var i = 0; i < waypoints.length; ++i) {
if (wpActive[i] && waypoints[i].equals(latLng)) {
wpActive[i] = false;
return true;
}
}
return false;
};

BpTspSolver.prototype.removeAddress = function(addr) {
for (var i = 0; i < addresses.length; ++i) {
if (wpActive[i] && addresses[i] == addr) {
wpActive[i] = false;
return true;
}
}
return false;
};

BpTspSolver.prototype.setAsStop = function(latLng) {
var j = -1;
for (var i = waypoints.length - 1; i >= 0; --i) {
if (j == -1 && wpActive[i]) {
j = i;
}
if (wpActive[i] && waypoints[i].equals(latLng)) {
for (var k = i; k < j; ++k) {
swapWaypoints(k, k + 1);
}
break;
}
}
}

BpTspSolver.prototype.setAsStart = function(latLng) {
var j = -1;
for (var i = 0; i < waypoints.length; ++i) {
if (j == -1 && wpActive[i]) {
j = i;
}
Universitas Sumatera Utara
if (wpActive[i] && waypoints[i].equals(latLng)) {
for (var k = i; k > j; --k) {
swapWaypoints(k, k - 1);
}
break;
}
}
}

BpTspSolver.prototype.getGDirections = function() {
return gebDirectionsResult;
};

BpTspSolver.prototype.getGDirectionsService = function() {
return gebDirectionsService;
};

// Returns the order that the input locations was visited in.
// getOrder()[0] is always the starting location.
// getOrder()[1] gives the first location visited, getOrder()[2]
// gives the second location visited and so on.
BpTspSolver.prototype.getOrder = function() {
return bestPath;
}

// Methods affecting the way driving directions are computed
BpTspSolver.prototype.getAvoidHighways = function() {
return avoidHighways;
}

BpTspSolver.prototype.setAvoidHighways = function(avoid) {
avoidHighways = avoid;
}

BpTspSolver.prototype.getAvoidTolls = function() {
return avoidTolls;
}

BpTspSolver.prototype.setAvoidTolls = function(avoid) {
avoidTolls = avoid;
}

BpTspSolver.prototype.getTravelMode = function() {
return travelMode;
}

BpTspSolver.prototype.setTravelMode = function(travelM) {
travelMode = travelM;
}

BpTspSolver.prototype.getDurations = function() {
return dur;
}

// Helper functions
BpTspSolver.prototype.getTotalDuration = function() {
return gebDirections.getDuration().seconds;
}

// we assume that we have enough waypoints
Universitas Sumatera Utara
BpTspSolver.prototype.isReady = function() {
return addressRequests == 0;
};

BpTspSolver.prototype.solveRoundTrip = function(callback) {
if (doNotContinue) {
alert('Cannot continue after fatal errors.');
return;
}

if (!this.isReady()) {
setTimeout(function(){ tsp.solveRoundTrip(callback) }, 20);
return;
}
if (typeof callback == 'function')
onSolveCallback = callback;

directions(0);
};

// menghitung jarak sekali jalan
BpTspSolver.prototype.solveAtoZ = function(callback) {
if (doNotContinue) {
alert('Cannot continue after fatal errors.');
return;
}

if (!this.isReady()) {
setTimeout(function(){ tsp.solveAtoZ(callback) }, 20);
return;
}

if (typeof callback == 'function')
onSolveCallback = callback;

directions(1);
};

BpTspSolver.prototype.setDirectionUnits = function(mOrKm) {
if (mOrKm == "m") {
directionunits = google.maps.UnitSystem.IMPERIAL;
}
else {
directionunits = google.maps.UnitSystem.METRIC;
}
}

BpTspSolver.prototype.setOnProgressCallback = function(callback) {
onProgressCallback = callback;
}

BpTspSolver.prototype.getNumDirectionsComputed = function () {
return numDirectionsComputed;
}

BpTspSolver.prototype.getNumDirectionsNeeded = function () {
return numDirectionsNeeded;
}

BpTspSolver.prototype.reverseSolution = function () {
Universitas Sumatera Utara
reverseSolution();
}

BpTspSolver.prototype.reorderSolution = function(newOrder,
callback) {
if (typeof callback == 'function')
onSolveCallback = callback;

reorderSolution(newOrder);
}

BpTspSolver.prototype.removeStop = function(number, callback) {
if (typeof callback == 'function')
onSolveCallback = callback;

removeStop(number);
}

window.BpTspSolver = BpTspSolver;

})();

7. Javascript Solver

/*

This should serve as an example on how to use the more
general BpTspSolver.js
from http://code.google.com/p/google-maps-tsp-solver/

Author: Geir K. Engdahl
*/

var tsp; // The BpTspSolver object which handles the TSP
computation.
var mode;
var markers = new Array(); // Need pointers to all markers to
clean up.
var dirRenderer; // Need pointer to path to clean up.

var base_url = "http://localhost/aco/media/iconsnew/";

/* Returns a textual representation of time in the format
* "N days M hrs P min Q sec". Does not include days if
* 0 days etc. Does not include seconds if time is more than
* 1 hour.
*/
function formatTime(seconds) {
var days;
var hours;
var minutes;
days = parseInt(seconds / (24*3600));
seconds -= days * 24 * 3600;
hours = parseInt(seconds / 3600);
seconds -= hours * 3600;
minutes = parseInt(seconds / 60);
seconds -= minutes * 60;
var ret = "";
if (days > 0)
ret += days + " hari ";
Universitas Sumatera Utara
if (days > 0 || hours > 0)
ret += hours + " jam ";
if (days > 0 || hours > 0 || minutes > 0)
ret += minutes + " menit ";
if (days == 0 && hours == 0)
ret += seconds + " detik";
return(ret);
}

/* Returns textual representation of distance in the format
* "N km M m". Does not include km if less than 1 km. Does not
* include meters if km >= 10.
*/
function formatLength(meters) {
var km = parseInt(meters / 1000);
meters -= km * 1000;
var ret = "";
if (km > 0)
ret += km + " km ";
if (km < 10)
ret += meters + " m";
return(ret);
}

/* Returns textual representation of distance in the format
* "N.M miles".
*/
function formatLengthMiles(meters) {
var sMeters = meters * 0.621371192;
var miles = parseInt(sMeters / 1000);
var commaMiles = parseInt((sMeters - miles * 1000 + 50) /
100);
var ret = miles + "." + commaMiles + " miles";
return(ret);
}

/* Returns two HTML strings representing the driving
directions.
* Icons match the ones shown in the map. Addresses are used
* as headers where available.
* First string is suitable for use in reordering the
directions.
* Second string is suitable for printed directions.
*/
function formatDirections(gdir, mode) {
var addr = tsp.getAddresses();
var labels = tsp.getLabels();
var order = tsp.getOrder();
var retStr = "<table class='gebddir' border=0 cell-
spacing=0>\n";
var dragStr = "tarik untuk merubah urutan:<br><ul
class='unsortable'>";
var retArr = new Array();

for (var i = 0; i < gdir.legs.length; ++i) {
var route = gdir.legs[i];
var colour = "g";
var number = i+1;

//untuk menampilkan list perjalanan pada panel
Universitas Sumatera Utara
retStr += "\t<tr class='heading'><td
class='heading' width=40>"
+ "<div class='centered-directions'><img
src='"+base_url+"black"
+ number + ".png'></div></td>"
+ "<td class='heading'><div class='centered-
directions'>";


//untuk tampilan pada menu kiri
var headerStr;
if (labels[order[i]] != null && labels[order[i]] !=
"") {
headerStr = labels[order[i]];
} else if (addr[order[i]] != null) {
headerStr = addr[order[i]];
} else {
var prevI = (i == 0) ? gdir.legs.length - 1
: i-1;
var latLng = gdir.legs[prevI].end_location;
headerStr =
gdir.legs[i].start_location.toString();
}
//menampilkan pada menu kiri
dragStr += "<li id='" + i + "' class='ui-state-"
+ (i ? "default" : "disabled") + "'>"
+ "<table class='dragTable'><tr><td
class='left'><img src='"+base_url+"black"
+ number + ".png' /></td><td class='middle'>" +
headerStr + "</td><td class='right'>"
+ (i ? "<button id='dragClose" + i + "' value='"
+ i + "'></button>" : "")
+ "</td></tr></table></li>";

if (i == 0) {
dragStr += "</ul><ul id='sortable'>";
}

retStr += headerStr + "</div></td></tr>\n";

for (var j = 0; j < route.steps.length; ++j) {
var classStr = "odd";
if (j % 2 == 0) classStr = "even";

retStr += "\t<tr class='text'><td class='" +
classStr + "'></td>"
+ "<td class='" + classStr + "'>"
+ route.steps[j].instructions + "<div
class='left-shift'>"
+ route.steps[j].distance.text +
"</div></td></tr>\n";
}
}

dragStr += "</ul><ul class='unsortable'>";

/*jika menggunakan pulang pergi */
if (mode == 0) {
var headerStr;
Universitas Sumatera Utara
if (labels[order[0]] != null && labels[order[0]] !=
"") {
headerStr = labels[order[0]];
} else if (addr[order[0]] != null) {
headerStr = addr[order[0]];
} else {
var prevI = gdir.legs.length - 1;
var latLng = gdir.legs[prevI].end_location;
headerStr = latLng.toString();
}

dragStr += "<li id='" + 0 + "' class='ui-state-
disabled'>"
+ "<table class='dragTable'><tr><td><img
src='"+base_url+"black"
+ 1 + ".png' /></td><td>" + headerStr
+ "</td></tr></table></li>";

retStr += "\t<tr class='heading'><td
class='heading'>"
+ "<div class='centered-directions'><img
src='"+base_url+"black1.png'></div></td>"
+ "<td class='heading'>"
+ "<div class='centered-directions'>"
+ headerStr + "</div></td></tr>\n";

/* untuk sekali jalan */
}else if (mode == 1) {
var headerStr;
if (labels[order[gdir.legs.length]] != null &&
labels[order[gdir.legs.length]] != "") {
headerStr = labels[order[gdir.legs.length]];
} else if (addr[order[gdir.legs.length]] == null) {
var latLng = gdir.legs[gdir.legs.length -
1].end_location;
headerStr = latLng.toString();
} else {
headerStr = addr[order[gdir.legs.length]];
}

dragStr += "<li id='" + gdir.legs.length + "'
class='ui-state-disabled'>"
+ "<table class='dragTable'><tr><td><img
src='"+base_url+"black"
+ (gdir.legs.length + 1) + ".png' /></td><td>"
+ headerStr + "</td></tr></table></li>";
retStr += "\t<tr class='heading'><td
class='heading'>"
+ "<div class='centered-directions'><img
src='"+base_url+"black"
+ (gdir.legs.length + 1) +
".png'></div></td>"
+ "<td class='heading'>"
+ "<div class='centered-directions'>"
+ headerStr + "</div></td></tr>\n";
}

dragStr += "</ul>";
retStr += "</table>";
retArr[0] = dragStr;
Universitas Sumatera Utara
retArr[1] = retStr;
return(retArr);
}

function createTomTomLink(gdir) {
var addr = tsp.getAddresses();
var labels = tsp.getLabels();
var order = tsp.getOrder();
var addr2 = new Array();
var label2 = new Array();
for (var i = 0; i < order.length; ++i) {
addr2[i] = addr[order[i]];
if (order[i] < labels.length && labels[order[i]] != null
&& labels[order[i]] != "")
label2[i] = labels[order[i]];
}
var itn = createTomTomItineraryItn(gdir, addr2, label2);
var retStr = "<form method='GET' action='tomtom.php'
target='tomTomIFrame'>\n";
retStr += "<input type='hidden' name='itn' value='" + itn +
"' />\n";
retStr += "<input id='tomTomButton' class='calcButton'
type='submit' value='Send to TomTom'
onClick='jQuery(\"#dialogTomTom\").dialog(\"open\");'/>\n";
retStr += "</form>\n";
return retStr;
}

function createGarminLink(gdir) {
var addr = tsp.getAddresses();
var labels = tsp.getLabels();
var order = tsp.getOrder();
var addr2 = new Array();
var label2 = new Array();
for (var i = 0; i < order.length; ++i) {
addr2[i] = addr[order[i]];
if (order[i] < labels.length && labels[order[i]] != null
&& labels[order[i]] != "")
label2[i] = labels[order[i]];
}
var gpx = createGarminGpx(gdir, addr2, label2);
var gpxWp = createGarminGpxWaypoints(gdir, addr2, label2);
var retStr = "<form method='POST' action='garmin.php'
target='garminIFrame'>\n";
retStr += "<input type='hidden' name='gpx' value='" + gpx +
"' />\n";
retStr += "<input type='hidden' name='gpxWp' value='" +
gpxWp + "' />\n";
retStr += "<input id='garminButton' class='calcButton'
type='submit' value='Send to Garmin'
onClick='jQuery(\"#dialogGarmin\").dialog(\"open\");'/>\n";
retStr += "</form>\n";
return retStr;
}

function createGoogleLink(gdir) {
var addr = tsp.getAddresses();
var order = tsp.getOrder();
var ret = "http://maps.google.com/maps?saddr=";
for (var i = 0; i < order.length; ++i) {
Universitas Sumatera Utara
if (i == 1) {
ret += "&daddr=";
} else if (i >= 2) {
ret += " to:";
}
if (addr[order[i]] != null && addr[order[i]] != "") {
ret += escape(addr[order[i]]);
} else {
if (i == 0) {
ret += gdir.legs[0].start_location.toString();
} else {
ret += gdir.legs[i-1].end_location.toString();
}
}
}
return ret;
}

function getWindowHeight() {
if (typeof(window.innerHeight) == 'number')
return window.innerHeight;
if (document.documentElement &&
document.documentElement.clientHeight)
return document.documentElement.clientHeight;
if (document.body && document.body.clientHeight)
return document.body.clientHeight;
return 800;
}

function getWindowWidth() {
if (typeof(window.innerWidth) == 'number')
return window.innerWidth;
if (document.documentElement &&
document.documentElement.clientWidth)
return document.documentElement.clientWidth;
if (document.body && document.body.clientWidth)
return document.body.clientWidth;
return 1200;
}

function onProgressCallback(tsp) {

jQuery('#progressBar').progressbar('value', 100 *
tsp.getNumDirectionsComputed() / tsp.getNumDirectionsNeeded());

}

function setMarkerAsStart(marker) {
marker.infoWindow.close();
tsp.setAsStart(marker.getPosition());
drawMarkers(false);
}

function setMarkerAsStop(marker) {
marker.infoWindow.close();
tsp.setAsStop(marker.getPosition());
drawMarkers(false);
}

function removeMarker(marker) {
Universitas Sumatera Utara
marker.infoWindow.close();
tsp.removeWaypoint(marker.getPosition());
drawMarkers(false);
}

function drawMarker(latlng, addr, label, num) {
var icon;
icon = new google.maps.MarkerImage(""+base_url+"red" + (num
+ 1) + ".png");
var marker = new google.maps.Marker({
position: latlng,
icon: icon,
title:"Mobile "+(num + 1),
map: gebMap });


google.maps.event.addListener(marker, 'click',
function(event) {
var addrStr = (addr == null) ? "" : addr + "<br>";
var labelStr = (label == null) ? "" : "<b>" + label
+ "</b><br>";
var markerInd = -1;
for (var i = 0; i < markers.length; ++i) {
if (markers[i] != null &&
marker.getPosition().equals(markers[i].getPosition())) {
markerInd = i;
break;
}
}
var infoWindow = new google.maps.InfoWindow({
content: labelStr + addrStr
+ "<a
href='javascript:setMarkerAsStart(markers["
+ markerInd + "]"
+ ")'>"
+ "Set sebagai lokasi awal"
+ "</a><br>"
+ "<a
href='javascript:setMarkerAsStop(markers["
+ markerInd + "])'>"
+ "Set sebagai lokasi akhir"
+ "</a><br>"
+ "<a href='javascript:removeMarker(markers["
+ markerInd + "])'>"
+ "Hapus lokasi</a>",
position: marker.getPosition() });
marker.infoWindow = infoWindow;
infoWindow.open(gebMap);
// tsp.removeWaypoint(marker.getPosition());
// marker.setMap(null);
});
markers.push(marker);
}

function setViewportToCover(waypoints) {
var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < waypoints.length; ++i) {
bounds.extend(waypoints[i]);
}
gebMap.fitBounds(bounds);
Universitas Sumatera Utara
}

function initMap(center, zoom, div) {
var myOptions = {
zoom: zoom,
center: center,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
gebMap = new google.maps.Map(div, myOptions);
google.maps.event.addListener(gebMap, "click",
function(event) {
tsp.addWaypoint(event.latLng,
addWaypointSuccessCallback);
});
}

function addWaypointWithLabel(latLng, label) {
tsp.addWaypointWithLabel(latLng, label,
addWaypointSuccessCallbackZoom);
}

function addWaypoint(latLng) {
addWaypointWithLabel(latLng, null,
addWaypointSuccessCallbackZoom);
}

function addAddressAndLabel(addr, label) {
tsp.addAddressWithLabel(addr, label,
addAddressSuccessCallbackZoom);
//alert (addr);
}

function addAddress(addr) {
addAddressAndLabel(addr, null);
//alert (addr);
}

function clickedAddAddress() {
addAddress(document.address.addressStr.value);
}

function addAddressSuccessCallback(address, latlng) {
if (latlng) {
drawMarkers(false);
} else {
alert('Gagal Menemukan Lokasi : ' + address);
}
}

function addAddressSuccessCallbackZoom(address, latlng) {
if (latlng) {
drawMarkers(true);
} else {
alert('Gagal Menemukan Lokasi: ' + address);
}
}

function addWaypointSuccessCallback(latlng) {
if (latlng) {
drawMarkers(false);
Universitas Sumatera Utara
}
}

function addWaypointSuccessCallbackZoom(latlng) {
if (latlng) {
drawMarkers(true);
}
}

function drawMarkers(updateViewport) {
removeOldMarkers();
var waypoints = tsp.getWaypoints();
var addresses = tsp.getAddresses();
var labels = tsp.getLabels();
for (var i = 0; i < waypoints.length; ++i) {
drawMarker(waypoints[i], addresses[i], labels[i],
i);
}
if (updateViewport) {
setViewportToCover(waypoints);
}
}

function startOver() {
document.getElementById("my_textual_div").innerHTML = "";
document.getElementById("path").innerHTML = "";
var center = gebMap.getCenter();
var zoom = gebMap.getZoom();
var mapDiv = gebMap.getDiv();
initMap(center, zoom, mapDiv);
tsp.startOver(); // doesn't clearOverlays or clear the
directionsPanel
}

function TrackMobile() {
drawMarkers(true);
}

function RefreshPage() {
javascript:location.reload(true);
}

function testJS() {
alert ('javaScript berfungsi dengan baik ...');
}


function popup(url, name, width, height)
{
settings=
"toolbar=yes,location=yes,directories=yes,"+
"status=no,menubar=no,scrollbars=yes,"+
"resizable=yes,width="+width+",height="+height;

MyNewWindow=window.open(url,name,settings);
}

function directions(m, walking, bicycling, avoidHighways,
avoidTolls) {
jQuery('#dialogProgress').dialog('open');
Universitas Sumatera Utara
mode = m;

tsp.setAvoidHighways(avoidHighways);
tsp.setAvoidTolls(avoidTolls);

if (walking){

tsp.setTravelMode(google.maps.DirectionsTravelMode.WALKIN
G);
}else if (bicycling){

tsp.setTravelMode(google.maps.DirectionsTravelMode.BICYCL
ING);
}else{

tsp.setTravelMode(google.maps.DirectionsTravelMode.DRIVIN
G);
tsp.setOnProgressCallback(onProgressCallback);
}

if (m == 0){
tsp.solveRoundTrip(onSolveCallback);
}else{
tsp.solveAtoZ(onSolveCallback);
}
}


function getTotalDuration(dir) {
var sum = 0;
for (var i = 0; i < dir.legs.length; i++) {
sum += dir.legs[i].duration.value;
}
return sum;
}

function getTotalDistance(dir) {
var sum = 0;
for (var i = 0; i < dir.legs.length; i++) {
sum += dir.legs[i].distance.value;
}
return sum;
}

function removeOldMarkers() {
for (var i = 0; i < markers.length; ++i) {
markers[i].setMap(null);
}
markers = new Array();
}

function onSolveCallback(myTsp) {
jQuery('#dialogProgress').dialog('close');
//alert ('solve');
var dirRes = tsp.getGDirections();
var dir = dirRes.routes[0];
// Print shortest roundtrip data:

var pathStr = "<p>Lama Perjalanan : " +
formatTime(getTotalDuration(dir)) + "<br>";
Universitas Sumatera Utara
pathStr += "Panjang Perjalanan : " +
formatLength(getTotalDistance(dir)) +
" (" + formatLengthMiles(getTotalDistance(dir)) +
")</p>";
document.getElementById("path").innerHTML = pathStr;
document.getElementById("exportDataButton").innerHTML =
"<input id='rawButton' class='calcButton' type='button'
value='Data Koordinat' onClick='toggle(\"exportData\");
document.getElementById(\"outputList\").select();'>";
var durStr = "<input id='csvButton' class='calcButton'
type='button' value='Durasi dalam Matrix'
onClick='toggle(\"durationsData\");'>";
document.getElementById("durations").innerHTML = durStr;
document.getElementById("exportLabelButton").innerHTML =
"<input id='rawLabelButton' class='calcButton' type='button'
value='Koordinat dengan Label'
onClick='toggle(\"exportLabelData\");
document.getElementById(\"outputLabelList\").select();'>"
document.getElementById("exportAddrButton").innerHTML =
"<input id='rawAddrButton' class='calcButton' type='button'
value='Urutan Alamat Optimal'
onClick='toggle(\"exportAddrData\");
document.getElementById(\"outputAddrList\").select();'>"
document.getElementById("exportOrderButton").innerHTML =
"<input id='rawOrderButton' class='calcButton' type='button'
value='Urutan label Optimal'
onClick='toggle(\"exportOrderData\");
document.getElementById(\"outputOrderList\").select();'>"

var formattedDirections
= formatDirections(dir, mode);
document.getElementById("routeDrag").innerHTML =
formattedDirections[0]; /*untuk menampilkan list perjalanan */
document.getElementById("my_textual_div").innerHTML =
formattedDirections[1]; /* untuk menampilkan panel perjalanan
*/
document.getElementById("reverseRoute").innerHTML =
"<input id='reverseButton' value='Reverse' type='button'
class='calcButton' onClick='reverseRoute()' />";

jQuery('#reverseButton').button();
jQuery('#rawButton').button();
jQuery('#rawLabelButton').button();
jQuery('#csvButton').button();
jQuery('#googleButton').button();
jQuery('#tomTomButton').button();
jQuery('#garminButton').button();
jQuery('#rawAddrButton').button();
jQuery('#rawOrderButton').button();

jQuery("#sortable").sortable({ stop: function(event, ui) {
var perm = jQuery("#sortable").sortable("toArray");
var numPerm = new Array(perm.length + 2);
numPerm[0] = 0;
for (var i = 0; i < perm.length; i++) {
numPerm[i + 1] = parseInt(perm[i]);
}
numPerm[numPerm.length - 1] = numPerm.length - 1;
tsp.reorderSolution(numPerm, onSolveCallback);
} });
Universitas Sumatera Utara

jQuery("#sortable").disableSelection();
for (var i = 1; i < dir.legs.length; ++i) {
var finalI = i;
jQuery("#dragClose" + i).button({
icons: { primary: "ui-icon-close" },
text: false
}).click(function() {
tsp.removeStop(parseInt(this.value), null);
});
}
removeOldMarkers();

// Add nice, numbered icons.
if (mode == 1) {
var myPt1 = dir.legs[0].start_location;
var myIcn1 = new
google.maps.MarkerImage(""+base_url+"black1.png");
var marker = new google.maps.Marker({
position: myPt1,
icon: myIcn1,
map: gebMap });
markers.push(marker);
}

for (var i = 0; i < dir.legs.length; ++i) {
var route = dir.legs[i];
var myPt1 = route.end_location;
var myIcn1;
if (i == dir.legs.length - 1 && mode == 0) {
myIcn1 = new
google.maps.MarkerImage(""+base_url+"black1.png");
} else {
myIcn1 = new
google.maps.MarkerImage(""+base_url+"black" + (i+2) + ".png");
}
var marker = new google.maps.Marker({
position: myPt1,
icon: myIcn1,
map: gebMap });
markers.push(marker);
}
// Clean up old path.
if (dirRenderer != null) {
dirRenderer.setMap(null);
}

dirRenderer = new google.maps.DirectionsRenderer({
directions: dirRes,
hideRouteList: true,
map: gebMap,
panel: null,
preserveViewport: false,
suppressInfoWindows: true,
suppressMarkers: true
});

// Raw path output
var bestPathLatLngStr =
dir.legs[0].start_location.toString() + "\n";
Universitas Sumatera Utara
for (var i = 0; i < dir.legs.length; ++i) {
bestPathLatLngStr +=
dir.legs[i].end_location.toString() + "\n";
}

document.getElementById("exportData_hidden").innerHTML =
"<textarea id='outputList' rows='10' cols='40'>"
+ bestPathLatLngStr + "</textarea><br>";

// Raw path output with labels
var labels = tsp.getLabels();
var order = tsp.getOrder();
var bestPathLabelStr = "";
if (labels[order[0]] == null) {
bestPathLabelStr += order[0];
} else {
bestPathLabelStr += labels[order[0]];
}
bestPathLabelStr += ": " +
dir.legs[0].start_location.toString() + "\n";
for (var i = 0; i < dir.legs.length; ++i) {
if (labels[order[i+1]] == null) {
bestPathLabelStr += order[i+1];
} else {
bestPathLabelStr += labels[order[i+1]];
}
bestPathLabelStr += ": " +
dir.legs[i].end_location.toString() + "\n";
}
document.getElementById("exportLabelData_hidden").innerHTML
=
"<textarea id='outputLabelList' rows='10' cols='40'>"
+ bestPathLabelStr + "</textarea><br>";

// Optimal address order
var addrs = tsp.getAddresses();
var order = tsp.getOrder();
var bestPathAddrStr = "";
if (addrs[order[0]] == null) {
bestPathAddrStr += dir.legs[0].start_location.toString();
} else {
bestPathAddrStr += addrs[order[0]];
}
bestPathAddrStr += "\n";
for (var i = 0; i < dir.legs.length; ++i) {
if (addrs[order[i+1]] == null) {
bestPathAddrStr += dir.legs[i].end_location.toString();
} else {
bestPathAddrStr += addrs[order[i+1]];
}
bestPathAddrStr += "\n";
}
document.getElementById("exportAddrData_hidden").innerHTML
=
"<textarea id='outputAddrList' rows='10' cols='40'>"
+ bestPathAddrStr + "</textarea><br>";

// Optimal numeric order
var bestOrderStr = "";
for (var i = 0; i < order.length; ++i) {
Universitas Sumatera Utara
bestOrderStr += "" + (order[i] + 1) + "\n";
}
document.getElementById("exportOrderData_hidden").innerHTML
=
"<textarea id='outputOrderList' rows='10' cols='40'>"
+ bestOrderStr + "</textarea><br>";

/* mengubah ke matrix*/
var durationsMatrixStr = "";
var dur = tsp.getDurations();
for (var i = 0; i < dur.length; ++i) {
for (var j = 0; j < dur[i].length; ++j) {
durationsMatrixStr += dur[i][j];
if (j == dur[i].length - 1) {
durationsMatrixStr += "\n";
} else {
durationsMatrixStr += ", ";
}
}
}
document.getElementById("durationsData_hidden").innerHTML =
"<textarea name='csvDurationsMatrix' rows='10'
cols='40'>"
+ durationsMatrixStr + "</textarea><br>";


var hitung = tsp.getNumDirectionsComputed();
document.getElementById("HitungData_hidden").innerHTML =
formatTime(hitung);
}

function clickedAddList() {
var val = document.listOfLocations.inputList.value;
val = val.replace(/\t/g, ' ');
document.listOfLocations.inputList.value = val;
addList(val);
}

function addList(listStr) {
var listArray = listStr.split("\n");
for (var i = 0; i < listArray.length; ++i) {
var listLine = listArray[i];
if (listLine.match(/\(?\s*\-?\d+\s*,\s*\-?\d+/) ||
listLine.match(/\(?\s*\-?\d+\s*,\s*\-?\d*\.\d+/) ||
listLine.match(/\(?\s*\-?\d*\.\d+\s*,\s*\-?\d+/) ||
listLine.match(/\(?\s*\-?\d*\.\d+\s*,\s*\-
?\d*\.\d+/)) {
// Line looks like lat, lng.
var cleanStr = listLine.replace(/[^\d.,-]/g, "");
var latLngArr = cleanStr.split(",");
if (latLngArr.length == 2) {
var lat = parseFloat(latLngArr[0]);
var lng = parseFloat(latLngArr[1]);
var latLng = new google.maps.LatLng(lat, lng);
tsp.addWaypoint(latLng,
addWaypointSuccessCallbackZoom);
}
} else if (listLine.match(/\(?\-?\d*\.\d+\s+\-
?\d*\.\d+/)) {
// Line looks like lat lng
Universitas Sumatera Utara
var latLngArr = listline.split(" ");
if (latLngArr.length == 2) {
var lat = parseFloat(latLngArr[0]);
var lng = parseFloat(latLngArr[1]);
var latLng = new google.maps.LatLng(lat, lng);
tsp.addWaypoint(latLng,
addWaypointSuccessCallbackZoom);
}
} else if (listLine.match(/\S+/)) {
// Non-empty line that does not look like lat, lng.
Interpret as address.
tsp.addAddress(listLine,
addAddressSuccessCallbackZoom);
}
}
}

function reverseRoute() {
tsp.reverseSolution();
}


8. Database Model
<?php
class M_mobile extends CI_Model {
/**
* Constructor
*/
function __construct(){
parent::__construct();
}

/* Inisialisasi nama tabel yang digunakan */
var $table = 'tb_client';

function all_track()
{
$this->db->select('*');
$this->db->from('tb_client');
$this->db->where('aktif','Y');
return $this->db->get();
}

function data_client()
{
$this->db->select('*');
$this->db->from('tb_client');
return $this->db->get();
}

function get_track()
{
$this->db->select('*');
$this->db->from('tb_client');
$this->db->limit(1);
$this->db->where('id_client ',$this->session-
>userdata('id_client'));
return $this->db->get();
}
Universitas Sumatera Utara

/**
* Menghapus sebuah data kiba
*/
function hapus($id_client)
{
$this->db->delete('tb_client', array('id_client' =>
$id_client));
}

/**
* Tampilkan latitude
*/
function get_LatLong($id)
{

$this->db->select('*');
$this->db->from('tb_client');
$this->db->limit(1);
$this->db->where('id_client ',$this->session-
>userdata('id_client'));
return $this->db->get();
}

/**
* Menambah data
*/
function track_lokasi($long)
{
$this->db->insert('tb_track', $long);
return TRUE;
}

/**
* Menambah data client
*/
function tambah_client($profile)
{
$this->db->insert('tb_client', $profile);
return TRUE;
}

/**
* Update data lokasi
*/
function update_lokasi($id_client,$lat,$long)
{
$data = array('lat' => $lat, 'long' => $long);
$this->db->where('id_client', $id_client);
$this->db->update('tb_client', $data);

return TRUE;
}

/**
* Update data profile
*/
function update_profile($id_client,$profile)
{
$this->db->where('id_client', $id_client);
Universitas Sumatera Utara
$this->db->update('tb_client', $profile);

return TRUE;
}

/**
* Mendapatkan data sebuah kiba
*/
function get_client_by_id($id)
{
return $this->db->get_where('tb_client',
array('id_client' => $id), 1);
}

/**
* Validasi lokasi
*/
function valid_lokasi($session_login)
{
$query = $this->db->get_where('tb_track',
array('session_login' => $session_login));

return $query;
}


}
Universitas Sumatera Utara
B-1

CURRICULUM VITAE



Nama : DONNY SANJAYA
Alamat Sekarang : JALAN MERPATI NO 8 A, KEC. MEDAN SUNGGAL
KOTA MEDAN
Alamat Orang Tua : JALAN SERITI NO 89 KEL. GAMBIR BARU,
KEC. KISARAN TIMUR KAB. ASAHAN
Telp/ HP : 085261180060
Email : donie_sanjaya@live.com

Riwayat Pendidikan:
1997 2002 SEKOLAH DASAR (SD) NEGERI 010096 GAMBIR BARU KISARAN
2002 2005 SEKOLAH MENENGAH PERTAMA (SMP) NEGERI 1 KISARAN
2005 2008 SEKOLAH MENENGAH ATAS (SMA) NEGERI 1 KISARAN
2008 2011 D-III TEKNIK INFORMATIKA UNIVERSITAS SUMATERA UTARA

Keahlian/kursus yang diikuti:
Keahlian Bahasa Pemrograman:
- Berbasis Web: PHP Native dan Framework, HTML & CSS, JavaScript & Jquery
- Berbasis Windows: Visual Basic
- Database: MSSQL & MySQL
Kursus:
- Pemrograman, LBBTI
Universitas Sumatera Utara