1
2
3
1211500952
1211501885
1211502750
Triana Nopitasari
Ivanny Silviana Santoso
Zolandia Ramanda
ii
ABSTRAKSI
Mayoritas masyarakat zaman sekarang mempunyai waktu luang yang sangat terbatas
untuk melakukan liburan seperti berkeliling tempat-tempat wisata di Jakarta. Belum lagi
minimnya informasi mengenai harga, rating dan waktu yang harus ditempuh untuk menuju ke
tempat wisatanya. Dengan waktu yang luang yang terbatas masyarakat ingin melakukan
hiburan ke banyak tempat dan dengan biaya seminimal mungkin agar mereka bisa
menggunakan waktu mereka dengan sebaik baiknya. Dengan permasalahan tersebut maka
masyarakat membutuhkan solusi untuk mengoptimalkan waktu luang mereka menjadi lebih
efisien dengan biaya yang seminimal mungkin.
Pada penelitian ini dirancang suatu sistem dan program yang dapat melakukan
Rekomendasi Tempat Wisata yang baik menggunakan Algoritma Genetika. Pada Algoritma
Genetika dilakukan metode seleksi Roulette Wheel untuk memilih individu yang akan dipilih
untuk melakukan rekombinasi, Crossover, mutasi pada setiap individu dan dilakukan seleksi
feasible untuk mengecek gen yang memiliki waktu melebihi waktu yang diinput user serta
dilakukan update generasi untuk mendapat individu yang baik.
Hasil dari optimasi rekomendasi tempat wisata adalah menghasilkan nama-nama
tempat wisata yang direkoendasikan dimana semakin banyak generasi yang diinput maka
semakin tinggi pula nilai fitness yang dihasilkan dan biayanya juga semakin minimal. Pada
waktu 3 jam, estimasi waktu 60 menit, dan generasi 50 memiliki nilai fitness 2842.03569065.
Aplikasi ini dibuat menggunakan bahasa pemrograman PHP dan database MySQL.
Dipilih bahasa pemrograman PHP karena dapat diakses langsung ke internet sehingga
memudahkan user untuk mengakses aplikasi rekomendasi tempat wisata di manapun dan
kapanpun.
Dengan dikembangkannya aplikasi ini, diharapkan dapat membantu para masyarakat
yang memerlukan rekomendasi tempat unuk berlibur secara optimal dan mendapatkan
informasi yang diinginkan dengan lebih cepat.
Kata kunci : Algoritma Genetika, Roulette Wheel, Crossover, Mutasi
Xiii+66 halaman; 52 Gambar; 16 Tabel
iii
KATA PENGANTAR
Dengan mengucapkan puji dan syukur kita panjatkan kehadirat Tuhan Yang Maha Esa
yang telah memberikan rahmat dan ridho-Nya sehungga kami dapat menyelesaikan laporan
Kuliah Kerja Praktek (KKP) yang berjudul Penerapan Algoritma Genetika Pada Aplikasi
Rekomendasi Tempat Wisata Di Jakarta Berbasis Web dengan baik.
Dalam kesempatan kali ini, penulis akan menyampaikan ucapan terima kasih kepada
pihak-pihak yang senantiasa mendukung, membantu dan membimbing dalam penyelesaian
kuliah kerja praktek antara lain:
1. Tuhan Yang Maha Esa atas nikmat, rahmat dan ridho-Nya sehingga pada akhirnya kami
dapat menyelesaikan laporan Kuliah Kerja Praktek (KKP) ini dengan tepat waktu.
2. Orang tua kami tercinta yang telah memberikan dorongan semangat positif serta nasehat,
doa dan materil kepada kami.
3. Bapak Prof. Ir. Suryo Hapsoro Tri Utomo, Ph.D, selaku Rektor Universitas Budi Luhur.
4. Bapak Goenawan Brotosaputro, S.Kom, M.Sc, selaku Dekan Fakultas Teknologi Informasi
Universitas Budi Luhur
5. Bapak Ainur Rony, S.Kom, M.T.I, selaku ketua Program Studi Teknik Informatika
Universitas Budi Luhur.
6. Bapak Achmad Solichin, S.Kom, M.T.I, selaku dosen pembimbing yang telah memberi
arahan dan masukan kepada kami.
7. Ibu Faizah, selaku dosen Universitas Gadjah Mada yang senantiasa membingbing kami
dalam menyelsaikan permasalahan algoritma pada laporan Kuliah Kerja Praktek kami.
8. Bapak Azhari SN, selaku dosen Universitas Gadjah Mada yang telah memberikan kami
banyak ilmu mengenai penulisan laporan yang baik dan benar.
9. Universitas Gadjah Mada yang telah memberikan kami ide-ide menarik dalam penetuan
topik untuk laporan Kuliah Kerja Praktek ini.
10. Seluruh dosen Fakultas Teknologi Informasi Universitas Budi Luhur yang telah berjasa
dalam memberikan ilmu-ilmu yang bermanfaat.
11. Teman-teman KUTI 2012 yang telah menemani, membantu dan memberikan semangat
kepada kami.
12. Semua pihak yang turut membantu, termasuk teman-teman mahasiswa lain yang ikut
serta memberikan semangat dan nasehat sehingga laporan Kuliah Kerja Praktek ini dapat
terselesaikan.
Akhir kata dengan segala kerendahan hati, kami memohon maaf atas semua kekurangan
yang terdapat dalam laporan ini sehingga kami sangat mengharapkan semua kritik dan saran
yang sifatnya membangun agar kami dapat memperbaiki laporan Kuliah Kerja Praktek ini.
Besar harapan kami agar laporan Kuliah Kerja Praktek ini dapat bermanfaat bagi semua pihak.
Jakarta, Februari 2015
Penulis
iv
DAFTAR TABEL
DAFTAR GAMBAR
vi
vii
DAFTAR SIMBOL
1. Diagram ERD
Entity (Entitas)
Merupakan sekumpulan orang, tempat obyek yang menampilkan
data dicatat atau disimpan
Relationship (Hubungan)
Menggambarkan hubungan yang terjadi pada dua entitas atau
lebih
Cardinality (Kardinalitas)
Menggambarkan tingkat hubungan yang terjadi pada dua buah
entitas
Garis
Menunjukkan garis penghubung
2. Flowchart
Terminator
Digunakan untuk menggambarkan kegiatan awal atau akhir dari
suatu proses
viii
Process
Digunakan untuk menggambarkan suatu proses
Input /Output
Digunakan untuk menggambarkan suatu kegiatan masukkan
maupun keluaran.
Decision
Digunakan untuk menggambarkan suatu keputusan atau tindakan
yang harus diambil pada suatu kondisi tertentu.
Predifined Process
Digunakan untuk menggambarkan suatu kegiatan atau proses.
Line Connector
Digunakan untuk menghubungkan satu simbol dengan simbol yang
lain pada halaman modul yang lainnya.
On page Connector
Digunakan untuk menghubungkan satu simbol dengan simbol yang
lainnya pada halaman yang sama
Off page Connector
Digunakan untuk menghubungkan satu simbol dengan simbol yang
lainnya pada halaman yang berbeda.
ix
DAFTAR ISI
LEMBAR JUDUL ... i
LEMBAR PENGESAHAN ...................................................... Error! Bookmark not defined.
ABSTRAKSI .......................................................................................................................ii
KATA PENGANTAR ...........................................................................................................iv
DAFTAR TABEL ................................................................................................................ v
DAFTAR GAMBAR .............................................................................................................vi
DAFTAR SIMBOL ............................................................................................................ viii
DAFTAR ISI ..................................................................................................................... x
BAB I PENDAHULUAN ....................................................................................................... 1
1.
2.
3.
4.
5.
6.
b.
c.
d.
2.
a.
b.
c.
3.
2.
b.
xi
a.
b.
2)
Pengkodean ................................................................................................ 18
3)
Inisialisasi ................................................................................................... 19
4)
5)
Evaluasi ...................................................................................................... 20
6)
Seleksi ........................................................................................................ 21
7)
Crossover .................................................................................................... 21
8)
Mutasi ......................................................................................................... 22
9)
10)
3.
b.
c.
d.
4.
Frontend ......................................................................................................... 26
a.
1)
2)
3)
4)
5)
Backend.......................................................................................................... 30
b.
1)
2)
3)
xi
xii
5.
Frontend ......................................................................................................... 34
a.
1)
2)
3)
4)
5)
b.
6.
1)
2)
3)
4)
b)
c)
Frontend ......................................................................................................... 45
a.
1)
2)
3)
4)
5)
Backend.......................................................................................................... 46
b.
1)
2)
3)
4)
xii
xiii
a.
2.
Hardware .................................................................................................... 51
2)
Software ..................................................................................................... 51
b.
c.
d.
e.
2)
3)
f.
g.
h.
i.
2)
3)
3.
4.
b.
BAB V PENUTUP............................................................................................................. 65
1.
Kesimpulan ......................................................................................................... 65
2.
Saran ................................................................................................................. 65
xiii
BAB I
PENDAHULUAN
1. Latar Belakang
Jakarta adalah ibukota negara Indonesia yang sangat luas padat dan ramai
penduduknya. Tentunya ibukota ini juga memiliki ragam wisata untuk menghibur dan
menghilangkan rasa stress masyarakat. Wisata merupakan kegiatan perjalanan yang
dilakukan oleh seseorang atau sekelompok orang dengan mengunjungi tempat tertentu
untuk tujuan rekreasi, pengembangan pribadi atau mempelajari keunikan daya tarik wisata
yang dikunjungi dalam waktu tertentu. Namun, masyarakat mayoritas adalah penduduk
yang memiliki waktu terbatas untuk refreshing atau mengunjungi tempat wisata yang ada
di Jakarta sehingga sulit untuk menentukan kemana mereka harus pergi menghabiskan
waktu liburannya. Belum lagi minimnya informasi mengenai harga, rating, waktu yang
harus ditempuh untuk menuju ke tempat wisatanya. Hal ini tentu saja merupakan poin
utama kenapa masyarakat malas untuk berpergian ke tempat-tempat wisata yang ada di
Jakarta. Sehingga pencarian rekomendasi menjadi hal yang penting dalam
pengoptimalisasian pencarian tempat wisata di Jakarta.
Oleh sebab itu, untuk memenuhi kebutuhan masyarakat Jakarta dalam
mengoptimalkan pemilihan tempat wisata tersebut dibutuhkan suatu aplikasi yang dapat
menentukan jumlah tempat wisata dalam waktu tertentu sesuai yang dibutuhkan. Aplikasi
tersebut harus dapat memberikan solusi berupa jumlah banyaknya tempat wisata yang
bisa dikunjungi secara optimal.
Algoritma Genetika merupakan salah satu algoritma yang dapat digunakan untuk
menyelesaikan masalah optimasi. Algoritma ini mampu menemukan solusi yang baik
secara heuristik dengan cepat (Suyanto, 2008). Dengan sifatnya yang mampu
menghasilkan solusi yang baik tersebut, Algoritma Genetika diharapkan dapat membantu
memenuhi kebutuhan pengotimalisasian rekomendasi tempat wisata.
Sehingga dengan permasalahan diatas, kami menjadikan masalah pengoptimalisasian
tempat wisata sebagai bahan penulisan laporan Kuliah Kerja Praktek ini. Adapun judul yang
diambil dan dipilih oleh kami adalah Penerapan Algoritma Genetika Pada Aplikasi
Rekomendasi Tempat Wisata Di Jakarta Berbasis Web.
2. Perumusan Masalah
Bagaimana membangun sebuah aplikasi berbasis web untuk menentukan jumlah
tempat wisata yang bisa dikunjungi berdasarkan harga, rating dan waktu tertentu dengan
penerapan Algoritma Genetika.
3. Batasan Masalah
Aplikasi akan dibangun dengan batasan-batasan yang telah ditentukan sebagai
berikut:
a. Lokasi awal sudah ditentukan, yaitu pada Universitas Budi Luhur di Ciledug,
Petukangan.
b. Alat transportasi yang digunakan adalah mobil.
c. Waktu eksekusi program dibatasi sebesar 2 menit.
d. Jumlah waktu yang diinput minimal 2 jam.
PENDAHULUAN
Dalam bab ini membahas mengenai latar belakang penulisan KKP,
permasalahan, batasan masalah, maksud dan tujuan penulisan, metode
penelitian dan sistematika penulisan dalam penyusunan KKP ini.
BAB II
LANDASAN TEORI
Dalam bab ini membahas tentang teori-teori dasar yang berkaitan dengan
pembuatan aplikasi ini, mulai dari teori yang bersifat umum sampai teori
yang membahas tentang perangkat lunak yang digunakan.
BAB V
PENUTUP
Bab ini merupakan bagian terakhir dari penulisan KKP yang kami buat,
dimana memuat tentang kesimpulan dan saran yang dapat berguna bagi
pengembangan aplikasi selanjutnya.
BAB II
LANDASAN TEORI
1. Algoritma Genetika
a. Pengertian Algoritma Genetika
Terdapat beberapa pengertian Algoritma Genetika yang terdapat pada berbagai
buku, antara lain:
1) Algoritma Genetika adalah teknik pencarian stokastik yang berdasar pada
mekanisme seleksi dan genetic alam (Gen, 1997).
2) Algoritma Genetika adalah algoritma pencarian heuristik yang didasarkan atas
mekanisme evolusi biologi (Kusumadewi, 2003).
3) Algoritma Genetika adalah salah satu algoritma yang dapat digunakan untuk
menyelesaikan masalah optimasi. Algoritma ini mampu menemukan solusi yang
baik secara heuristic dengan cepat (Suyanto, 2008).
b. Struktur Umum Algoritma Genetika
Algoritma Genetika memiliki sifat-sifat yang menyerupai mekanisme evolusi
biologi, karena itulah nama-nama proses maupun komponen dalam Algoritma
Genetika sama dengan proses dan komponen-komponen evolusi makhluk hidup,
seperti populasi, kromosom, gen, orang tua, anak, regenerasi, rekombinasi, mutasi,
dan sebagainya.
Dalam Algoritma Genetika, kromosom merupakan kandidat solusi dalam suatu
permasalahan. Satu kromosom menyatakan satu kandidat solusi. Algoritma Genetika
melakukan pencarian sekaligus di sekumpulan kandidat solusi. Kumpulan kandidatkandidat solusi atau kromosom tersebutdisebut dengan populasi (Suyanto, 2008).
Setiap populasi butuh regenerasi. Untuk melakukan regenerasi, harus terjadi
perkawinan atau rekombinasi antara dua orang tua yang menghasilkan anak. Pada
Algoritma Genetika, setiap kromosom dapat menjadi orang tua yang kemudian
melakukan rekombinasi. Namun tidak sembarang kromosom dipilih untuk melakukan
proses rekombinasi. Harus ada suatu proses pemilihan kromosom yang cukup baik
untuk dijadikan orang tua agar nantinya dapat dihasilkan anak yang cukup baik pula.
Dalam kehidupan nyata, proses alam selalu terjadi. Individu yang memiliki kualitas
lebih baik memiliki peluang hidup yang lebih besar daripada yang lain (Suyanto, 2008).
Begitu juga dengan proses dalam Algoritma Genetika. Setelah dihasilkan anak dari
proses rekombinasi, harus ditinjau, apakah anak tersebut memiliki kualitas yang cukup
baik untuk menjadi generasi baru dalam populasi tersebut. Anak dapat dikatakan baik
jika memiliki kualitas yang minimal sama dengan kualitas individu yang sudah ada
dalam populasi. Bila kualitasnya baik, maka anak tersebut dapat menjadi bagian dari
populasi, atau dapat dikatakan mati.
Untuk menjaga agar ukuran populasi tidak berubah, baik bertambah maupun
berkurang, jika terdapat anak yang dapat lolos menjadi anggota populasi, berarti harus
ada anggota populasi lain yang harus dikorbankan. Anggota populasi yang harus mati
adalah anggota populasi yang memiliki kualitas terburuk (Suyanto, 2005). Hal itu
dilakukan untuk menjaga agar kualitas individu-individu dalam populasi tidak menurun.
Selama proses regenerasi, tidak hanya rekombinasi yang dapat terjadi, tapi juga
proses mutasi. Mutasi memiliki peluang jauh lebih kecil dibandingkan kombinasi,
namun mutasi tetap dapat merubah sifat individu. Dalam Algoritma Genetika, mutasi
dapat dilakukan dengan merubah nilai pada suatu gen di dalam kromosom.
Kromosom A
1010111110001101101110
Kromosom B
0001101101110101011011
Kromosom A
1594872630
Kromosom B
2630159784
Kromosom A
Kromosom B
A, B, C, D, G, R, Y, O, P, L, Q, F, W
2) Inisialisasi
Setelah diketahui teknik pengkodean yang sesuai untuk suatu masalah,
langkah yang selanjutnya dilakukan adalah inisialisasi populasi awal. Sejumlah
kromosom diciptakan secara acak sebanyak ukuran populasi yang telah ditentukan
(Gen, 1997). Ukuran populasi merupakan jumlah kromosom dalam satu populasi.
3) Evaluasi
Kromosom-kromosom yang telah tercipta dalam populasi dievaluasi
kualitasnya dengan cara menghitung nilai fitness. Penghitungan nilai fitness dapat
dilakukan dengan banyak cara, sesuai permasalahan dan solusi yang diinginkan.
Sebagai contoh, untuk permasalahan travelling Salesman Problem (TSP), nilai
fitness didapatkan dengan menghitung jarak antar kota sesuai urutan dalam
kromosom.
4) Seleksi
Seleksi merupakan proses pemilihan kromosom dari generasi lama untuk
dijadikan parent yang akan di-crossover untuk membentuk kromosom baru yang
disebut offspring. Seleksi dilakukan dengan memperhatikan fitness dari tiap
kromosom. Semakin tinggi nilai fitness-nya maka semakin besar juga
kemungkinan kromosom tersebut terpilih. Yang menjadi permasalahan adalah
bagaimana cara memilih kromosom untuk dijadikan parent. Ada beberapa jenis
metode seleksi, berikut ini adalah beberepa metode seleksi yang sering digunakan.
a) Seleksi Roda Roulette (Roulette Wheel Selection)
Pada metode ini, individu-individu dipetakan dalam suatu segmen secara
berurutan, hingga tiap-tiap segmen individu memiliki ukuran yang sesuai
dengan nilai fitness-nya. Ukuran segmen dari masing-masing individu adalah
sebesar nilai probabilitasnya, yakni hasil pembagian antara fitness masingmasing individu dengan total fitness dalam populasi (Obitko, 1998). Contoh
populasi beserta nilai fitness-nya dapat dilihat pada tabel, sedangkan
probabilitas terpilihnya dalam roda roulette dapat dilihat pada gambar.
Tabel 2.4: Contoh populasi dan nilai fitness pada seleksi roda roulette
Kromosom Fitness
Probabilitas
15
37.5%
12.5%
10
25%
12.5%
12.5%
12.50%
12.50%
37.50%
25%
12.50%
A
Kromosom parent A
10101110110
Kromosom parent B
10110011010
Kromosom offspring
10101111010
Kromosom parent A
10101110110101001
Kromosom parent B
10110011010101010
Kromosom offspring
10101111010101010
Kromosom parent A
1110110111101101
Kromosom parent B
0011010111100010
Kromosom offspring
0010010111011111
Kromosom parent B
11011111
11001011
10
Kromosom parent A
123456789
Kromosom parent B
453687219
123456789
11
Berikut adalah cara mutasi untuk pengkodean biner yang sering diterapkan
dalam Algoritma Genetika.
a) Mutasi untuk pengkodean biner
Mutasi dalam pengkodean biner merupakan operasi yang sangat
sederhana. Bit pada kromosom yang terpilih secara acak akan menggunakan
skema tertentu nilainya diinversi, 0 menjadi 1 atau sebaliknya, 1 menjadi 0
(Obitko, 1998). Contoh mutasi pada pengkodean biner dapat dilihat pada
tabel.
Tabel 2.10: Contoh mutasi untuk pengkodean biner
Kromosom sebelum mutasi
1101011110
Kromosom sesudah mutasi
1101001110
b) Mutasi untuk pengkodean permutasi
Proses muatasi pada pengkodean biner tidak dapat diterapkan pada
pengkodean permutasi karena konsistensi permutasi harus selalu
diperhatikan. Salah satu cara yang dapat dilakukan adalah memilih dua posisi
gen pada sebuah kromosom dan kemudian saling menukarkannya (Obitko,
1998). Contoh mutasi pada pengkodean permutasi dapat dilihat pada tabel.
Tabel 2.11: Contoh mutasi untuk pengkodean permutasi
Kromosom sebelum mutasi
123456789
Kromosom sesudah mutasi
123956784
c) Mutasi untuk pengkodean nilai
Salah satu bentuk proses mutasi pada pengkodean nilai adalah dengan
memilih sembarang posisi gen pada kromosom, kemudian ditambahkan atau
dikurangkan dengan suatu nilai kecil tertentu yang diambil secara acak
(Obitko, 1998). Contoh mutasi pada pengkodean nilai dapat dilihat pada tabel.
Tabel 2.12: Contoh mutasi untuk pengkodean nilai
Kromosom sebelum mutasi
1.29, 5.68, 2.86, 4.11, 5.55
Kromosom sesudah mutasi (-0.13)
1.29, 5.68, 2.73, 4.22, 5.55
7) Update generasi
Update generasi merupakan pemilihan kromosom untuk membentuk generasi
selanjutnya. Ada dua macam bentuk prosedur untuk membentuk populasi
selanjutnya (Gen dan Cheng, 1997)
a) Elitism
Dalam metode ini, kromosom yang diambil untuk dipakai pada generasi
berikutnya sesuai dengan banyaknya kromosom awal dan mempertahankan
individu dengan fitness terbaik. Kromosom-kromosom tersebut didapat dari
penggabungan kromosom parent awal ditambah dengan kromosom hasil
mutasi. Lalu dipilih kromosom-kromosom dengan fitness tertinggi.
8) Replace
Untuk menjaga agar ukuran populasi tetap sama seperti ukuran populasi awal,
maka harus ada kromosom yang mati untuk memberikan kesempatan kromosom
yang baru tetap hidup. Namun tidak munutup kemungkinan kromosom yang baru
12
tersebut tidak dapat bertahan Karena kualitasnya yang buruk. Oleh karena itu
dibutuhkan skema replacement agar kromosom terbaiklah yang bertahan. Skema
replacement itu disebut dengan replace the worst.
Saat kromosom anak tercipta, nilai fitness kromosom anak akan dievaluasi.
Setelah itu, nilai fitness kromsom anak akan dievaluasi. Setelah itu, nilai fitness
tersebut akan dibandingkan dengan nilai fitness kromsom-kromosom lain dalam
anggota populasi. Bila terdapat beberapa kromosom yang memiliki nilai fitness
yang lebih buruk dari nilai fitness kromosom anak, maka kromosom yang memiliki
nilai fitness terburuk akan digantikan dengan kromosom anak. Sebaliknya, jika
kromosom anak memiliki nilai fitness yang lebih buruk dari nilai fitness semua
kromosom anggota populasi, maka kromosom anak tersebut tidak perlu
dipertahankan.
9) Pengujian Terhadap Kondisi Akhir
Saat proses regenerasi selesai dilakukan, maka populasi pada generasi
tersebut akan diuji apakah sudah memenuhi kondisi akhir. Kondisi akhir bisa
berupa jumlah generasi, waktu proses, variasi individu-individu dalam populasi
tersebut sudah lebih kecil dari suatu nilai tertentu, atau kriteria lainya (Suyanto,
2008).
d. Langkah-langkah Algoritma Genetika
Proses Algoritma Genetika berjalan sesuai dengan langkah-langkah sebagai
berikut (Gen, 1997):
1) Inisialisasi populasi awal secara acak.
2) Evaluasi populasi.
3) Jika kondisi berhenti tidak dipenuhi, maka lakukan prosedur berikut:
a) Seleksi kromosom orang tua.
b) Rekombinasi kromosom.
c) Mutasi kromosom.
d) Evaluasi kromosom
e) Evaluasi kromosom baru.
f) Penggantian populasi lama dengan populasi baru.
g) Kembali ke langkah 3.
Langkah-langkah diatas secara umum dapat digambarkan dengan flowchart
sebagai berikut.
13
14
konsumen harus dilakukan satu kali. Hasil yang diinginkan adalah perjalanan dengan
jarak tempuh yang terpendek (minimal). (Smith, 1982), Traveling Salesman Problem
(TSP) dapat dengan mudah diubah dalam bentuk network problem dengan formulasi
yang serupa dengan model rute terpendek. Konsumen yang dikunjungi
diidentifikasikan sebagai simpul-simpul (nodes) dari jaringan. (Rabi, 2002), Persoalan
Travelling Salesman (TSP) adalah persoalan optimasi yang dinyatakan sebagai mencari
rute perjalanan termurah untuk mengunjungi konsumen, dimana setiap konsumen
kunjungi secara pasti satu kali.
Travelling Salesman problem (TSP) merupakan masalah kombinasi optimasi dalam
operasi penelitian dan teori ilmu komputer. Dengan daftar kota-kota yang akan
dikunjungi, cara ini sangat tepat untuk menemukan dengan sesingkat mungkin setiap
kota yang akan dikunjungi dengan waktu, dan penggunaan biaya yang tepat, dan
efisien.
Masalah ini pertama kali dirumuskan sebagai masalah matematika pada tahun
1930 dan merupakan salah satu masalah yang paling intensif dalam mempelajari
masalah optimasi, dan digunakan sebagai patokan bagi banyak metode optimasi dalam
jumlah besar dengan cara yang tepat, dan metode yang mudah untuk diketahui,
sehingga beberapa kasus dengan puluhan ribu kota dapat diselesaikan dengan baik.
TSP memiliki beberapa aplikasi, seperti perencanaan, logistik, dan manufaktur. Dalam
aplikasi ini, TSP merupakan konsep jarak perjalanan waktu atau biaya. Dalam banyak
aplikasi, dapat muncul kendala seperti keterbatasan sumber daya atau waktu.
Travelling Salesman Problem (TSP) adalah problem untuk mengoptimasi dan
menemukan perjalanan (tour) yang paling terpendek. TSP adalah problem untuk
menentukan urutan dari sejumlah kota yang harus dilalui oleh salesman, setiap kota
hanya boleh dilalui satu kali dalam perjalanannya, dan perjalanan tersebut harus
berakhir pada kota keberangkatannya dimana salesman tersebut memulai
perjalanannya, dengan jarak antara setiap kota satu dengan kota lainnya sudah
diketahui. Salesman tersebut harus meminimalkan pengeluaran biaya, dan jarak yang
harus ditempuh untuk perjalanannya tersebut.
TSP ini dapat dilakukan secara sederhana dengan beberapa metode algoritma.
TSP adalah salah satu contoh permasalahan kombinatorial dengan kemungkinan
penyelesaian yang sangat banyak.
b. Algoritma TSP
Algoritma exhaustive, yaitu dengan mencari semua kombinasi yang mungkin
terjadi, kemudian memilih kombinasi perjalanan dengan jarak terdekat, algoritma ini
mempunyai kompleksitas n!/2n.
Algoritma exhaustive search untuk persoalan TSP :
1) List semua sirkuit Hamilton dari graf lengkap dengan n buah simpul.
2) Hitung (evaluasi) bobot setiap sirkuit Hamilton yang ditemukan pada langkah 1.
3) Pilih sirkuit Hamilton yang mempunyai bobot paling terkecil.
c. Implementasi TSP pada kota
1) TSP Dengan 3 Kota.
TSP dengan 3 kota tidak perlu diselesaikan menggunakan komputer. TSP
dengan 3 kota (1, 2, 3) hanya mempunyai satu kemungkinan seperti gambar Di
bawah ini :
15
Gambar 2.5: Contoh sirkuit Hamilton pada graf TSP dengan 4 kota
Jadi, sirkuit Hamilton terpendek adalah I3 = (a, c, b, d, a) atau (a, d, b, c, a)
dengan panjang sirkuit = 10 + 5 + 9 + 8 = 32.
3) TSP Dengan 5 Kota.
16
17
3. Referensi Ilmiah
a. Suryarasmi, Anindita 2009, Aplikasi Pencarian Rute Terpendek Jalur Trans Jogja
Dengan Algoritma Genetika, Yogyakarta, Universitas Gadjah Mada.
b. Widodo, Agus Wahyu, & Mahmudy, Wayan Firdaus 2010, Penerapan Algoritma
Genetika Pada System Rekomendasi Wisata Kuliner, Malang, Universitas Brawijaya.
c. Baharudin, Azmi, Shiddiqi, A Mazharudin, Pratomo, Baskoro Adi, Travelling Salesman
Problem Menggunakan Algoritma Genetika Via GPS Berbasis Android, Surabaya,
Institute Teknologi Sepuluh Nopember.
d. Indrianingsih, Yuliani, Algoritma Genetic Untuk Menyelesaikan Masalah Optimasi
Fungsi Berkendala Dengan Pengkodean Bilangan Bulat , Sekolah Tinggi Teknologi
Adisutjipto.
e. Santoso, I Silviana, et. al. 2014, Pengoptimalan Anggaran Untuk Memenuhi Kebutuhan
Berdasarkan Prioritas Dengan Algoritma Genetika, Yogyakarta, Universitas Gadjah
Mada.
BAB III
ANALISIS PERMASALAHAN dan PERANCANGAN PROGRAM
1. Analisis Masalah dan Solusi
a. Identifikasi Masalah
Mayoritas masyarakat zaman sekarang mempunyai waktu luang yang sangat
terbatas untuk melakukan liburan seperti berkeliling tempat-tempat wisata di Jakarta.
Belum lagi minimnya informasi mengenai harga, rating dan waktu yang harus
ditempuh untuk menuju ke tempat wisatanya.
Dengan permasalahan tersebut maka masyarakat membutuhkan solusi untuk
mengoptimalkan waktu luang mereka menjadi lebih efisien.
b. Strategi Penyelesaian
Untuk menangani permasalahan diatas, maka digunakanlah sebuah web
application dengan menggunakan Algoritma Genetika didalamnya yang dapat
membantu dalam mengoptimalkan waktu luang masyarakat agar lebih effisien.
2. Perancangan Sistem
a. Gambaran Umum Sistem
Sesuai dengan analisis sistem, maka didapatkan gambaran bahwa aplikasi
membutuhkan masukan berupa waktu yang ingin ditempuh, estimasi waktu perwisata
dan input generasinya. Sedangkan keluarannya yang diberikan oleh aplikasi adalah
jumlah dan nama wisata yang dapat dikunjungi dan biaya yang seminimal mungkin.
Untuk mendapatkan perekomendasian tempat wisata, aplikasi menggunakan
pendekatan Algoritma Genetika dengan parameter berupa jumlah wisata, biaya dan
rating.
b. Algoritma Genetika Pada Sistem
1) Fungsi obyektif
Algoritma Genetika pada sistem memiliki tujuan untuk merekomendasikan
tempat wisata dengan waktu tertentu. Jadi fungsi obyektif pada sistem ini adalah
mencari waktu yang sesuai dengan keinginan user dari waktu perwisata yang ada.
Dari fungsi obyektif pada rumus dapat disimpulkan bahwa nilai bobot dapat
dihitung dengan membagikan biaya dengan waktu dan rating.
=
Biaya
Jumlah Wisata +
1
W
2) Pengkodean
Sistem rekomendasi tempat wisata diharapkan memberikan hasil keluaran
berupa nama nama tempat wisata yang dapat dikunjungi dengan waktu tertentu,
18
19
yang berarti solusi yang diberikan adalah lamanya waktu dari titik awal ke wisata
dan wisata yang satu dengan wisata yang lainnya. Jenis pengkodean yang paling
tepat untuk jenis solusi seperti itu adalah pengkodean biner.
Dalam kromosom dengan pengkodean biner, setiap locus berisi suatu nilai (1)
atau tidak (0) yang mewakili tempat wisata tertentu. Locus urutan pertama bisa
saja memiliki nilai 1 yang artinya waktu wisata yang pertama memenuhi waktu
yang di input user. Jika pada locus yang kedua memiliki nilai 0 maka waktu wisata
yang kedua tidak memenuhi waktu yang diinput user atau lewat batas dari waktu
yang ditentukan, sehingga hanya locus yang bernilai 1 yang akan di ambil untuk
menentukan tempat wisata yang akan dikunjungi dengan waktu tertentu.
20
Dari algoritma di bawah ini, dapat dilihat bahwa proses perbaikan kromosom
dimulai dengan memeriksa gen pada locus pertama yang bernilai kurang lebih
sama waktu, selanjutnya mencari gen tempat wisata yang waktunya lebih kurang
sama waktu, jika sudah ditemukan maka menukar gen tersebut dengan gen yang
lebih kurang sama waktu. Setelah itu diperiksa kromosom apakah lebih kecil sama
waktu jika tidak cari mencari gen tempat wisata yang waktunya lebih kurang sama
waktu, jika sudah ditemukan maka menukar gen tersebut dengan gen yang lebih
kurang waktu.
1. Waktu awal = 0;
2. Lakukan perulangan sejumlah ukuran data wisata didatabase{
3.
Cari jarak waktu antara titik awal ke wisata yang terdekat ;
4.
Jika waktu ditemukan {
5.
Tambahkan dengan waktu awal ;
6.
Jika menemukan gen yang memiliki nilai jarak waktu terdekat =
tempat wisata tujuan{
7.
Hentikan perhitungan;
8.
}
9.
}
10.
Jika waktu tidak ditemukan {
11.
Cari gen berdasarkan waktu tempat wisata yang nilainya < waktu ;
12.
Tukar gen tempat wisata dengan gen yang memiliki nilai < waktu;
13.
}
14. }
Algoritma di atas menjelaskan bahwa proses evaluasi melakukan pencarian
waktu antara gen titik awal ke wisata yang lainnya dan selanjutnya, kemudian
}
menambahkannya
ke waktu awal. Bila pencarian terhadap waktu tidak ditemukan,
maka mencari gen waktu tempat wisata yang nilainya lebih kecil sama waktu jika
21
ditemukan tukar gen tempat wisata dengan gen yang memiliki nilai lebih kecil
sama waktu.
6) Seleksi
Proses seleksi pada Algoritma Genetika system ini menggunakan seleksi
Roulette Wheel. Seleksi digunakan untuk memilih individu-individu mana saja yang
akan dipilih untuk proses pindah silang dan mutasi. Seleksi digunakan untuk
mendapatkan calon induk yang baik. Memilih induk yang baik didasarkan atas
hipotesis Induk yang baik akan menghasilkan keturunan yang baik. Semakin
tinggi nilai fitness suatu individu, semakin besar peluangnya untuk terpilih sebagai
calon induk. Pada kasus yang dibahas, metode yang kami gunakan adalah seleksi
dengan Roda Roulette (Roulette Wheel). Tahapan yang dilakukan seleksi Roulette
Wheel adalah:
1) Perhitungan nilai fitness (fk) dari masing-masing individu, dari individu
pertama hingga individu ke n.
2) Perhitungan total fitness (fk) semua individu.
3) Perhitungan probabilitas seleksi (pk) setiap individu, dimana pk = fkfk
4) Mengacak suatu bilangan 0 sampai 1 [0,1].
5) Memilih individu dimana bilangan random itu berada sebagai parent.
6) Lakukan langkah 4 5 sebanyak jumlah individu dalam populasi.
Corssover yang digunakan pada sistem ini yang crossover satu titik (Single
Point Crossover) dan menggunakan PC (probabilitas Corssover)= 0,7. Kromosom
yang diambil untuk crossover yaitu kromosom yang jumlah fitnessnya lebih kecil
sama dengan 0,7. Dimana kromosom tersebut akan diambil dan dikumpukan
untuk dikawin silangkan dengan cara crossover satu titik. Proses crossover satu
titik dimulai dengan pemilihan sebuah titik pada barisan bit kromosom secara acak
sebagai titik crossover. Kromosom baru akan dibentuk dengan menyalin barisan
bit parent pertama dari bit pertama sampai titik crossover, sedangkan sisanya
disalin dari parent kedua. Jika kromosom yang jumlah fitnessnya lebih besar 0,7
maka kromosom tersebut tidak akan dipili sebagai parent sehingga kromosom
tersebut tidak akan dilakukan proses crossover.
22
23
24
Field
id_asal
Tempat_asal
Type
Char
Varchar
Length
5
60
Keterangan
Nomor id tempat wisata asal.
Nama tempat wisata asal.
25
2) Tabel Kunjung
Nama Tabel : kunjung
Media
: Harddisk
Primary Key : id_asal
Foreign Key : id_tujuan
Tabel 3.2: Spesifikasi Tabel Kunjung
Field
Type
Length
id_asal
id_tujuan
Waktu
Char
Char
int
5
5
5
Jarak
Double
30
Keterangan
Nomor id tempat wisata asal.
Nomor id tempat wisata tujuan.
Banyaknya waktu yang harus
ditempuh dari tempat wisata
asal ke tempat wisata tujuan.
Jumlah jarak yang harus
ditempuh dari tempat wisata
asal ke tempat wisata tujuan.
3) Tabel Tujuan
Nama Tabel : tujuan
Media
: Harddisk
Primary Key : id_tujuan
Foreign Key : Tabel 3.3: Spesifikasi Tabel Tujuan
Field
Type
Length
id_tujuan
Char
tempat_tujuan
Varchar
60
Biaya
int
15
Rating
int
15
Alamat
text
255
Type
Lat
Varchar
float
255
10.6
Lng
float
10.6
Keterangan
Nomor id tempat wisata
tujuan.
Nama tempat wisata yang
dituju.
Jumlah biaya masuk tempat
wisata.
Jumlah rating dari tempat
wisata.
Informasi alamat tempat
wisata yang dituju.
Jenis dari tempat wisata.
Posisi lintang (latitude) dari
tempat wisata.
Posisi bujur (longitude) dari
tempat wisata.
26
4) Tabel Login
Nama Tabel :
Media
:
Primary Key :
Foreign Key :
login
Harddisk
id
-
Field
id
username
Password
Type
int
Varchar
Varchar
Length
4
255
255
Keterangan
Nomor id admin.
Nama username admin.
Password admin
4. Rancangan Layar
Rancangan Layar yang diberikan disini merupakan representasi dari aplikasi yang
dibuat penulis. Rancangan layar disini memberikan bentuk tampilan dari program yang
dibuat sehingga dapat memberikan laporan yang memudahkan dalam penggunaannya.
Tampilan layar yang baik akan memberikan kemudahan yang sangat diperlukan agar
pemakai merasa nyaman dan tidak jenuh saat menjalankan aplikasi.
a. Frontend
1) Rancangan Layar Menu Utama
Gambar 3.4 merupakan rancangan layar Home, dimana terdapat judul aplikasi
program ini, yaitu Rekomendasi Tempat Wisata dan logo Universitas Budi Luhur.
27
28
29
30
31
32
33
34
35
36
37
38
39
(backend), namun apabila login gagal akan tampil sebuah pesan Username dan
Password tidak valid.
40
41
42
43
44
45
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. End If
46
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
47
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Input Pilih
If Pilih = Login Then
Cek Username dan Password pada tabel login
If data sesuai Then
Tampilkan Menu Utama Admin
Else
Tampilkan pesan Username dan Password tidak valid
Kembali ke baris 1
End If
End If
6.
7.
8.
9.
10.
11.
12.
13.
14.
15. End If
48
49
50
BAB IV
IMPLEMENTASI dan UJI COBA PROGRAM
Aplikasi rekomendasi tempat wisata yang dirancang ini, ditujukan untuk memudahkan dan
memberi layanan yang dapat memberikan solusi dalam pemberian rekomendasi tempat wisata
serta informasi tempat wisatanya secara optimal kepada masyarakat. Aplikasi ini merupakan
aplikasi berbasis web untuk menentukan jumlah tempat wisata yang bisa dikunjungi
berdasarkan harga, rating dan waktu tertentu dengan penerapan Algoritma Genetika. Sehingga
dapat mempermudah masyarakat dalam berpergian ke tempat wisata secara optimal.
1. Spesifikasi Hardware dan Software
a. Implementasi Aplikasi Rekomendasi Tempat Wisata
1) Hardware
Adapun spesifikasi hardware yang harus terpenuhi agar aplikasi Rekomendasi
Tempat Wisata dapat berjalan dengan baik adalah sebagai berikut:
a) Processor Intel Pentium Dual Core + 2,16GHz
b) RAM/ Memory 1 GB
c) Harddisk
2) Software
Di bawah ini merupakan spesifikasi software yang dibutuhkan agar aplikasi dapat
berjalan dengan maksimal:
a) Sistem Operasi Microsoft Windows 7
b) XAMPP 1.7.3
c) MySQL Front 5.3
d) Notepad ++
e) Google Chrome
2. Tampilan Layar Program
Tampilan layar program berguna untuk mengetahui apakah program yang telah dibuat
dapat berjalan secara maksimal atau bahkan terjadi kesalahan-kesalahan yang tidak
diinginkan, untuk itu maka program tersebut harus diuji dahulu mengenai kemampuannya
agar dapat berjalan sesuai dengan yang diharapkannya pada saat implementasi nantinya.
Tahap pengujian ini, user yang akan langsung mencoba, karena dari seorang user
tersebut penulis akan mendapat masukan-masukan yang diharapkan menjadi acuan untuk
penulis nantinya. Berikut ini adalah tampilan program beserta penjelasan penggunaan
program di masing-masing tampilan program yang ada pada aplikasi rekomendasi tempat
wisata.
a. Tampilan Layar Form Menu Utama Frontend
Di dalam menu utama frontend, terdapat beberapa menu yaitu menu home,
rekomendasi tempat wisata, daftar tempat wisata, help dan menu about.
51
52
53
Gambar 4.3: Tampilan Layar Form Menu Rekomendasi Tempat Wisata di Generate
c. Tampilan Layar Form Menu Daftar Tempat Wisata
Berikut ini merupakan tampilan layar menu Daftar Tempat Wisata. Didalam menu
Daftar Tempat Wisata terdapat tampilan map beserta list tempat wisata yang berupa
tabel.
Gambar 4.4: Tampilan Layar Form Menu Daftar Tempat Wisata Peta
54
Gambar 4.5: Tampilan Layar Form Menu Daftar Tempat Wisata List
d. Tampilan Layar Form Menu Help
Berikut ini merupakan tampilan layar menu Help. Didalam menu help terdapat
panduan panduan penggunaan aplikasi ini.
55
56
57
f.
58
59
Gambar 4.22: Tampilan Layar Form Menu Daftar Tempat Wisata Peta Admin
Gambar 4.23: Tampilan Layar Form Menu Daftar Tempat Wisata List Admin
60
i.
61
62
Waktu
(Jam)
1
2
3
4
5
6
7
8
9
10
11
12
3
3
3
3
3
3
3
3
3
3
3
3
115.878484184
131.27335151
151.010609463
151.105455702
1496.77419355
1404.49438202
250.918857789
2227.4022274
929648241206
7692.30769231
2941.83195899
2842.03569068
Rp. 31930
Rp. 29709
Rp. 25826
Rp. 25148
Rp. 3875
Rp. 6052
Rp. 18939
Rp. 3861
Rp. 2786
Rp. 2678
Rp. 4487
Rp. 6052
Jumlah
Tempat
Wisata
2
2
2
2
2
1
2
1
2
2
1
2
Pada pengujian ke 1, 5 dan 9 memiliki jumlah estimasi 15 menit dan waktu 3 jam,
namun generasinya, yaitu 10, 20 dan 50 memiliki nilai fitness yang semakin tinggi dan
memiliki biaya yang semakin minimal.
63
Pada pengujian ke 2, 6 dan 10 memiliki jumlah estimasi 30 menit dan waktu 3 jam,
namun generasinya, yaitu 10, 20 dan 50 memiliki nilai fitness yang semakin tinggi dan
memiliki biaya yang semakin minimal.
Pada pengujian ke 3, 7 dan 11 memiliki jumlah estimasi 45 menit dan waktu 3 jam,
namun generasinya, yaitu 10, 20 dan 50 memiliki nilai fitness yang semakin tinggi dan
memiliki biaya yang semakin minimal.
Pada pengujian ke 4, 8 dan 12 memiliki jumlah estimasi 60 menit dan waktu 3 jam,
namun generasinya, yaitu 10, 20 dan 50 memiliki nilai fitness yang semakin tinggi dan
memiliki biaya yang semakin minimal.
Jadi kesimpulannya adalah semakin banyak generasi yang diinput maka semakin tinggi
pula nilai fitness yang dihasilkan dan biayanya juga semakin minimal atau murah.
No
Waktu
(Jam)
1
2
3
4
5
6
7
8
9
10
11
12
5
5
5
5
10
10
10
10
10
10
10
10
Biaya
Rp. 51557
Rp. 267426
Rp. 116409
Rp.482457
Rp. 28000
Rp. 11391
Rp. 7930
Rp. 30296
Rp. 8014
Rp. 5078
Rp. 4313
Rp. 2786
Jumlah
Tempat
Wisata
5
4
4
4
4
3
3
3
4
4
1
2
Pada Pengujian ke 1, 5 dan 9 memiliki jumlah estimasi (15 Menit) dan waktu (5 Jam)
tertentu namun generasinya yaitu 10, 20 dan 50 memiliki nilai fitness yang makin tinggi.
Dan memiliki biaya yang semakin minimal.
Pada Pengujian ke 2, 6 dan 10 memiliki jumlah estimasi (30 Menit) dan waktu (5 Jam)
tertentu namun generasinya yaitu 10, 20 dan 50 memiliki nilai fitness yang makin tinggi.
Dan memiliki biaya yang semakin minimal.
Pada Pengujian ke 3, 7 dan 11 memiliki jumlah estimasi (45 Menit) dan waktu (5 Jam)
tertentu namun generasinya yaitu 10, 20 dan 50 memiliki nilai fitness yang makin tinggi.
Dan memiliki biaya yang semakin minimal.
Pada Pengujian ke 4, 8 dan 12 memiliki jumlah estimasi (60 Menit) dan waktu (5 Jam)
tertentu namun generasinya yaitu 10, 20 dan 50 memiliki nilai fitness yang makin tinggi.
Dan memiliki biaya yang semakin minimal.
64
4. Evaluasi Program
Setelah dilakukan uji coba terhadap program aplikasi ini, didaptkan beberapa kelebihan
dan kekurangan dari aplikasi ini, yaitu sebagai berikut :
a. Kelebihan Program
1) Aplikasi dapat dengan mudah dioperasikan oleh pengguna, karena memiliki user
interface (tampilan antar muka) yang cukup baik dan user friendly.
2) Aplikasi dapat membuat perekomendasian tempat wisata dengan waktu yang
sesuai dengan user inginkan.
3) Proses perekomendasiaan Tempat Wisata lebih cepat dengan menggunakan
aplikasi ini.
b. Kekurangan Program
1) Tidak ada fasilitas khusus untuk menginput tempat asal, tempat tujuan dan
kunjung sehingga di input satu persatu oleh admin.
2) Belum tersedia proses untuk menghitung jarak dari titik awal ke wisata yang satu
dan dari wisata yang satu ke wisata yang lainnya pada aplikasi ini.
BAB V
PENUTUP
Berdasarkan analisis yang telah dilakukan terhadap permasalahan yang ada, maka dapat
ditarik kesimpulan dan saran yang mungkin diperlukan dalam pengembangan sistem yang
lebih kompleks.
1. Kesimpulan
Dari hasil analisis terhadap masalah dan aplikasi yang dikembangkan, maka dapat
ditarik beberapa kesimpulan, antara lain:
a. Program dengan Algoritma Genetika dapat membantu dalam Merekomendasi Tempat
Wisata sehingga dapat berwisata dengan waktu yang diinginkan.
b. Informasi yang didapat lebih mudah melalui aplikasi.
c. Nilai Generasi yang lebih besar menghasilkan nilai fitness yang lebih baik dikarenakan
nilai fitness terbaik ditampung untuk di munculkan kembali di generasi selanjutnya
sehingga semakin banyak generasi semakin banyak juga fitness terbaiknya yang dapat
dipilih serta memiliki biaya yang semakin minimal.
d. Dikarenakan pembentukan data secara Random, hasil yang diberikan belum tentu
sama dengan percobaan sebelumnya.
e. Estimasi waktu dan generasi yang kecil berpengaruh pada hasil rekomendasi tempat
wisata dan kecepatan eksekusi program.
2. Saran
Selain menarik beberapa kesimpulan, penulis juga mengajukan saran-saran yang
mungkin bisa dijadikan pertimbangan dalam pengembangan sistem, antara lain:
a. Pada penelitian selanjutnya diharapkan dapat menambahkan metode agar membuat
proses lebih cepat.
b. Keluaran yang diberikan oleh system tidak hanya berbasis teks, tapi berbentuk
navigasi maps atau GPS sehingga memudahkan pengguna dalam mengetahui letak
atau alamat tempat wisata tersebut.
c. Perlu adanya aplikasi yang dapat menginput Master kunjung sehingga admin tidak
menginput secara manual jarak dan waktu antara wisata yang satu dengan wisata
yang lainnya.
Demikianlah kesimpulan dan saran ini kami sampaikan. Semoga apa yang telah kami buat
bagi diri kami maupun bagi masyarakat yang menggunakan aplikasi ini, bisa mendapatkan
keuntungan yang bermanfaat dan aplikasi yang dirancang ini benar-benar dapat memberikan
nilai tambah dalam kegiatan refreshing untuk rekomendasi tempat wisata yang optimal.
65
DAFTAR PUSTAKA
Gen M & Cheng R 1997, Genetic Algorithms and Engineering Design, New York, John Wiley &
Sons.
Obitko, M 1998, Introduction to Genetic Algorithm (online) dilihat 20 November 2014,
<http://www.obitko.com/tutorials/genetic-algorithms/>.
Kusumadewi, Sri & Purnomo, Hari 2003, Penyelesaian Masalah Optimasi Dengan Teknik
Heuristik, Yogyakarta, Graha Ilmu.
Minartiningtyas, Brigida Arie 2014, Struktur Umum Algoritma Genetika (Online) dilihat 15
Januari 2014, <http://informatika.web.id/struktur-umum-algoritma-genetika.htm>.
Suryarasmi, Anindita 2009, Aplikasi Pencarian Rute Terpendek Jalur Trans Jogja Dengan
Algoritma Genetika, Yogyakarta, Universitas Gadjah Mada.
Widodo, Agus Wahyu, & Mahmudy, Wayan Firdaus 2010, Penerapan Algoritma Genetika Pada
System Rekomendasi Wisata Kuliner, Malang, Universitas Brawijaya.
Baharudin, Azmi, Shiddiqi, A Mazharudin, Pratomo, Baskoro Adi, Travelling Salesman Problem
Menggunakan Algoritma Genetika Via GPS Berbasis Android, Surabaya, Institute Teknologi
Sepuluh Nopember.
Indrianingsih, Yuliani, Algoritma Genetic Untuk Menyelesaikan Masalah Optimasi Fungsi
Berkendala Dengan Pengkodean Bilangan Bulat, Sekolah Tinggi Teknologi Adisutjipto.
Santoso, I Silviana, et. al. 2014, Pengoptimalan Anggaran Untuk Memenuhi Kebutuhan
Berdasarkan Prioritas Dengan Algoritma Genetika, Yogyakarta, Universitas Gadjah Mada.
66
LAMPIRAN
LISTING PROGRAM
Frontend
1. Koneksi.php
<?php
$dbhost = 'localhost'; // Isi nama hosting
$dbuser = 'root'; // Isi Nama User MySQL
$dbpass = ''; // Isi Password Database MySQL
$dbname = 'dbwisata'; // Isi dengan nama Database
$koneksi = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname,$koneksi);
?>
2. Header.php
<?php
session_start();
include ("koneksi.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="../assets/img/globe.ico">
<title>Tempat Wisata</title>
<!-- MAIN CSS -->
<link href="../assets/css/bootstrap.css" rel="stylesheet">
<link href="../assets/css/ndoboost.css" rel="stylesheet">
<link href="../assets/css/marker.css" rel="stylesheet">
<!-- PLUGINS CSS -->
<link
href="../assets/plugins/font-awesome/css/font-awesome.css"
rel="stylesheet">
<link
href="../assets/plugins/weather-icon/css/weather-icons.css"
rel="stylesheet">
<link href="../assets/plugins/prettify/prettify.css" rel="stylesheet">
<link
href="../assets/plugins/magnific-popup/magnific-popup.css"
rel="stylesheet">
<link
href="../assets/plugins/owl-carousel/owl.carousel.css"
rel="stylesheet">
67
68
Bencana</a></li-->
Wisata</a></li>
href="?page=1">Rekomendasi
Tempat
69
<!--
<li><a href="?page=7">Help</a></li>
<li><a href="?page=3">About</a></li>-->
<li class="dropdown">
<a href="#fakelink" class="dropdown-toggle" datatoggle="dropdown">About <b class="caret"></b></a>
<ul
class="dropdown-menu
primary
with-triangle"
role="menu">
<li><a href="?page=4">Tentang Program
</a></li>
<li><a href="?page=6">Credit </a></li>
<li><a href="?page=5">License </a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse $row['id_bencana'];-->
</div><!-- /.container-fluid -->
</nav>
3. Footer.php
<div class="container"><br><br><br>
<!-----------------------------------------------------------BEGIN FOOTER
------------------------------------------------------------>
<footer>
<p align="center">KKP 2015 <i class="fa fa-heart textdanger"></i> Ivanny Silviana-Triana Nopitasari-Zolandia Ramanda</p>
</footer>
<!-----------------------------------------------------------BEGIN FOOTER
------------------------------------------------------------>
</div><!-- /.container -->
<!-===================================================
END YOUR CONTENT
===================================================
-->
<!--
70
===================================================
Placed at the end of the document so the pages load faster
===================================================
-->
<!-- MAIN JAVASRCIPT -->
<script src="../assets/js/bootstrap.min.js"></script>
<!-- PLUGINS AND NDOBOOST JS-->
<script src="../assets/js/jquery.js"></script>
<script src="../assets/plugins/prettify/prettify.js"></script>
<script
src="../assets/plugins/magnific-popup/jquery.magnificpopup.min.js"></script>
<script src="../assets/plugins/owl-carousel/owl.carousel.js"></script>
<script src="../assets/js/ndoboost.js"></script>
</body>
</html>
4. Index.php
<?php
include "koneksi.php";
include "header.php";
$a = $_GET['page'];
switch ($a) {
case 1:
include "rekomendasi.php";
break;
case 2:
include "maps.php";
break;
case 3:
include "info-wisata.php";
break;
case 4:
case 5:
include "tentangprogram.php";
break;
include "license.php";
break;
71
case 6:
case 7:
include "credit.php";
break;
include "help.php";
break;
default:
}
include "home.php";
break;
include "footer.php";
?>
5. Home.php
<!--
----------------------------------------------------------BEGIN HEADER
------------------------------------------------------------>
<header class="text-center">
<h1>Rekomendasi Tempat Wisata</h1>
<img src="../assets/img/ubl.png">
</header>
<!-----------------------------------------------------------END HEADER
------------------------------------------------------------>
6. Rekomendasi.php
<div class="container">
<div class="row">
<div class="text-center">
<p><h2>Rekomendasi Tempat Wisata</h2></p>
<div class="text-center"><p> <p> <p>
<table border='0' width="650px" height="150px" align='center'>
<form name = "input" id="input" action="" method="post">
<tr> <p>
<td height='50px' width='200px'> <label for="waktu">Input Waktu <span
class="mand">*</span></label></td>
72
<td>
<input
type="text"
id="waktu"
30px;"/></td>
name="waktu"
style="height:
<td
height='50px'
width='350px'>
<label
for="keterangan"><span
class="mand">*</span>Input
waktu
dalam
satuan
jam</label></td>
</p> </tr>
<tr> <p>
<td height='50px' width='300px'> <label for="estimasi">Estimasi Waktu
PerWisata <span class="mand">*</span></label></td>
<td> <select name="estimasi">
<option value="15">15 menit</option>
<option value="30">30 menit</option>
<option value="45">45 menit</option>
<option value="60">60 menit</option>
</select> </td>
</p> </tr>
<tr> <p>
<td
>
<label
for="generasi">Input
Generasi
<span
class="mand">*</span></label></td>
<td> <input type="text" id="generasi" name="generasi" style="height:
30px;"/> </td>
</p> </tr>
<tr height='50px'> <p class="buttons">
<td> <button class="btn btn-primary" type="submit" name="proses"
value="Input" onclick="generateForm(); return false;" >Generate</button> </td>
<td> <button class="btn btn-primary" type="reset" name="clear"
value="clear" id="clear"/>Cancel</button></td>
</p></tr>
</form>
</table>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function generateForm(){
if(document.getElementById('waktu').value == ''){
alert('Waktu tidak boleh kosong');
document.getElementById('waktu').focus();
return false;
}
else if(document.getElementById('estimasi').value == ''){
alert('Estimasi waktu tidak boleh kosong');
document.getElementById('estimasi').focus();
return false;
}
else if(document.getElementById('generasi').value == ''){
alert('Generasi tidak boleh kosong');
73
document.getElementById('generasi').focus();
return false;
}
document.getElementById('input').submit();
}
</script>
<?php
set_time_limit(120);
$link = mysql_connect('localhost', 'root', '') or die('Cannot connect to the DB');
mysql_select_db('dbwisata', $link) or die('Cannot select the DB');
$query = "SELECT waktu FROM kunjung";
$result = mysql_query($query, $link) or die('Errorquery: '.$query);
$rows = array();
while ($r = mysql_fetch_assoc($result)) {
$rows[] = $r;
}
$data = "{kota: ".json_encode($rows)."}";
//echo $data;
//generate random
$maxgen = 0;
$querygen = "select * from tujuan";
$hasilhitung = mysql_query($querygen, $link) or die('Errorquery: '.$querygen);
$maxgen = mysql_num_rows($hasilhitung);
//echo 'banyak :' .$maxgen;
$a1 = 0;
$a2 = 9;
$awal = 0;
$menit = 60;
$satu = 1;
$flag = array();
$gen = array(array());
$gen2 = array();
$offspring = array();
$totalwaktu= array();
$totaljarak= array();
$batas_rw = array();
$batas = 0;
$banyaksatu = array();
if(isset($_POST['proses'])){
$inputwaktu = $_POST['waktu'];
$inputlama = $_POST['estimasi'];
$generasi = $_POST['generasi'];
$inputwaktu2 = (int)$inputwaktu * (int)$menit;
for ($k=$a1; $k<=$a2; $k++){
74
$flag[$k] = 0;
$banyaksatu[$k] = 0;
for($l=$awal; $l<$maxgen; $l++){
$result = mt_rand(0, 1);
$gen[$k][$l]= $result;
//echo $gen[$j][$i];
if($gen[$k][$l] == 1){
$banyaksatu[$k] = $banyaksatu[$k] + 1;
}
if($banyaksatu[$k] >= $inputwaktu){
$gen[$k][$l] = 0;
}
}
$f=0;
$as = null;
$jumwaktu = array();
$waktu = array();
$asal = null;
$tujuan = null;
for($j = 0; $j < $maxgen;$j++){
if($gen[$k][$j] == 1){
$flag[$k] = (int)$flag[$k] + 1;
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$query = "Select waktu, jarak FROM kunjung where id_asal
= 'A000".($f+1)."' and id_tujuan = 'T000".($j+1)."'";
$asal = "A000".($f+1);
$tujuan = "T000".($j+1);
}
elseif($j == 9){
if($f == 9){$query = "Select waktu, jarak FROM kunjung
where id_asal = 'A00".($f+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal = "A00".($f+1);
$tujuan = "T00".($j+1);}
else{$query = "Select waktu, jarak FROM kunjung where
id_asal = 'A000".($f+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal = "A000".($f+1);
$tujuan = "T00".($j+1);}
}
elseif($j > 9){
if($f >= 9){$query = "Select waktu, jarak FROM kunjung
where id_asal = 'A00".($f+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal = "A00".($f+1);
75
$tujuan = "T00".($j+1);}
else{$query = "Select waktu, jarak FROM kunjung where
id_asal = 'A000".($f+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal = "A000".($f+1);
$tujuan = "T00".($j+1);}}
$execute = mysql_query($query, $link) or die ('Errorquery :
'.$query);
//echo "".$j;
if(!isset($jumwaktu[$k])){$jumwaktu[$k] = null;}
while($as =mysql_fetch_assoc($execute)){
$jumwaktu[$k] = (int)$jumwaktu[$k] + (int)$as['waktu'] +
(int)$inputlama;
$jumjarak[$k]
=
(double)$jumjarak[$k]
+
(double)$as['jarak'];
//echo (int)$as['waktu']." ";
}
//echo $asal." ".$tujuan." ";
$f = $j;
$f = ($j+1);
}
}
if($inputwaktu2 >= $jumwaktu[$k]){
//echo " ".$jumwaktu[$k];
$totalwaktu1[$k] = $jumwaktu[$k];
$totaljarak1[$k] = (double)$jumjarak[$k];
}
else{
$k--;
}
}
for($batas=0; $batas<$generasi; $batas++){
/*echo "<br>";
for($i = $a1; $i<=$a2;$i++){
echo "Individu ke-".($i+1)." :";
for($j = 0; $j <=$akhir;$j++)
{
echo " ".$gen[$i][$j];
}
echo "<br>";
}
*/
//hitung nilai fitness
//1/(waktu/biaya+rating)
$banyaksatu1 = array();;
for ($k=$a1; $k<=$a2; $k++){
for($l=$awal; $l<$maxgen; $l++){
76
//echo $gen[$j][$i];
if($gen[$k][$l] == 1){
$banyaksatu1[$k] = $banyaksatu1[$k] + 1;
}
if($banyaksatu1[$k] >= $inputwaktu){
$gen[$k][$l] = 0;
}
}
$flag21[$k] = 0;
$as21 = null;
$re = 0;
$jumwaktu21 = array();
for($j = 0; $j < $maxgen;$j++){
if($gen[$k][$j] == 1){
$flag21[$k] = (int)$flag21[$k] + 1;
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$query21 = "Select waktu, jarak FROM kunjung where id_asal
= 'A000".($re+1)."' and id_tujuan = 'T000".($j+1)."'";
$asal21 = "A000".($re+1);
$tujuan21 = "T000".($j+1);
}
elseif($j == 9){
if($re == 9){$query21 = "Select waktu, jarak FROM kunjung
where id_asal = 'A00".($re+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal21 = "A00".($re+1);
$tujuan21 = "T00".($j+1);}
else{$query21 = "Select waktu, jarak FROM kunjung where
id_asal = 'A000".($re+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal21 = "A000".($re+1);
$tujuan21 = "T00".($j+1);}
}
elseif($j > 9){
if($re >= 9 || $re > 9){$query21 = "Select waktu, jarak FROM
kunjung where id_asal = 'A00".($re+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal21 = "A00".($re+1);
$tujuan21 = "T00".($j+1);}
else{$query21 = "Select waktu, jarak FROM kunjung where
id_asal = 'A000".($re+1)."' and id_tujuan = 'T00".($j+1)."'";
$asal21 = "A000".($re+1);
$tujuan21 = "T00".($j+1);}}
$execute21 = mysql_query($query21, $link) or die
('Errorquery : '.$query21);
//echo "".$j;
if(!isset($jumwaktu21[$k])){$jumwaktu21[$k] = null;}
while($as21 =mysql_fetch_assoc($execute21)){
77
$jumwaktu21[$k]
=
(int)$jumwaktu21[$k]
(int)$as21['waktu'] + (int)$inputlama;
$jumjarak21[$k]
=
(double)$jumjarak21[$k]
(double)$as21['jarak'];
//echo (int)$as['waktu']." ";
}
//echo $asal." ".$tujuan." ";
$re = $j;
$re = ($j+1);
+
+
}
}
//echo " ".$jumwaktu[$k];
$totalwaktu[$k] = $jumwaktu21[$k];
$totaljarak[$k] = (double)$jumjarak21[$k];
}
for ($k=$a1; $k<=$a2; $k++){
$biaya = null;
$jumbiaya = array();
$jumjarak = array();
$kilo = 23;
$harga = 8000;
$totalbensin = array();
$totalbiaya = array();
$bobot = array();
$fitness = array();
$totalfitness = 0;
for($j = 0; $j <$maxgen;$j++){
if($gen[$k][$j] == 1){
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$queryb = "Select biaya, rating FROM tujuan where id_tujuan
= 'T000".($j+1)."'";
id_tujuan = 'T00".($j+1)."'";
$tujuan = "T000".($j+1);
}
else{$queryb = "Select biaya, rating FROM tujuan where
$tujuan = "T00".($j+1);}
$querybiaya = mysql_query($queryb,
$link)
or
die
('Errorquery : '.$queryb);
//echo "".$j;
if(!isset($jumbiaya[$k])){$jumbiaya[$k] = null;}
while($biaya =mysql_fetch_assoc($querybiaya)){
$jumbiaya[$k] = (int)$jumbiaya[$k] + (int)$biaya['biaya'];
$jumrating[$k] = (int)$jumrating[$k] + (int)$biaya['rating'];
//echo (int)$as['waktu']." ";
}
78
(int)$totalbensin2[$k];
$totalbiaya2[$k] = $totalbiaya[$k];
$hitung[$k] = (int)$flag21[$k] + (int)$jumrating[$k];
$bobot[$k] = (float)((int)$totalbiaya2[$k] / (int)$hitung[$k]);
$bobot2[$k] = round($bobot[$k], 20);
$fitness[$k] = 100000 * (float)(1 / (float)$bobot2[$k]);
$fitness2[$k] = round($fitness[$k], 20);
$totalfitness = $totalfitness + (float)$fitness2[$k];
/*echo " Waktu ".$totalwaktu[$k] ."<br>";
echo " Jarak ".(double)$totaljarak[$k] ."<br>";
echo " Biaya".$jumbiaya[$k]."<br>";
echo " Rating".$jumrating[$k]."<br>";
echo " Bensin".$totalbensin2[$k]."<br>";
echo "Total ".$totalbiaya[$k]."<br>";
echo "Hitung ".$hitung[$k]."<br>";
echo " Jumlah".$flag[$k]."<br>";
echo " Bobot".(float)$bobot2[$k]."<br>";
echo " Fitness".(float)$fitness2[$k]."<br>";*/
}
//echo " Total Fitness".(float)$totalfitness."<br>";
for($i=$a1; $i<=$a2; $i++){
$prob_fitness[$i] = (float)$fitness2[$i] / (float)$totalfitness;
$prob_fitness2[$i] = round($prob_fitness[$i], 20);
//
echo " probabilitas Fitness".(float)$prob_fitness2[$i]."<br>";
$totalprob = $totalprob + (float)$prob_fitness2[$i];
$batas_rw[0] = 0;
$batas_rw[$i+1] = $totalprob;
//
echo 'Batasan ' .$batas_rw[$i+1];
}
//
echo " Total probabilitas Fitness".(float)$totalprob."<br>";
$jumlahInd = 0;
for ($i=0; $i<sizeof($gen); $i++){
if ($gen[$i] != NULL){
$jumlahInd++;
}
}
//roullete wheel
//bangkit nilai random
$max = 1;
79
$min = 0;
for($m=$a1; $m<=$a2; $m++){
$cari = (($min + ($max-$min)) * mt_rand(0,
mt_getrandmax()) / mt_getrandmax()) + 0.01 ;
if ($cari == 0){
$cari1 = 0.5 ;
$cari2= round($cari1, 2) ;
}
elseif($cari > 1){
$cari1 = 1;
$cari2 = round($cari1, 2);
}
else {
$cari1 = $cari;
$cari2= round($cari1, 2);
}
$random_rw[$m]= $cari2;
//echo "<br>";
//echo $random_rw[$m];
}
//proses roullete
for($y=$a1; $y<=$a2; $y++){
for($x=$a1; $x<=$a2; $x++){
if($batas_rw[$x]
<
$random_rw[$y]
$random_rw[$y] <= $batas_rw[$x + 1]){
for($k=$awal; $k<$maxgen; $k++){
$gen2[$y][$k] = $gen[$x][$k];
//individu ke y ganti ke $x
}
$fitness21[$y] = $fitness2[$x];
$totalbiaya21[$y] = $totalbiaya2[$x];
}
}
}
//Crossover single point
$probco = 0.7;
for($m=$a1; $m<=$a2; $m++){
and
80
$cross =
mt_getrandmax()) / mt_getrandmax() ;
}
//
echo '<br>';
$co = 0;
$nomorIndividu = array();
$jumlahNomorInd = 0;
for($i=$a1; $i<=$a2; $i++){
if($random_co[$i]<=$probco){
$nomorIndividu[$co] = $i;
}
else{
$nomorIndividu[$co] = -1;
}
$co++;
}
/*for($i=$a1; $i<=$a2; $i++){
echo $nomorIndividu[$i]. '<br>';
}*/
}
for($i=$a1; $i<$jumlahNomorInd; $i++){
echo '<br> individu co : '.$individuCO[$i];
}*/
81
$titikpotong = array();
for($i=$a1; $i<$jumlahNomorInd; $i++){
$titikpotong[$i] = mt_rand(0, $maxgen-1);
}
/*
//outprint
for($i=0;$i<$jumlahNomorInd;$i++)
{
echo '<br> Offspring '.($i+1).' = ';
for($j=0;$j<=49;$j++)
{
echo $offspring[$i][$j].' ';
}
echo '<br>';
}*/
//hitung fitness co
82
for($k=$a1; $k<$jumlahNomorInd;$k++){
$jumwaktuco = array();
$jumjarakco = array();
$r = 0;
$asco = null;
for($j = 0; $j <$maxgen;$j++){
if($offspring[$k][$j] == 1){
$flagco[$k] = (int)$flagco[$k] + 1;
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$queryco = "Select waktu, jarak FROM kunjung where id_asal
= 'A000".($r+1)."' and id_tujuan = 'T000".($j+1)."'";
$asalco = "A000".($r+1);
$tujuanco = "T000".($j+1);
}
elseif($j == 9){
if($r == 9){$queryco = "Select waktu, jarak FROM kunjung
where id_asal = 'A00".($r+1)."' and id_tujuan = 'T00".($j+1)."'";
$asalco = "A00".($r+1);
$tujuanco = "T00".($j+1);}
else{$queryco = "Select waktu, jarak FROM kunjung where
id_asal = 'A000".($r+1)."' and id_tujuan = 'T00".($j+1)."'";
$asalco = "A000".($r+1);
$tujuanco = "T00".($j+1);}
}
elseif($j > 9){
if($r >= 9){$queryco = "Select waktu, jarak FROM kunjung
where id_asal = 'A00".($r+1)."' and id_tujuan = 'T00".($j+1)."'";
$asalco = "A00".($r+1);
$tujuanco = "T00".($j+1);}
else{$queryco = "Select waktu, jarak FROM kunjung where
id_asal = 'A000".($r+1)."' and id_tujuan = 'T00".($j+1)."'";
$asalco = "A000".($r+1);
$tujuanco = "T00".($j+1);}}
$executeco = mysql_query($queryco, $link) or die
('Errorquery : '.$queryco);
//echo "".$j;
if(!isset($jumwaktuco[$k])){$jumwaktuco[$k] = null;}
while($asco =mysql_fetch_assoc($executeco)){
$jumwaktuco[$k]
=
(int)$jumwaktuco[$k]
+
(int)$asco['waktu'] + (int)$inputlama;
$jumjarakco[$k]
=
(double)$jumjarakco[$k]
+
(double)$asco['jarak'];
//echo (int)$as['waktu']." ";
}
//echo $asal." ".$tujuan." ";
83
$r = $j;
$r = ($j+1);
}
$totalwaktuco[$k] = $jumwaktuco[$k];
$totaljarakco[$k] = (double)$jumjarakco[$k];
}
$h = 0;
for($i=0; $i<$jumlahNomorInd; $i++){
if($h!=$jumlahNomorInd)
{
if($totalwaktuco[$i] != 0)
{
for($k=0; $k<$maxgen; $k++){
$individufeaco[$h][$k] = $offspring[$i][$k];
}
$h++;
}
}
}
$jumlahIndco = 0;
for ($i=0; $i<sizeof($individufeaco); $i++){
if ($individufeaco[$i] != NULL){
$jumlahIndco++;
}
}
for ($k=$a1; $k<$jumlahIndco; $k++){
$biayaco = null;
$jumbiayaco =array();
$jumratingco = array();
$totalfitnessco = 0;
for($j = 0; $j <$maxgen;$j++){
if($individufeaco[$k][$j] == 1){
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$querybco = "Select biaya, rating FROM tujuan where
id_tujuan = 'T000".($j+1)."'";
$tujuanco = "T000".($j+1);
}
else{$querybco = "Select biaya, rating FROM tujuan where
id_tujuan = 'T00".($j+1)."'";
$tujuanco = "T00".($j+1);}
$querybiayaco = mysql_query($querybco, $link) or die
('Errorquery : '.$querybco);
if(!isset($jumbiayaco[$k])){$jumbiayaco[$k] = null;}
84
(int)$biayaco['biaya'];
(int)$biayaco['rating'];
while($biayaco = mysql_fetch_assoc($querybiayaco)){
$jumbiayaco[$k]
=
(int)$jumbiayaco[$k]
$jumratingco[$k]
(int)$jumratingco[$k]
(int)$hitungco[$k]);
$totalbiaya2co[$k] = $totalbiayaco[$k];
$hitungco[$k] = (int)$flagco[$k] + (int)$jumratingco[$k];
$bobotco[$k]
=
(float)((int)$totalbiaya2co[$k]
$bobot2co[$k] = round($bobotco[$k], 20);
$fitnessco[$k] = 100000 * (float)(1 / (float)$bobot2co[$k]);
$fitness2co[$k] = round($fitnessco[$k], 20);
$totalfitnessco = $totalfitnessco + (float)$fitness2co[$k];
/*
echo " Waktu ".$totalwaktuco[$k] ."<br>";
echo " Jarak ".(double)$totaljarakco[$k] ."<br>";
echo " Biaya".$jumbiayaco[$k]."<br>";
echo " Rating".$jumratingco[$k]."<br>";
echo " Bensin".$totalbensin2co[$k]."<br>";
echo "Total ".$totalbiayaco[$k]."<br>";
echo "Hitung ".$hitungco[$k]."<br>";
echo " Jumlah".$flagco[$k]."<br>";
echo " Bobot".(float)$bobot2co[$k]."<br>";
echo " Fitness".(float)$fitness2co[$k]."<br>";*/
}
//echo 'jumlah: ' .$jumlahIndco;
//mutasi
$totalGenPerPopulasi = 0;
$jumlahTitikYangDimutasi = 0;
$titikMutasi = array();
$prob_mutasi = 0.02;
$totalGenPerPopulasi = (int)$jumlahIndco * $maxgen;
$jumlahTitikYangDimutasi = (double)$prob_mutasi * (int)$totalGenPerPopulasi;
for($i=$a1; $i<$jumlahTitikYangDimutasi; $i++){
$titikMutasi[$i] = mt_rand(0,$totalGenPerPopulasi-1);
}
85
86
87
}
//echo $asal." ".$tujuan." ";
$z = $j;
$z = ($j+1);
}
$totalwaktumu[$k] = $jumwaktumu[$k];
$totaljarakmu[$k] = (double)$jumjarakmu[$k];
}
}
$mu = 0;
for($i=0; $i<$jumlahIndco; $i++){
if($mu!=$jumlahIndco)
{
if($totalwaktumu[$i] != 0)
{
for($k=0; $k<$maxgen; $k++){
$individufeamu[$mu][$k] = $offspringmu[$i][$k];
}
$mu++;
}
}
}
$jumlahIndmu = 0;
for ($i=0; $i<sizeof($individufeamu); $i++){
if ($individufeamu[$i] != NULL){
$jumlahIndmu++;
}
}
for ($k=$a1; $k<$jumlahIndmu; $k++){
$jumbiayamu =array();
$jumratingmu = array();
$biayamu = null;
$bobot2mu[$k] = 0;
$fitness2mu[$k] = 0;
for($j = 0; $j <$maxgen;$j++){
if($individufeamu[$k][$j] == 1){
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$querybmu = "Select biaya, rating FROM tujuan where
id_tujuan = 'T000".($j+1)."'";
$tujuanmu = "T000".($j+1);
}
88
(int)$biayamu['biaya'];
$tujuanmu = "T00".($j+1);}
$querybiayamu = mysql_query($querybmu, $link) or die
if(!isset($jumbiayamu[$k])){$jumbiayamu[$k] = null;}
while($biayamu =mysql_fetch_assoc($querybiayamu)){
$jumbiayamu[$k]
=
(int)$jumbiayamu[$k]
$jumratingmu[$k]
(int)$jumratingmu[$k]
(int)$biayamu['rating'];
//echo (int)$as['waktu']." ";
}
//echo $asal." ".$tujuan." ";
}
}
$totalbensinmu[$k] = ((double)$totaljarakmu[$k] / 23) *
8000;
(int)$totalbensin2mu[$k];
$totalbiaya2mu[$k] = $totalbiayamu[$k];
$hitungmu[$k] = (int)$flagmu[$k] + (int)$jumratingmu[$k];
$bobotmu[$k]
=
(float)((int)$totalbiaya2mu[$k]
/
(int)$hitungmu[$k]);
$bobot2mu[$k] = round($bobotmu[$k], 20);
$fitnessmu[$k] = 100000 * (float)(1 / (float)$bobot2mu[$k]);
$fitness2mu[$k] = round($fitnessmu[$k], 20);
$totalfitnessmu = $totalfitnessmu + (float)$fitness2mu[$k];
//
}
//echo 'jumlah mu: ' .$jumlahIndmu;
$d = 0;
for($i=0; $i<$jumlahIndmu; $i++){
if($d!=$jumlahIndmu)
{
89
{
for($k=0; $k<$maxgen; $k++){
$individufeasible[$d][$k] = $individufeamu[$i][$k];
}
$fitnessfeasible[$d] = $fitness2mu[$i];
$totalbiayafeasible[$d] = $totalbiayamu[$i];
$totalwaktufeasible[$d] = $totalwaktumu[$i];
$totaljarakfeasible[$d] = $totaljarakmu[$i];
$d++;
}
}
}
/*for($i=0;$i<$jumlahNomorInd;$i++)
{
echo '<br>individu feasible : '.($i+1).' = ';
for($j=0;$j<=49;$j++)
{
echo $individufeasible[$i][$j].' ';
}
echo '<br>';
echo 'fitness feasible :' .$fitnessfeasible[$i];
echo '<br> biaya feasible :' .$totalbiayafeasible[$i];
}
*/
//update generasi
$populasiGab = array();
$fitnessGab = array();
$biayaGab = array();
$jarakGab = array();
$waktuGab = array();
$s = 0;
$q = 0;
$totalIndividu = (int)$jumlahInd + (int)$jumlahIndmu;
for($i=0; $i<$totalIndividu; $i++){
if($i<$jumlahInd){
for($j=0; $j<$maxgen; $j++){
$populasiGab[$i][$j] = $gen[$i][$j];
}
}
else {
for($j=0; $j<$maxgen; $j++){
$populasiGab[$i][$j] = $individufeasible[$s][$j];
}
$s++;
90
}
}
for($i=0; $i<$totalIndividu; $i++){
if($i<$jumlahInd){
$fitnessGab[$i] = $fitness2[$i];
$biayaGab[$i] = $totalbiaya2[$i];
}
else {
$fitnessGab[$i] = $fitnessfeasible[$q];
$biayaGab[$i] = $totalbiayafeasible[$q];
$jarakGab[$i] = $totaljarakfeasible[$q];
$waktuGab[$i] = $totalwaktufeasible[$q];
$q++;
}
}
/*for($i=0; $i<$totalIndividu; $i++){
{
echo '<br>individu gabungan : '.($i+1).' = ';
for($j=0;$j<=49;$j++)
{
echo $populasiGab[$i][$j].' ';
}
echo '<br>';
echo 'fitness gabungan :' .$fitnessGab[$i];
echo '<br> biaya gabungan :' .$biayaGab[$i];
}
}*/
for($i=0; $i<$totalIndividu; $i++){
for($j=$i+1; $j<$totalIndividu; $j++){
if($fitnessGab[$j] > $fitnessGab[$i]){
$tempFitness = $fitnessGab[$i];
$fitnessGab[$i] = $fitnessGab[$j];
$fitnessGab[$j] = $tempFitness;
for($k=0; $k<$maxgen; $k++){
$tempIndividu = $populasiGab[$i][$k];
$populasiGab[$i][$k] = $populasiGab[$j][$k];
$populasiGab[$j][$k] = $tempIndividu;
}
$tempBiaya = $biayaGab[$i];
$biayaGab[$i] = $biayaGab[$j];
$biayaGab[$j] = $tempBiaya;
$tempjarak = $jarakGab[$i];
$jarakGab[$i] = $jarakGab[$j];
$jarakGab[$j] = $tempjarak;
91
$tempwaktu = $waktuGab[$i];
$waktuGab[$i] = $waktuGab[$j];
$waktuGab[$j] = $tempwaktu;
}
}
for($i=0; $i<=9; $i++){
for($j=0; $j<$maxgen; $j++){
$gen[$i][$j] = $populasiGab[$i][$j];
}
$fitnessBaru[$i] = $fitnessGab[$i];
$biayaBaru[$i] = $biayaGab[$i];
$jarakBaru[$i] = $jarakGab[$i];
$waktuBaru[$i] = $waktuGab[$i];
}
for($i=0; $i<$maxgen; $i++){
$bestFitness[0][$i] = $gen[0][$i];
}
$fitnessTerbaik = $fitnessBaru[0];
$biayaTerbaik = $biayaBaru[0];
//
<label
<label
<span
92
<tr> <p>
<td
height='50px'
width='200px'
bgcolor='#2CAF90'>
<label
for="waktu">Biaya <span class="mand"></span></label></td>
<td> <label for="waktu"><?php ?> Rp. <?php echo $biayaTerbaik; ?>
<span class="mand"></span></label></td>
</p> </tr>
<?php
$namatujuan = array();
for($j = 0; $j <$maxgen;$j++){
if($bestFitness[0][$j] == 1){
if($j < 9){
//echo " ".($f+1);
//echo " ".($j+1);
$queryAkhir = "Select tempat_tujuan FROM tujuan where
id_tujuan = 'T000".($j+1)."'";
$tujuanAkhir = "T000".($j+1);
}
else{$queryAkhir = "Select tempat_tujuan FROM tujuan
where id_tujuan = 'T00".($j+1)."'";
$tujuanAkhir = "T00".($j+1);}
$querytempatAkhir = mysql_query($queryAkhir, $link) or die
('Errorquery : '.$queryAkhir);
//echo "".$j;
if(!isset($namatujuan[0][$j])){$namatujuan[0][$j] = null;}
while($namatempat
=
mysql_fetch_assoc($querytempatAkhir)){
$namatujuan[0][$j] = $namatempat['tempat_tujuan'];
//echo (int)$as['waktu']." ";
}
//echo $asal." ".$tujuan." ";
}
}
$indeks = 0;
$flagnama = 0;
//
echo '<br>nama wisata: ';
for($j = 0; $j <$maxgen;$j++){
if($indeks!=$maxgen){
if($bestFitness[0][$j] == 1){
$namatempatwisata[0][$indeks]
=
$namatujuan[0][$j];
$indeks++;
$flagnama = (int)$flagnama + 1;
}
}
93
?>
<tr> <p>
<td
height='50px'
width='200px'
bgcolor='#2CAF90'>
for="waktu">Daftar Nama Wisata <span class="mand"></span></label></td>
<td> <label for="waktu">
<?php
for($j = 0; $j <$flagnama;$j++){
echo $namatempatwisata[0][$j]. ', ';
}
?> <span class="mand"></span></label></td>
</p> </tr>
</table>
</div>
<?php
}
?>
<label
7. Info-wisata.php
<div class="container">
<div class="row">
<div class="col-sm-12">
<p><strong>Ceklist tipe tempat wisata</strong></p>
<form action="#">
<input type="checkbox" id="rekreasibox" data-type="Recreation" class="checkboxA" checked/> Recreation
<input type="checkbox" id="museumbox" data-type="Museum" class="check-boxA"
checked/> Museum
<input type="checkbox" id="tradisionalmarketbox" data-type="Traditional Market"
class="check-boxA" checked/> Traditional Market
<input type="checkbox" id="shoppingcenterbox" data-type="Shopping Center"
class="check-boxA" checked/> Shopping Center
<input type="checkbox" id="kulinerbox" data-type="culinary" class="check-boxA"
checked/> culinary
</form>
<div id="google_map" style="width:100%; height:500px; margin-bottom:20px
;"></div>
</div>
<?php include "info-wisata-isi.php"; ?>
</div>
</div>
<script type="text/javascript" src="filter.js"></script>
<script src="map2.js"></script>
8. Info-wisata-isi.php
<div class="table-responsive">
<table id="data-wisata" class="display table table-th-block table-primary tablebordered">
<thead>
<tr>
94
<th>No</th>
<th>Nama Wisata</th>
<th>Type</th>
<th>Biaya</th>
<th>Rating</th>
<th>Alamat</th>
<th>Latitude</th>
<th>Longitude</th>
</tr>
</thead>
<tbody>
<?php
include "koneksi.php";
$d = 0;
$query = mysql_query("SELECT * FROM tujuan");
while($row=mysql_fetch_assoc($query)){
?>
<tr>
<td><?php echo $d+= 1; ?></td>
<td><?php echo $row['tempat_tujuan']; ?></td>
<td><?php echo $row['type']; ?></td>
<td><?php echo $row['biaya']; ?></td>
<td><?php echo $row['rating']; ?></td>
<td><?php echo $row['alamat']; ?></td>
<td><?php echo $row['lat']; ?></td>
<td><?php echo $row['lng']; ?></td>
</tr>
<?php
} ?></tbody>
</table>
</div>
<!-- <script type="text/javascript" src="filter2.js"></script> -->
<script type="text/javascript">
//$(document).ready( function () {
$('#data-wisata').dataTable();
//} );
</script>
9. Map-process.php
<?php
//PHP 5 +
// database settings
$db_username = 'root';
$db_password = '';
$db_name = 'dbwisata';
$db_host = 'localhost';
95
//mysqli
$mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);
if (mysqli_connect_errno())
{
header('HTTP/1.1 500 Error: Could not connect to db!');
exit();
}
################ Save & delete markers #################
if($_POST) //run only if there's a post data
{
//make sure request is comming from Ajax
$xhr = $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
if (!$xhr){
header('HTTP/1.1 500 Error: Request must come from Ajax!');
exit();
}
// get marker position and split it for database
$mLatLang
= explode(',',$_POST["latlang"]);
$mLat
= filter_var($mLatLang[0], FILTER_VALIDATE_FLOAT);
$mLng
= filter_var($mLatLang[1], FILTER_VALIDATE_FLOAT);
//Delete Marker
if(isset($_POST["del"]) && $_POST["del"]==true)
{
$results = $mysqli->query("DELETE FROM tujuan WHERE lat=$mLat AND
lng=$mLng");
if (!$results) {
header('HTTP/1.1 500 Error: Could not delete Markers!');
exit();
}
exit("Done!");
}
$mId
= filter_var($_POST["id_tujuan"], FILTER_SANITIZE_STRING);
$mNama
=
filter_var($_POST["tempat_tujuan"],
FILTER_SANITIZE_STRING);
$mType
= filter_var($_POST["type"], FILTER_SANITIZE_STRING);
$mBiaya
= filter_var($_POST["biaya"], FILTER_SANITIZE_STRING);
$mRating
= filter_var($_POST["rating"], FILTER_SANITIZE_STRING);
$mAlamat
= filter_var($_POST["alamat"], FILTER_SANITIZE_STRING);
$results = $mysqli->query("INSERT INTO tujuan (id_tujuan, tempat_tujuan, type,
biaya, rating, alamat, lat, lng) VALUES ('$mId', '$mNama', '$mType', '$mBiaya', '$mRating',
'$mAlamat', $mLat, $mLng)");
if (!$results) {
96
$output
=
'<h1
class="marker-heading">
'.$mNama.'</h1><p>Biaya
:
'.$mBiaya.'</p><p>Tipe Wisata : '.$mType.'</p><p>Rating : '.$mRating.'</p><p>Alamat :
'.$mAlamat;
exit($output);
}
################ Continue generating Map XML #################
//Create a new DOMDocument object
$dom = new DOMDocument("1.0");
$node = $dom->createElement("markers"); //Create new element node
$parnode = $dom->appendChild($node); //make the node show up
// Select all the rows in the markers table
$results = $mysqli->query("SELECT * FROM tujuan ");
if (!$results) {
header('HTTP/1.1 500 Error: Could not get markers!');
exit();
}
//set document header to text/xml
header("Content-type: text/xml");
// Iterate through the rows, adding XML nodes for each
while($obj = $results->fetch_object())
{
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("id_tujuan",$obj->id_tujuan);
$newnode->setAttribute("nama",$obj->tempat_tujuan);
$newnode->setAttribute("biaya", $obj->biaya);
$newnode->setAttribute("lat", $obj->lat);
$newnode->setAttribute("lng", $obj->lng);
$newnode->setAttribute("type", $obj->type);
$newnode->setAttribute("alamat", $obj->alamat);
$newnode->setAttribute("rating", $obj->rating);
}
echo
$dom->saveXML();
10. map2.js
var mapCenter = new google.maps.LatLng(-6.1744651, 106.822745); //Google map
Coordinates 47.6145, -122.3418
var map;
97
new
"pasartradisional.png";
if(iconx == 'Recreation') {
myicon = "rekreasi.png";
} else if(iconx == 'Museum') {
myicon = "museum.png";
} else if(iconx == 'Traditional Market') {
myicon
=
} else if(iconx == 'Shopping Center') {
myicon
"shoppingcenter.png";
new
98
} else {
}
myicon = "flag-pink.png";
});
});
//Right Click to Drop a New Marker
google.maps.event.addListener(map, 'rightclick', function(event) {
//Edit form to be displayed with new marker
var
EditForm
=
'<p
class="text-primary"><div
class="marker-edit">'+
'<form
action="ajax-save.php"
method="POST"
name="SaveMarker" id="SaveMarker">'+
'<label for="pId"><span>Id Wisata :</span><input
type="text" name="pId" class="save-id" placeholder="Masukkan id tempat" maxlength="5"
/></label>'+
'<label for="pNama"><span>Nama Tempat :</span><input
type="text" name="pNama" class="save-name" placeholder="Masukkan nama tempat"
maxlength="40" /></label>'+
'<label for="pType"><span>Tipe Wisata :</span> <select
name="pType" class="save-type">'+
'<option value="Recreation">Recreation</option>'+
'<option value="Museum">Museum</option>'+
'<option
value="Traditional
Market">Traditional
Market</option>'+
'<option
value="Shopping
Center">Shopping
Center</option>'+
'<option
value="culinary">culinary</option></select></label>'+
'<label
for="pBiaya"><span>Biaya
:</span><input
type="text" name="pBiaya" class="save-biaya" placeholder="Masukkan Jumlah Biaya"
/></label>'+
'<label
name="pRating" class="save-rating">'+
'<option
'<option
'<option
'<option
'<option
for="pRating"><span>Rating
:</span>
<select
value="1">1</option>'+
value="2">2</option>'+
value="3">3</option>'+
value="4">4</option>'+
value="5">5</option></select></label>'+
99
'</div></p><button
marker">Save Marker Details</button>';
name="save-marker"
class="save-
</p>'+
class="remove-
100
== '')
{
");
}else{
101
position
}
//############### Save Marker Function ##############
function save_marker(Marker, mId, mNama, mType, mBiaya, mRating, mAlamat,
replaceWin)
{
//Save new marker using jQuery Ajax
var mLatLang = Marker.getPosition().toUrlValue(); //get marker position
var myData = {id_tujuan : mId, tempat_tujuan : mNama, type : mType,
latlang : mLatLang, biaya : mBiaya, rating : mRating, alamat : mAlamat }; //post variables
console.log(replaceWin);
$.ajax({
type: "POST",
url: "map_process.php",
data: myData,
success:function(data){
replaceWin.html(data); //replace info window with new html
102
},
error:function (xhr, ajaxOptions, thrownError){
alert(thrownError); //throw any errors
}
});
}
// == a checkbox has been clicked ==
$(".check-boxA").click(function(event){
var type = $(this).attr("data-type");
if (this.checked) {
show(type);
} else {
hide(type);
}
// == rebuild the side bar
// makeSidebar();
});
// == shows all markers of a particular category, and ensures the checkbox is checked ==
function show(type) {
for (var i=0; i<gmarkers.length; i++) {
if (gmarkers[i].mycategory == type) {
gmarkers[i].setVisible(true);
}
}
}
// == hides all markers of a particular category, and ensures the checkbox is cleared ==
function hide(type) {
for (var i=0; i<gmarkers.length; i++) {
if (gmarkers[i].mycategory == type) {
gmarkers[i].setVisible(false);
}
}
infowindow.close();
}
11. Tentangprogram.php
<div class="container">
<div class="row">
<div class="text-center">
<p><h2>Tentang Program</h2></p>
<div class="text-center"><p> <p> <p>
<p><Strong>Sistem Rekomendasi Tempat Wisata</Strong></p>
103
104
<div class="text-center">
<p><h2>Bantuan</h2></p>
<div class="text-center">
<p><strong>Sistem Rekomendasi Tempat Wisata</strong></p>
<table border='1' width="1000px" height="450px" align='center'>
<tr>
<td align='left' width='350px'>Rekomendasi Tempat Wisata -> Input
Waktu</td> <td align='left'>Input waktu berdasarkan jumlah waktu yang dimiliki untuk
berwisata.</td>
</tr>
<tr align='left'>
<td>Rekomendasi Tempat Wisata -> Estimasi Waktu</td> <td>Pilih Estimasi
waktu di masing masing tempat wisata.</td>
</tr>
<tr align='left'>
<td>Rekomendasi Tempat Wisata -> Input Generasi</td> <td>Masukan
jumlah generasi untuk melakukan proses pengoptimalan rekomendasi tempat wisata.</td>
</tr>
<tr>
<td align='left'>Daftar Tempat Wisata -> Peta</td> <td align='left'>Ceklist
tipe tempat wisata yang diinginkan agar dapat terlihat di peta.</td>
</tr>
<tr align='left'>
<td>Daftar Tempat Wisata -> Icon</td> <td>Klik icon tempat wisata yang ada
di peta untuk melihat informasi tempat wisata.</td>
</tr>
<tr align='left'>
<td>Daftar Tempat Wisata -> Icon -> Remove Marker</td> <td>Menghapus
tempat wisata dengan cara menekan link Remove Marker.</td>
</tr>
<tr align='left'>
<td>Daftar Tempat Wisata -> List Table</td> <td>Informasi mengenai tempat
wisata di daerah Jakarta</td>
</tr>
</table>
</div>
</div>
</div>
Backend
1. index.php
<?php
session_start();
if(empty($_SESSION['username'])){
header("location:login.php");
}
include "koneksi.php";
105
include "header.php";
$a = $_GET['page'];
switch ($a) {
case 1:
include "maps.php";
break;
case 2:
include "maps.php";
break;
case 3:
include "info-wisata.php";
break;
case 4:
include "tentangprogram.php";
break;
case 5:
include "licence.php";
break;
case 6:
include "credit.php";
break;
case 7:
include "help.php";
break;
case 8:
include "login.php";
break;
case 9:
include "logout.php";
break;
case 10:
include "masterasal.php";
break;
case 11:
include "mastertujuan.php";
break;
case 12:
106
include "masterkunjung.php";
break;
default:
}
?>
include "home.php";
break;
include "footer.php";
2. header.php
<?php
session_start();
include ("koneksi.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="../assets/img/globe.ico">
<title>Tempat Wisata</title>
<!-- MAIN CSS -->
<link href="../assets/css/bootstrap.css" rel="stylesheet">
<link href="../assets/css/ndoboost.css" rel="stylesheet">
<link href="../assets/css/marker.css" rel="stylesheet">
<!-- PLUGINS CSS -->
<link
href="../assets/plugins/font-awesome/css/font-awesome.css"
rel="stylesheet">
<link
href="../assets/plugins/weather-icon/css/weather-icons.css"
rel="stylesheet">
<link href="../assets/plugins/prettify/prettify.css" rel="stylesheet">
<link
href="../assets/plugins/magnific-popup/magnific-popup.css"
rel="stylesheet">
<link
href="../assets/plugins/owl-carousel/owl.carousel.css"
rel="stylesheet">
<link href="../assets/plugins/owl-carousel/owl.theme.css" rel="stylesheet">
<link
href="../assets/plugins/owl-carousel/owl.transitions.css"
rel="stylesheet">
<!--script
type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script-->
107
<script
type="text/javascript"
src="http://maps.googleapis.com/maps/api/js?key=AIzaSyBfh216DpoAVoV0LPzd1eTgDUNo4
dV8Nek&sensor=false"></script>
<script src="../assets/js/jquery.js"></script>
</head>
<body class="tooltips" onLoad="map_initialize()">
<!-===================================================
BEGIN YOUR CONTENT
===================================================
-->
<nav class="navbar square navbar-primary" role="navigation">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button
type="button"
class="navbar-toggle"
datatoggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="?page=default">Home</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbarcollapse-1">
Bencana</a></li-->
<li><a href="?page=3">Daftar Tempat Wisata</a></li>
<li class="dropdown">
<a href="#fakelink" class="dropdown-toggle" datatoggle="dropdown">Master <b class="caret"></b></a>
<ul
class="dropdown-menu
primary
with-triangle"
role="menu">
<li><a href="?page=10">Master Tempat
Asal </a></li>
108
<li><a href="logout.php">Logout</a></li>
</ul>
</div><!-- /.navbar-collapse $row['id_bencana'];-->
</div><!-- /.container-fluid -->
</nav>
3. Masterasal.php
<?php
include "koneksi.php";
if (isset($_POST['simpan'])) {
$idasal = strip_tags($_POST['idasal']);
$tmptasal = strip_tags($_POST['tmptasal']);
//input ke db
$query= sprintf("INSERT INTO asal VALUES('%s', '%s')",
mysql_escape_string($idasal),
mysql_escape_string($tmptasal)
);
$result = mysql_query($query) or die (mysql_error());
if($result){
echo '<script language="javascript"> alert ("Data
document.location.href="index2.php?page=10";</script>';
} else {
echo '<script language="javascript"> alert
document.location.href="index2.php?page=10";</script>';
}
}
("Data
Berhasil
Disimpan");
Gagal
Disimpan");
if (isset($_POST['edit'])) {
$idasal = strip_tags($_POST['idasal']);
$tmptasal = strip_tags($_POST['tmptasal']);
$query= sprintf("UPDATE asal SET tempat_asal='$tmptasal' WHERE id_asal='$idasal'",
mysql_escape_string($idasal),
mysql_escape_string($tmptasal)
);
$result = mysql_query($query) or die (mysql_error());
if($result){
echo '<script language="javascript"> alert ("Data Berhasil Diubah");
document.location.href="index2.php?page=10";</script>';
109
} else {
echo '<script
language="javascript"> alert
document.location.href="index2.php?page=10";</script>';
}
}
("Data
Gagal
Diubah");
Berhasil
Dihapus");
Gagal
Dihapus");
if (isset($_POST['clear'])) {
$idasal = strip_tags($_POST['idasal']);
$query = sprintf("DELETE FROM asal WHERE id_asal='%s'",
mysql_escape_string($idasal)
);
$result = mysql_query($query) or die (mysql_error());
if($result){
echo '<script language="javascript"> alert ("Data
document.location.href="index2.php?page=10";</script>';
} else {
echo '<script language="javascript"> alert
document.location.href="index2.php?page=10";</script>';
}
}
("Data
?>
<div class="text-center">
<p><h2>Create Tempat Asal</h2></p>
<div class="text-center">
<table border='0' width="500px" height="150px" align='center'>
<form action="" method="post">
<tr > <p>
<td height='50px' width='100px'> <label for="idasal">Id Asal <span
class="mand">*</span></label></td>
<td> <input type="text" id="idasal" name="idasal" style="height:
30px;"/></td>
</p> </tr>
<tr> <p>
<td
>
<label
for="tmptasal">Tempat
Asal
<span
class="mand">*</span></label> </td>
<td> <input type="text" id="tmptasal" name="tmptasal" style="height:
30px;"/> </td>
</p> </tr>
<tr> <p class="buttons">
<td> <button class="btn btn-primary" type="submit" name="simpan"
value="simpan" id="simpan">Save</button> </td>
<td> <button class="btn btn-primary" type="reset" name="clear"
value="clear" id="clear"/>Cancel</button></td>
110
111
height:500px;
margin-bottom:20px
<div class="table-responsive">
<table id="data-wisata" class="display table table-th-block table-primary tablebordered">
<thead>
<tr>
<th>No</th>
<th>Id Tujuan</th>
<th>Nama Wisata</th>
<th>Type</th>
<th>Biaya</th>
<th>Rating</th>
<th>Alamat</th>
<th>Latitude</th>
<th>Longitude</th>
</tr>
</thead>
<tbody>
<?php
include "koneksi.php";
$d = 0;
$query = mysql_query("SELECT * FROM tujuan");
while($row=mysql_fetch_assoc($query)){
?>
<tr>
<td><?php echo $d+= 1; ?></td>
<td><?php echo $row['id_tujuan']; ?></td>
<td><?php echo $row['tempat_tujuan']; ?></td>
<td><?php echo $row['type']; ?></td>
<td><?php echo $row['biaya']; ?></td>
<td><?php echo $row['rating']; ?></td>
<td><?php echo $row['alamat']; ?></td>
<td><?php echo $row['lat']; ?></td>
<td><?php echo $row['lng']; ?></td>
</tr>
<?php
} ?></tbody>
</table>
</div>
<!-- <script type="text/javascript" src="filter2.js"></script> -->
<script type="text/javascript">
//$(document).ready( function () {
$('#data-wisata').dataTable();
112
//} );
</script>
5. Masterkunjung.php
<?php
include "koneksi.php";
if (isset($_POST['simpan'])) {
$idasal = strip_tags($_POST['idasal']);
$idtujuan = strip_tags($_POST['idtujuan']);
$waktu = strip_tags($_POST['waktu']);
$jarak = strip_tags($_POST['jarak']);
//input ke db
$query= sprintf("INSERT INTO kunjung VALUES('%s', '%s', '%s', '%s')",
mysql_escape_string($idasal),
mysql_escape_string($idtujuan),
mysql_escape_string($waktu),
mysql_escape_string($jarak)
);
$result = mysql_query($query) or die (mysql_error());
if($result){
echo '<script language="javascript"> alert ("Data Berhasil
document.location.href="index2.php?page=12";</script>';
} else {
echo '<script language="javascript"> alert
document.location.href="index2.php?page=12";</script>';
}
}
("Data
Gagal
Disimpan");
Disimpan");
if (isset($_POST['edit'])) {
$idasal = strip_tags($_POST['idasal']);
$idtujuan = strip_tags($_POST['idtujuan']);
$waktu = strip_tags($_POST['waktu']);
$jarak = strip_tags($_POST['jarak']);
$query= sprintf("UPDATE kunjung SET waktu='$waktu', jarak='$jarak' WHERE
id_asal='$idasal' && id_tujuan='$idtujuan'",
mysql_escape_string($idasal),
mysql_escape_string($idtujuan),
mysql_escape_string($waktu),
mysql_escape_string($jarak)
);
$result = mysql_query($query) or die (mysql_error());
if($result){
echo '<script language="javascript"> alert ("Data Berhasil Diubah");
document.location.href="index2.php?page=12";</script>';
113
} else {
echo '<script
language="javascript"> alert
document.location.href="index2.php?page=12";</script>';
}
}
("Data
Gagal
Diubah");
if (isset($_POST['clear'])) {
$idasal = strip_tags($_POST['idasal']);
$idtujuan = strip_tags($_POST['idtujuan']);
$query = sprintf("DELETE FROM kunjung WHERE id_asal='%s' && id_tujuan='%s'",
mysql_escape_string($idasal),
mysql_escape_string($idtujuan)
);
$result = mysql_query($query) or die (mysql_error());
if($result){
echo '<script language="javascript"> alert ("Data Berhasil Dihapus");
document.location.href="index2.php?page=12";</script>';
} else {
echo '<script language="javascript"> alert
document.location.href="index2.php?page=12";</script>';
}
}
("Data
Gagal
Dihapus");
?>
<div class="text-center">
<p><h2>Create Kunjung</h2></p>
<div class="text-center">
<table border='0' width="500px" height="150px" align='center'>
<form action="" method="post">
<tr > <p>
<td height='50px' width='100px'> <label for="idasal">Id Asal <span
class="mand">*</span></label></td>
<td> <input type="text" id="idasal" name="idasal" style="height:
30px;"/></td>
</p> </tr>
<tr > <p>
<td height='50px' width='100px'> <label for="idtujuan">Id Tujuan <span
class="mand">*</span></label></td>
<td> <input type="text" id="idtujuan" name="idtujuan" style="height:
30px;"/></td>
</p> </tr>
<tr> <p>
<td > <label for="waktu">Waktu <span class="mand">*</span></label>
</td>
114
</p> </tr>
<tr > <p>
<td height='50px' width='100px'> <label for="jarak">Jarak <span
class="mand">*</span></label></td>
<td> <input type="text" id="jarak" name="jarak" style="height:
30px;"/></td>
</p> </tr>
<tr> <p class="buttons">
<td> <button class="btn btn-primary" type="submit" name="simpan"
value="simpan" id="simpan">Save</button> </td>
<td> <button class="btn btn-primary" type="reset" name="clear"
value="clear" id="clear"/>Cancel</button></td>
<td width='120px'> <button class="btn btn-primary" data-toggle="modal"
type="submit" name="edit" value="edit" id="edit" >Update</button> </td>
<td width='120px'> <button class="btn btn-primary" data-toggle="modal"
type="submit" name="clear" value="clear" id="clear" >Delete</button> </td>
</p></tr>
</form>
</table>
</div>
</div>
<p> </p>
<div class="table-responsive">
<table id="data-wisata" class="display table table-th-block table-primary tablebordered">
<thead>
<tr>
<th>No</th>
<th>Id Tempat Asal</th>
<th>Id Tempat Tujuan</th>
<th>Waktu(Menit)</th>
<th>Jarak(KM)</th>
</tr>
</thead>
<tbody>
<?php
include "koneksi.php";
$d = 0;
$query = mysql_query("SELECT * FROM kunjung");
while($row=mysql_fetch_assoc($query)){
?>
<tr>
<td><?php echo $d+= 1; ?></td>
<td><?php echo $row['id_asal']; ?></td>
<td><?php echo $row['id_tujuan']; ?></td>
<td><?php echo $row['waktu']; ?></td>
<td><?php echo $row['jarak']; ?></td>
115
</tr>
<?php
} ?></tbody>
</table>
</div>
<!-- <script type="text/javascript" src="filter2.js"></script> -->
<script type="text/javascript">
//$(document).ready( function () {
$('#data-wisata').dataTable();
//} );
</script>
7. Login.php
<html>
<head>
<link rel="stylesheet" type="text/css" href="login.css">
</head>
<body>
<div id="kotak">
<div id="atas">
LOGIN ADMIN
</div>
<div id="bawah">
<form method="post" action="proseslogin.php">
<input class="masuk" type="text" autocomplete="off" placeholder="Username
.." name="username"><br/>
<input
class="masuk"
type="password"
autocomplete="off"
placeholder="Password .." name="password"><br/>
<input id="tombol" type="submit" value="Login">
</form>
</div>
</div>
</body>
</html>
8. Proseslogin.php
<?php
session_start();
include ("koneksi.php");
$username = $_POST['username'];
$password = md5($_POST['password']);
//untuk mencegah sql injection
//kita gunakan mysql_real_escape_string
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
116
from
login
where
username='$username'
and
if (mysql_num_rows($q) == 1) {
//kalau username dan password sudah terdaftar di database
//buat session dengan nama username dengan isi nama user yang login
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
//redirect ke halaman index
header('location:index.php?page=default');
} else {
//kalau username ataupun password tidak terdaftar di database
// header('location:index.php?page=8?error=4');
echo '<script language="javascript"> alert ("Login Gagal, Silahkan Coba Lagi...");
document.location.href="index.php?page=8?error=4";</script>';
}
?>
9. Logout.php
<?php
session_start();
session_destroy();
header("location:login.php");
?>