Upload
yeahrightskripsi
View
460
Download
7
Embed Size (px)
DESCRIPTION
DONNY SANJAYA
Citation preview
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.
���� = �0 1 0 11 0 1 10 1 0 11 1 1 0
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)
= {v 1,v2, … vp} dan A (G) = [aij], 1 ≤ i, j ≤ p adalah matriks keterhubungan dari G,
maka
deg (vi) = ∑ � �����
Hal yang sama juga berlaku jika menghitung derajat titik melalui kolom, yaitu
deg (vi) = ∑ �� ����
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.
����, �� = � ����,����.����,��� ∑ ����,!���.����,!�� "#$%�&� 0 '()� � * '���� (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]
� = +max/�0��, 1��. �2��, 1��345 '()� 6 ≤ 68 (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]
0��, �� ← �1 − ;�. 0��, �� + ;. ∆0��, �� (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]
0��, �� ← �1 − >�. 0��, �� + >. ∆0��, �� (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).
? = �@A��sin�E�� . sin�EF� + cos�EF�� . cos�EF� . cos�IF − I�� . J……()
Universitas Sumatera Utara
18
Dimana :
D : Jarak antar dua titik (km) E� : Posisi titik i(1,2,…n) pada garis lintang dalam derajat I� : Posisi titik i(1,2,…n) pada garis bujur dalam derajat J : 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(5)
Lat : (3)
Long :
Map(2)
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.
Map(16)
Tujuan(1)
Text box(2) add(3)
Pilih jalur(4)
Walking (Jalan kaki) (5)
Bicycling (Naik sepeda)
Avoid highways (Hindari jalan raya)
Avoid toll roads (Hindari jalan tol)
Eksport(6)
Edit Route(7)
Mobile Tracking(8)
Tracking Mobile(9)
Hitung Perjalanan TSP
Hitung Perjalanan A - Z
Data Client(10)
Ulangi lagi(11)
Refresh Halaman(12)
Pengujian javascript(13)
About(14)
Logout(15)
Lama perjalanan dan panjang perjalanan(17)
Jalan yang dilalui(18)
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 box(2) add(3)
Pilih jalur(4)
Walking (Jalan kaki) (5)
Bicycling (Naik sepeda)
Avoid highways (Hindari jalan raya)
Avoid toll roads (Hindari jalan tol)
Eksport(6)
Edit Route(7)
Mobile Tracking(8)
Tracking Mobile(9)
Hitung Perjalanan TSP
Hitung Perjalanan A - Z
Data Client(10)
Ulangi lagi(11)
Refresh Halaman(12)
Pengujian javascript(13)
About(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
� = ����(sin(� � . sin(��� + cos(�� � . cos(��� . cos(�� − � � . � 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
� = ����(sin(� � . sin(��� + cos(� � . cos(��� . cos(�� − � � . � 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.
Parameter–parameter 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
��(�, �� = � ��(�, ����. �η(�, ���!∑ ��(�, #���. �η(�, #��!$%&'((� 0
Σ[τ(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,3 )= �,-./ . 0 =
,.�=0,088
τ (1,3) ← (1−0,50 ).(0,01)+(0,088)
τ (1,3) ← 0,093
Menghitung probabilitas dari titik 3 ke titik berikutnya:
��(�, �� = � ��(�, ����. �η(�, ���!∑ ��(�, #���. �η(�, #��!$%&'((� 0
Σ[τ(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 )= *++.,
Δτ (3,2 )= ,.- . 0 =
1,1�0=0,1810
τ (3,2) ← (1−0,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 )= *++.,
Δτ (2,4 )= �,/1� . 0 =
-,�/-=0,1218
τ (2,4) ← (1−0,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
��(�, �� = � ��(�, ����. �η(�, ���!∑ ��(�, #���. �η(�, #��!$%&'((� 0
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,2 )= �,. - . 0 =
2,�3�=0,1078
τ (1,2) ← (1−0,50 ).(0,01)+(0,1078)
τ (1,2) ← 0,1128
Menghitung probabilitas dari titik 2 ke titik berikutnya:
��(�, �� = � ��(�, ����. �η(�, ���!∑ ��(�, #���. �η(�, #��!$%&'((� 0
Σ[τ(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 )= *++.,
Δτ (2,3 )= , .- . 0 =
0,11�0=0,21966
τ (2,3) ← (1−0,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 )= *++.,
Δτ (3,4 )= ,/�3 . 0 =
0, /-=0,2434
τ (3,4) ← (1−0,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
��(�, �� = � ��(�, ����. �η(�, ���!∑ ��(�, #���. �η(�, #��!$%&'((� 0
Σ[τ(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,3 )= �,-./ . 0 =
,.�=0,088
τ (1,3) ← (1−0,50 ).(0,01)+(0,088)
τ (1,3) ← 0,093
Menghitung probabilitas dari titik 3 ke titik berikutnya:
��(�, �� = � ��(�, ����. �η(�, ���!∑ ��(�, #���. �η(�, #��!$%&'((� 0
Σ[τ(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 )= *++.,
Δτ (3,2 )= ,.- . 0 =
1,1�0=0,1810
τ (3,2) ← (1−0,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 )= *++.,
Universitas Sumatera Utara
48
Δτ (2,4 )= �,/1� . 0 =
-,�/-=0,1218
τ (2,4) ← (1−0,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 )= 4 5678 9:;< (=, >� ∈ ��#=@ =@�A<:;0
Melakukan pembaruan global untuk rute terbaik pada siklus I:
Rute terbaik adalah 1 2 3 4 dengan panjang 567 = 4,726 FG, sehingga diperoleh
Δτ ( t,v )= 0,3�H = 0,2116
τ (t,v)←(1−α ).τ (t,v) +α.Δτ (t,v)
τ (1,2)←(1−0,1 ).( 0,1128) +(0,1).( 0,2116)
τ (1,2)←0,12268
τ (2,3)←(1−0,1 ).( 0,2247) +(0,1).( 0,2116)
τ (2,3)← 0,22339
τ (3,4)←(1−0,1 ).( 0,248) +(0,1).( 0,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=AIzaSyCeCAhmBV1aJRpEyTpQzwZV-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.png' 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.WALKING); }else if (bicycling){ tsp.setTravelMode(google.maps.DirectionsTravelMode.BICYCLING); }else{ tsp.setTravelMode(google.maps.DirectionsTravelMode.DRIVING); 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 : [email protected]
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