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
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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:
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
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
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:
{ 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
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(); }
[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).
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 }?>
} $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;
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();
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;
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>";
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,