Tesis Priyo Puji Nugroho

advertisement
MULTI-OBJECTIVE GENETIC ALGORITHM UNTUK
PENENTUAN PELABUHAN PERIKANAN TERBAIK
DALAM PENYEDIAAN HASIL TANGKAPAN
PRIYO PUJI NUGROHO
SEKOLAH PASCASARJANA
INSTITUT PERTANIAN BOGOR
BOGOR
2016
PERNYATAAN MENGENAI TESIS DAN
SUMBER INFORMASI SERTA PELIMPAHAN HAK CIPTA
Dengan ini saya menyatakan bahwa tesis berjudul Multi-Objective Genetic
Algorithm untuk Penentuan Pelabuhan Perikanan Terbaik dalam Penyediaan Hasil
Tangkapan adalah benar karya saya dengan arahan dari komisi pembimbing dan
belum diajukan dalam bentuk apa pun kepada perguruan tinggi mana pun. Sumber
informasi yang berasal atau dikutip dari karya yang diterbitkan maupun tidak
diterbitkan dari penulis lain telah disebutkan dalam teks dan dicantumkan dalam
Daftar Pustaka di bagian akhir tesis ini.
Dengan ini saya melimpahkan hak cipta dari karya tulis saya kepada Institut
Pertanian Bogor.
Bogor, Januari 2016
Priyo Puji Nugroho
NRP G651120391
RINGKASAN
PRIYO PUJI NUGROHO. Multi-Objective Genetic Algorithm untuk Penentuan
Pelabuhan Perikanan Terbaik dalam Penyediaan Hasil Tangkapan. Dibimbing oleh
HERU SUKOCO dan IIN SOLIHIN.
Dalam perdagangan dan industri perikanan, ketersediaan ikan merupakan
faktor penting karena ikan merupakan bahan baku utama dalam industri perikanan.
Tingginya permintaan ikan dan pasokan yang terbatas menyebabkan industri
perikanan harus mengambil bahan baku dari beberapa pelabuhan. Pemilihan
pelabuhan sebagai penyedia hasil tangkapan dipengaruhi oleh banyak faktor seperti
jarak, biaya pembelian, ketersediaan ikan, keragaman ikan, dan kemudahan
layanan. Faktor-faktor tersebut dapat saling mempengaruhi, sehingga
pengoptimalan pada salah satu faktor saja dapat menyebabkan kerugian yang
diakibatkan oleh faktor yang lain.
Dalam penelitian ini, algoritme genetika digunakan untuk menentukan
kombinasi pelabuhan dan alokasi pembelian ikan pada setiap pelabuhan sehingga
diperoleh biaya pembelian dan jarak terbaik berdasarkan suatu posisi. Algoritme
genetika yang digunakan merupakan salah satu varian algoritme genetika multi
tujuan bernama Non-Dominated Sorting Genetic Algorithm. Algoritme ini
memungkinkan optimasi yang melibatkan beberapa objective.
Representasi individu dalam algoritme genetika yang digunakan terdiri atas
tiga kromosom yang mewakili pelabuhan, spesies ikan, dan jumlah pembelian ikan
pada setiap pelabuhan. Setiap kromosom terdiri dari beberapa gen. Satu gen pada
kromosom pertama mewakili satu pelabuhan, gen pada kromosom kedua mewakili
satu spesies ikan, sedangkan satu gen pada kromosom ketiga mewakili jumlah
pembelian salah satu spesies ikan pada satu pelabuhan. Satu individu mewakili satu
solusi yang merepresentasikan pelabuhan-pelabuhan yang terpilih dan jumlah
pembelian setiap spesies ikan pada masing-masing pelabuhan.
Perhitungan nilai fitness pada kasus ini menggunakan tiga fungsi. Fungsi
pertama menghitung akumulasi jarak yang harus ditempuh untuk mencapai
pelabuhan. Fungsi kedua menghitung biaya yang harus dikeluarkan untuk membeli
ikan yang dibutuhkan. Fungsi ketiga digunakan untuk menentukan apakah
pelabuhan yang terpilih dapat memenuhi seluruh kebutuhan ikan atau tidak. Ketiga
fungsi tersebut saling mempengaruhi sehingga penggunaan algoritme genetika
multi tujuan menjadi pilihan yang tepat karena menghasilkan beberapa solusi yang
mempertimbangkan semua fungsi.
Algoritme genetika dalam penelitian ini menggunakan dua jenis crossover
yaitu PMX crossover dan arithmetic crossover. PMX crossover digunakan pada
kromosom pelabuhan sedangkan arithmetic crossover digunakan pada kromosom
pembelian ikan. Dua jenis mutasi yang merupakan modifikasi dari kedua jenis
crossover tersebut juga digunakan. Penggunaan beberapa jenis crossover dan
mutasi disebabkan oleh setiap kromosom memiliki karakter yang berbeda.
Kromosom pelabuhan berupa skala nominal sehingga pertukaran gen dalam
kromosom ini dapat dilakukan dengan mudah. Akan tetapi, kromosom jumlah
pembelian ikan berupa skala rasio dan memiliki nilai berupa bilangan real, sehingga
pertukaran gen sederhana tidak dapat digunakan pada kromosom ini. Oleh karena
itu, crossover yang diterapkan pada kromosom jumlah pembelian ikan yaitu
arithmetic crossover karena kromosom tersebut memiliki nilai berupa bilangan
real.
Pembuatan generasi baru melalui proses crossover dan mutasi dilakukan terus
menerus hingga termination criteria terpenuhi. Termination criteria kriteria yang
digunakan yaitu ketika jumlah generasi telah mencapai angka tertentu atau
algoritme genetika dinyatakan telah konvergen. Dalam kasus ini, algoritme
genetika dinyatakan konvergen apabila nilai fitness dalam sepuluh generasi tidak
mengalami perbaikan.
Beberapa variasi ukuran populasi, probabilitas crossover dan probabilitas
mutasi dicoba untuk mendapatkan hasil yang terbaik dengan cepat. Percobaan
menunjukkan bahwa ukuran populasi GA yang terbaik adalah 50, nilai terbaik Pc
adalah 1 dan nilai terbaik Pm adalah 0,1 atau 0,2. Percobaan masih memerlukan
waktu eksekusi yang cukup lama, yaitu sekitar 18 hingga 55 detik.
Implementasi algoritme genetika dilakukan dengan membuat sebuah aplikasi
mobile untuk menentukan kombinasi pelabuhan serta jumlah ikan yang sebaiknya
dibeli pada setiap pelabuhan. Pengguna cukup memasukkan kebutuhan ikan yang
diinginkan kemudian sistem menghasilkan beberapa kemungkinan solusi yang
dapat dipilih oleh pengguna. Pemilihan satu dari beberapa solusi terbaik tersebut
diserahkan kepada pengguna karena setiap pengguna memiliki kecenderungan yang
berbeda dalam menentukan objective mana yang lebih diutamakan.
Penelitian ini masih memiliki banyak keterbatasan seperti data yang tidak
aktual, mekanisme pengujian sistem yang belum sempurna dan waktu eksekusi
program yang cukup lama. Dengan demikian, penelitian lanjutan untuk
memperbaiki performa dan akurasi program masih perlu dilakukan. Selain itu
penelitian selanjutnya sebaiknya menggunakan data realtime sehingga sesuai
dengan kondisi di lapangan.
Kata kunci: NSGA II, multi-objective, algoritme genetika, penyediaan hasil
tangkapan, aplikasi mobile
SUMMARY
PRIYO PUJI NUGROHO. Multi-Objective Genetic Algorithm for Determination
of The Best Fishing Port in Fish Providing. Supervised by HERU SUKOCO and
IIN SOLIHIN.
In a fishing industry and trading, the availability of fish is an essential factor
because the fish is the main raw material for the industry. High demand for fish and
its limited supply cause the industry requests the fish from several ports. The
selection of the ports as fish provider involving some elements e.g. distance, price,
fish availability, fish variety, and ease of service. The elements affect each other so
that optimizing only one element may cause disadvantages that caused by other
elements.
In this study, Genetic Algorithm was used to determine the port combination
and the allocation of the purchase for each chosen port to get the best price and
distance based on a position. We implement a variant of the multi-objective genetic
algorithm named Non-Dominated Sorting Genetic Algorithm. This algorithm
provides an optimization that involves multiple objectives.
A non-uniform individual representation containing three chromosomes was
used here. The three chromosomes represent fishing ports, fish species, and the
weight of fish should be purchased in each fishing port. In genetic algorithm term,
a chromosome is a set of genes. A single gene in the first chromosome represents a
port, a gene in the second chromosome represents a fish species while a gene in the
third chromosome represents the weight of fish should be purchased in the port. So,
a single individual represents a solution that contains selected ports and the weight
of fish should be purchased at each port.
In this research, the calculation of fitness value implements three functions.
The first function calculates the total distance to reach all the chosen ports. The
second function calculates the total cost to purchase fish. The third function is used
to determine whether the selected ports can fulfill all the needs of the fish. The three
functions affect each other so that the use of the multi-objective genetic algorithm
is appropriate because it produces some solutions that consider all of the functions.
We combine two kinds of crossover namely PMX crossover and arithmetic
crossover. PMX crossover is used for the port chromosome while the arithmetic
crossover is used for fish purchasing chromosome. Similarly, two kinds of mutation
which are the modification of the crossover are implemented here. The use of
several types of crossover and mutation caused by every chromosome has a
different character. The port chromosome contains nominal scale values so that the
exchange of genes in this chromosome can be done easily. However, the fish
purchasing chromosome contains ratio scale values which values are real numbers,
so that a simple gene exchange can not be implemented on this chromosome.
Therefore, the purchasing chromosomes applied an arithmetic crossover because
the chromosome’s values are real numbers.
The creation of the new generation through crossover and mutation process
carried out continuously until the termination criteria are met. The termination
criteria are: when the number of generations has reached a certain number or when
the genetic algorithms have converged. In this case, the genetic algorithm is
considered as converge if the fitness value is not improved in ten generations.
We tested several variations of population size, crossover probability, and
mutation probability to obtain the best output quickly. The experiments show that
the best number of population for the GA is 50, the best value of Pc is 1 and the
best value of Pm is 0.1 or 0.2. The experiments still experienced long execution
time about 18 to 55 seconds.
The implementation of the genetic algorithm is done by creating a mobile
application to determine the combination of the port as well as the number of fish
to be bought on each port. The user simply enters the needs of the fish and then the
system generates several possible solutions that can be selected by the user. The
selection of one of the best solutions can be done by the user because each user has
a different preference to decide which objectives are more dominant.
This study still has many limitations such as the lack of actual data, system
testing mechanisms that should be improved and the long program execution time.
Thus, further research to improve the performance and accuracy of the program
need to be done. The further research should be done by using the real data.
Keywords: NSGA II, multi-objective, genetic algorithm, fish provisioning
© Hak Cipta Milik IPB, Tahun 2016
Hak Cipta Dilindungi Undang-Undang
Dilarang mengutip sebagian atau seluruh karya tulis ini tanpa mencantumkan atau
menyebutkan sumbernya. Pengutipan hanya untuk kepentingan pendidikan,
penelitian, penulisan karya ilmiah, penyusunan laporan, penulisan kritik, atau
tinjauan suatu masalah; dan pengutipan tersebut tidak merugikan kepentingan IPB
Dilarang mengumumkan dan memperbanyak sebagian atau seluruh karya tulis ini
dalam bentuk apa pun tanpa izin IPB
MULTI-OBJECTIVE GENETIC ALGORITHM UNTUK
PENENTUAN PELABUHAN PERIKANAN TERBAIK
DALAM PENYEDIAAN HASIL TANGKAPAN
PRIYO PUJI NUGROHO
Tesis
sebagai salah satu syarat untuk memperoleh gelar
Magister Ilmu Komputer
pada
Program Studi Ilmu Komputer
SEKOLAH PASCASARJANA
INSTITUT PERTANIAN BOGOR
BOGOR
2016
Penguji Luar Komisi pada Ujian Tesis: Irman Hermadi, SKom MS PhD
Judul Tesis : Multi-Objective Genetic Algorithm untuk Penentuan Pelabuhan
Perikanan Terbaik dalam Penyediaan Hasil Tangkapan
Nama
: Priyo Puji Nugroho
NIM
: G651120391
Disetujui oleh
Komisi Pembimbing
Dr Heru Sukoco, SSi MT
Ketua
Dr Iin Solihin, SPi MSi
Anggota
Diketahui oleh
Ketua Program Studi
Ilmu Komputer
Dekan Sekolah Pascasarjana
Dr Wisnu Ananta Kusuma, ST MT
Dr Ir Dahrul Syah, MScAgr
Tanggal Ujian: 30 Oktober 2015
Tanggal Lulus:
PRAKATA
Puji dan syukur penulis panjatkan kepada Allah subhanahu wa ta’ala atas
segala karunia-Nya sehingga karya ilmiah ini berhasil diselesaikan. Tema yang
dipilih dalam penelitian ialah aplikasi untuk perikanan, dengan judul MultiObjective Genetic Algorithm untuk Penentuan Pelabuhan Perikanan Terbaik dalam
Penyediaan Hasil Tangkapan.
Terima kasih penulis ucapkan kepada Dr Heru Sukoco, SSi MT dan Dr Iin
Solihin, SPi MSi selaku pembimbing. Terima kasih juga disampaikan kepada
Ayahanda Bapak Soenarto Sujud dan Ibunda Djumiati, istri tercinta Fitri Insani, ST
Mkom serta seluruh anggota keluarga atas segala dukungan, do’a, dan kasih
sayangnya. Semoga Allah subhanahu wa ta’ala selalu merahmati kalian. Untuk
ananda Maryam Adzkannisa yang senantiasa menemani dan menghibur ayah
selama menyelesaikan tugas akhir, semoga kelak Allah menjadikanmu anak
sholihah yang cerdas. Terima kasih kepada pengelola pasca sarjana, seluruh dosen
dan staf akademik Ilmu Komputer Institut Pertanian Bogor, teman-teman angkatan
14. Program Studi Ilmu Komputer atas kebersamaan dan bantuannya selama kuliah
dan penyelesaian penelitian ini. Semoga karya ini dapat bermanfaat. Kritik dan
saran sangat penulis harapkan demi kesempurnaan karya ini di kemudian hari.
Semoga karya ilmiah ini bermanfaat.
Bogor, Januari 2016
Priyo Puji Nugroho
DAFTAR ISI
DAFTAR TABEL
xiii
DAFTAR GAMBAR
xiii
DAFTAR LAMPIRAN
xiv
1 PENDAHULUAN
Latar Belakang
Perumusan Masalah
Tujuan Penelitian
Manfaat Penelitian
Ruang Lingkup Penelitian
1
1
2
2
2
2
2 METODE
Analisis Sistem
Perancangan Algoritme Genetika
Perancangan Sistem
Perancangan dan Integrasi Jaringan
Perancangan Arsitektur Aplikasi dan Perangkat Lunak
Perancangan User Interface
Perancangan System Interface
Perancangan dan Integrasi Basis Data
Pembuatan Prototipe
Implementasi
Pengujian Sistem
2
3
3
4
4
5
5
6
6
6
6
6
3 HASIL DAN PEMBAHASAN
Analisis Sistem
Aliran Hasil Tangkapan di Pelabuhan Brondong, Lamongan
Aliran Hasil Tangkapan di Pelabuhan Bajomulyo, Juwana, Pati
Aliran Hasil Tangkapan di Pelabuhan Morodemak, Jawa Tengah
Aliran Hasil Tangkapan di Pelabuhan Muara Angke, Jakarta
Kebutuhan Bahan Baku bagi Pedagang dan Industri Perikanan
Data Perikanan pada PIPP
Penentuan Objektif untuk Multi-Objective Genetic Algorithm
Rancangan Algoritme Genetika
Representasi Individu
Inisialisasi Populasi
Fitness Function
Seleksi Individu
Operator Genetik
PMX Crossover
Arithmetic Crossover
Mutasi
Mutasi pada Kromosom Pelabuhan
Mutasi pada Kromosom Pembelian Ikan
Perancangan Termination Criteria
6
6
7
7
8
8
9
9
9
10
10
11
12
13
17
17
18
19
19
19
20
Rancangan Sistem
Perancangan dan Integrasi Jaringan
Perancangan Arsitektur Aplikasi dan Perangkat Lunak
Perancangan User Interface
Perancangan dan Integrasi Basis Data
Perancangan System Interface
Implementasi
Pengujian
21
21
22
25
26
27
27
32
4 SIMPULAN DAN SARAN
Simpulan
Saran
34
34
34
DAFTAR PUSTAKA
35
LAMPIRAN
37
RIWAYAT HIDUP
52
DAFTAR TABEL
1
2
3
4
Entitas tabel pada basis data
Pengaruh variasi ukuran populasi
Pengaruh variasi Pc
Pengaruh variasi Pm
27
33
33
33
DAFTAR GAMBAR
1 Tahapan penelitian
2 Diagram alir algoritma genetika dengan NSGA II
3 Aktivitas yang dilakukan pada tahap perancangan sistem
4 Aliran Hasil Tangkapan di Pelabuhan Brondong
5 Aliran Hasil Tangkapan di Pelabuhan Bajomulyo
6 Aliran Hasil Tangkapan di Pelabuhan Morodemak
7 Aliran Hasil Tangkapan di Pelabuhan Muara Angke
8 Use case diagram petugas pelabuhan pada PIPP
9 Representasi individu pada GA untuk 2 output pelabuhan dan 3 spesies ikan
10 Inisialisasi populasi
11 Contoh salah satu individu hasil inisialisasi populasi
12 Contoh truncating selection, dengan ukuran populasi 10
13 Non-dominated sorting pada NSGA II
14 Perhitungan crowding distance
15 Tournament selection
16 Titik penentu crossover dan mutasi pada sebuah individu
17 Contoh PMX crossover (1)
18 Contoh PMX crossover (2)
3
4
5
7
7
8
8
10
11
11
12
14
15
15
16
17
17
18
19 Contoh arithmetic crossover dengan α = 0.1
20 Contoh mutasi pada kromosom pelabuhan
21 Mutasi pada kromosom pembelian ikan
22 Penentuan nilai konvergen
23 Topologi sistem
24 Context Diagram
25 DFD level 1
26 DFD level 2 untuk Use Case 2
27 Diagram alir algoritme genetika
28 Tampilan depan sistem
29 Tampilan menu aplikasi
30 Tampilan input posisi asal dan jumlah output pelabuhan
31 Tampilan input kebutuhan ikan
32 Tampilan rekomendasi pembelian ikan
33 Entity Relationship Diagram (ERD)
34 System interface pada sistem
35 Hasil perhitungan pada generasi ke-1
36 Hasil perhitungan pada generasi ke-5
37 Hasil perhitungan pada generasi ke-10
38 Hasil perhitungan pada generasi ke-25
39 Hasil perhitungan pada generasi ke-50
40 Hasil perhitungan pada generasi ke-100
41 Instalasi sistem
42 Pengaruh ukuran populasi terhadap perolehan titik konvergen
43 Pengaruh peluang crossover terhadap perolehan titik konvergen
44 Pengaruh peluang mutasi terhadap perolehan titik konvergen
19
19
20
20
21
22
23
24
24
25
25
25
25
26
26
27
28
29
29
30
30
31
32
32
33
34
DAFTAR LAMPIRAN
1 Source Code Pembacaan Variabel pada R
2 Source Code Fungsi-fungsi NSGA II pada R
3 Source Code Program Utama Algoritme Genetika pada R
37
38
50
1
1 PENDAHULUAN
Latar Belakang
Produk perikanan merupakan salah satu produk yang sangat penting di
Indonesia. Hal ini didukung dengan kondisi geografis Indonesia yang berupa
kepulauan dan sebagian besar wilayahnya berupa lautan. Menurut laporan Badan
Pusat Statistik tahun 2012, produksi perikanan tangkap di Indonesia selama satu
dekade terakhir terus mengalami peningkatan. Hingga tahun 2012, hasil perikanan
tangkap mencapai 5.06 juta ton per tahun (BPS 2013).
Distribusi produk perikanan tangkap yang berupa ikan segar maupun ikan
olahan melibatkan beberapa pihak seperti bakul besar/kecil, juragan, pengolah ikan,
pasar ikan, dan eksportir (Murdiyanto 2003; Unep 2009). Untuk memperoleh
produk yang terbaik dalam hal kualitas dan kuantitas, banyak faktor yang perlu
mereka pertimbangkan seperti faktor jarak, harga ikan, pasar, transportasi,
kemudahan layanan, pengawetan dan kualitas ikan pada setiap pelabuhan. Saat ini
para distributor mempertimbangkan faktor-faktor di atas secara intuitif untuk
memilih pelabuhan sehingga hasil pertimbangan sangat bergantung pada
pengalaman dan jaringan yang dimiliki (Darmawan 2006; Malik 2006; Aryadi
2007; Bangun 2010; Tanjung 2012).
Lokasi pembelian ikan juga menambah rumit masalah yang dihadapi. Sebagai
contoh, pembelian pada satu lokasi bisa saja menghemat biaya akan tetapi belum
tentu satu lokasi dapat memenuhi kebutuhan bahan baku ikan yang diinginkan.
Sebaliknya, pemenuhan kebutuhan bahan baku ikan dapat diperoleh dari banyak
pelabuhan namun akan meningkatkan biaya yang harus dikeluarkan. Permasalahan
tersebut menimbulkan kondisi saling berlawanan (conflicting), di mana apabila
salah satu objective ingin dioptimalkan maka objective yang lain menjadi tidak
optimal, demikian juga sebaliknya.
Di sisi lain, teknik untuk mencari optimasi dalam suatu masalah telah banyak
berkembang. Salah satu algoritme optimasi yang dapat digunakan yaitu algoritme
genetika (GA). GA merupakan algoritme optimasi yang mengadopsi teori evolusi
dalam memperoleh solusi terbaik. Algoritme ini banyak digunakan karena
memiliki kelebihan seperti dapat menangani masalah dengan jumlah variabel input
dan output yang besar dalam waktu yang relatif singkat (Zhang and Rockett 2008).
Permasalahan pemilihan pelabuhan yang telah dibahas dapat digolongkan
dalam permasalahan optimasi yang melibatkan beberapa variabel sebagai objective.
Dengan demikian permasalahan ini dapat diselesaikan dengan pendekatan multiobjective genetic algorithm (MOGA). Pemanfaatan MOGA dapat mempermudah
para distributor hasil tangkapan dalam menentukan pelabuhan terbaik dalam
penyediaan hasil tangkapan.
Beberapa kasus pada penelitian sebelumnya yang memanfaatkan GA dan
multi-objective genetic algorithm antara lain optimasi jaringan kabel untuk wind
farm yang mempertimbangkan biaya, energi, dan kehandalan jaringan (Pemberton
et al. 2013), optimasi jaringan air dan selokan yang mempertimbangkan biaya
kerusakan, dan tingkat layanan air (Atef et al. 2012), distribusi tugas dalam
menyelesaikan pekerjaan (Harper et al. 2005), serta pendugaan otomatis sistesis
ucapan (Arajo et al. 2012).
2
Pada penelitian ini, MOGA diimplementasikan pada aplikasi mobile. Hal ini
dilakukan karena pemanfaatan aplikasi mobile saat ini tidak hanya menjadi media
komunikasi, akan tetapi mulai digunakan sebagai perangkat yang mendukung
kegiatan pertanian (Ye et al. 2010; The World Bank 2011; Brugger 2011; Qiang et
al. 2011; Kimbahune et al. 2013).
Perumusan Masalah
Permasalahan yang dibahas pada penelitian ini yaitu bagaimana para
distributor produk perikanan tangkap menentukan pelabuhan perikanan sebagai
tempat pembelian ikan. Terdapat beberapa faktor yang dapat mempengaruhi
pemilihan pelabuhan yang tepat dalam penyediaan hasil tangkapan. Dengan
demikian, diperlukan suatu cara untuk menentukan solusi pelabuhan terbaik dengan
mempertimbangkan beberapa faktor yang berpengaruh.
Tujuan Penelitian
Penelitian ini bertujuan untuk:
1 Mengembangkan aplikasi mobile untuk memberikan rekomendasi pelabuhan
terbaik dalam penyediaan hasil tangkapan dengan menggunakan multi-objective
genetic algorithm.
2 Mengetahui proses bisnis yang terjadi pada pelabuhan perikanan.
Manfaat Penelitian
Hasil penelitian ini diharapkan dapat memberikan kemudahan bagi para
pedagang dan industri perikanan dalam menentukan pelabuhan yang menyediakan
produk perikanan. Lebih jauh lagi, apabila distributor memperoleh harga yang
murah, maka diharapkan para konsumen juga memperoleh harga hasil tangkapan
yang lebih murah.
Ruang Lingkup Penelitian
Dalam penelitian ini, algoritme yang digunakan untuk menentukan pelabuhan
terbaik adalah multi-objective genetic algorithm. Aplikasi mobile yang
dikembangkan berbasis Android. Studi kasus penelitian ini dilakukan di pelabuhan
Brondong, Juwana, Demak, dan Muara Angke.
2 METODE
Metode penelitian yang digunakan dalam penelitian ini dapat dilihat pada
Gambar 1. Penelitian dibagi menjadi 4 tahapan utama, yaitu analisis sistem,
perancangan algoritme genetika, perancangan sistem, dan implementasi.
Perancangan sistem terdiri dari perancangan user interface, jaringan, basis data,
arsitektur aplikasi, dan system interface (Satzinger et al. 2011).
3
Analisis Sistem





Pada tahap analisis sistem, terdapat beberapa hal yang dilakukan, yaitu:
Memperoleh informasi mengenai segala sesuatu yang dapat dilakukan oleh
sistem
Mendefinisikan kebutuhan sistem sehingga sistem dapat bekerja dengan baik
Membuat prioritas terhadap kebutuhan sistem
Memastikan apakah sistem yang dikembangkan sudah sesuai dengan kebutuhan
Melakukan evaluasi terhadap beberapa kemungkinan solusi untuk
menyelesaikan masalah yang ada.
Mulai
Analisis sistem
Perancangan algoritme genetika untuk penentuan pelabuhan
Representasi
individu
Inisialisasi
populasi
Fitness
function
Seleksi
operator
genetik
Termination
criteria
Perancangan sistem
Perancangan
jaringan
Perancangan
aplikasi
Perancangan
user interface
Perancangan
system interface
Perancangan
basis data
Implementasi
Selesai
Gambar 1 Tahapan penelitian
Perancangan Algoritme Genetika
Pada tahap ini, dibuat suatu algoritma yang digunakan untuk menyelesaikan
masalah pencarian pelabuhan terbaik sebagai penyedia ikan. Algoritma yang
digunakan adalah algoritma genetika, dengan demikian beberapa hal yang perlu
dilakukan pada tahap ini yaitu:
 Penentuan representasi individu
 Penentuan inisialisasi populasi
4
 Penentuan fitness function
 Penentuan metode seleksi individu pada suatu populasi
 Penentuan operator genetik yang akan digunakan
 Penentuan termination kriteria
Diagram alir algoritme genetika yang digunakan dapat dilihat pada Gambar 2
Start
Population
Initialization
Evaluation
Mutation
Crossover
No
is
terminated?
Selection
Non-Dominated
Sorting
Yes
Tournament
Selection
Finish
Gambar 2 Diagram alir algoritma genetika dengan NSGA II
NSGA II merupakan salah satu variasi Multi-Objective Genetic Algorithm
(MOGA). Algoritme ini mempertimbangkan apakah setiap nilai fitness pada satu
kromosom dapat mendominasi nilai fitness kromosom yang lain. Secara umum
NSGA berjalan seperti GA pada umumnya, akan tetapi ada penambahan fungsi
Non-Dominated Sorting pada tahap seleksi individu.
Perancangan Sistem
Dalam membangun sebuah sistem, terdapat beberapa hal yang perlu
dipersiapkan seperti pada Gambar 3 (Satzinger et al. 2011).
Perancangan dan Integrasi Jaringan
Sistem yang diusulkan terdiri dari berbagai perangkat seperti server aplikasi,
perangkat mobile, dan server basis data. Selain itu, sistem juga berinteraksi dengan
suatu jaringan internet dan sistem lain berupa basis data perikanan yang disediakan
oleh PIPP. Dengan demikian, pada tahap ini dilakukan pembuatan topologi jaringan
untuk menghubungkan semua perangkat yang dibutuhkan menjadi satu kesatuan
sistem.
5
Perancangan Arsitektur Aplikasi dan Perangkat Lunak
Tahap ini menentukan bagaimana setiap aktivitas pada sistem ditangani oleh
pengguna atau komputer. Dengan kata lain pada tahap ini ditentukan bagaimana
logika sistem bekerja. Selain itu komponen-komponen dan modul program juga
ditentukan pada bagian ini. Untuk mempermudah pembuatan arsitektur aplikasi
tersebut, maka perlu dibuat Use Case Diagram, Data Flow Diagram, dan Squence
Diagram.
Perancangan user interface
menghasilkan form, laporan,
serta kontrol input dan output
Perancangan
basis data
menentukan
struktur basis
data yang
digunakan
Perancangan jaringan menentukan
hardware dan middleware yang
menghubungkan seluruh sistem
Perancangan aplikasi
menggambarkan program
komputer dan modul-modul
yang digunakan
Perancangan System interface
menentukan interaksi suatu
sistem terhadap sistem lain
Sistem yang
dibangun
Gambar 3 Aktivitas yang dilakukan pada tahap perancangan sistem
Perancangan User Interface
User interface merupakan bagian yang penting dalam suatu sistem karena
menentukan bagaimana seorang pengguna dapat berinteraksi dengan sistem.
Dalam kasus ini sistem yang dibangun berupa aplikasi mobile, dengan demikian
pengguna berinteraksi dengan sistem melalui tampilan grafis pada suatu perangkat
mobile. Pada tahap ini, suatu interface yang interaktif dan mudah dibuat untuk
memenuhi kebutuhan interaksi antara pengguna dan sistem.
6
Perancangan System Interface
Sistem yang dibangun melibatkan data perikanan yang dimiliki oleh PIPP.
Untuk menghubungkan sistem internal dengan sistem eksternal (PIPP) diperlukan
sebuah system interface. System interface menentukan bagaimana sebuah sistem
dapat berinteraksi dengan sistem lainnya.
Perancangan dan Integrasi Basis Data
Pada tahap ini, ditentukan bagaimana semua informasi yang diperlukan oleh
sistem disimpan. Informasi yang ada pada system ini disimpan dalam bentuk basis
data relasional. Berikut ini merupakan langkah-langkah yang dilakukan dalam
melakukan desain basis data relasional:
1 Pembuatan tabel untuk setiap entitas.
2 Pemilihan satu primary key pada setiap tabel.
3 Penentuan foreign keys untuk merepresentasikan one-to-many relationship.
4 Pembuatan tabel untuk merepresentasikan many-to-many relationships.
5 Penentuan batasan referential integrity.
6 Melakukan evaluasi terhadap kualitas skema.
7 Menentukan tipe data yang sesuai.
Pembuatan Prototipe
Prototype dibuat untuk menguji apakah desain sistem telah sesuai dengan
kebutuhan sistem. Selain itu protoype juga berguna untuk meyakinkan apakah user
interface yang telah dirancang sudah sesuai dengan perilaku pengguna. Basis data,
rancangan jaringan, dan lingkungan program juga dapat diuji melalui pembuatan
prototype.
Implementasi
Pada tahap ini, hal-hal yang dilakukan yaitu: pembuatan komponen software,
verifikasi dan pengujian sistem, konversi data, pembuatan dokumen, serta instalasi
sistem.
Pengujian Sistem
Uji coba algoritme dilakukan untuk menentukan nilai Peluang Crossover
(Pc), Peluang Mutasi (Pm), pembobotan parameter, dan validasi hasil. Masingmasing variabel tersebut divariasikan pada beberapa nilai untuk memperoleh
algoritme yang memberikan hasil optimal dan valid. Validasi dilakukan bersama
pakar pelabuhan di Fakultas Perikanan IPB.
3 HASIL DAN PEMBAHASAN
Analisis Sistem
Pada tahap ini, ditentukan beberapa variabel yang menjadi penentu pemilihan
suatu pelabuhan dalam penyediaan hasil tangkapan. Selain itu perlu diketahui aliran
7
ikan sebagai hasil tangkapan yang terjadi dari pihak nelayan hingga ikan mencapai
konsumen. Berikut ini ditampilkan beberapa aliran hasil tangkapan yang terjadi di
tiga pelabuhan, yaitu pelabuhan Brondong, Bajomulyo, dan Morodemak.
Aliran Hasil Tangkapan di Pelabuhan Brondong, Lamongan
Distribusi hasil perikanan tangkap di Pelabuhan Brondong dapat dilihat pada
Gambar 4. Sebagian besar hasil tangkapan didistribusikan dalam bentuk ikan segar
dan selebihnya dipasarkan dalam bentuk produk olahan. Pendaratan ikan berupa
ikan segar sekitar 59,18% dan ikan segar yang dijadikan olahan sebesar 40,82%.
Bentuk olahan ikan antara lain olahan pindang, asin (kering), panggang, dan fillet.
Ikan segar dari pelabuhan Brondong dipasarkan ke berbagai kota di Jawa dan Bali.
Jawa Timur
Pedagang Ikan Segar
Jawa Tengah
Jawa Barat
Nelayan
Jakarta
Pelabuhan
Pindang
Bali
Asin/ Kering
Pengolah
Panggang
Fillet
Gambar 4 Aliran Hasil Tangkapan di Pelabuhan Brondong
Aliran Hasil Tangkapan di Pelabuhan Bajomulyo, Juwana, Pati
Distribusi hasil perikanan tangkap di Pelabuhan Bajomulyo dapat dilihat pada
Gambar 5. Ikan sebagai hasil tangkapan nelayan dikumpulkan di pelabuhan.
Selanjutnya hasil tangkapan tersebut disalurkan ke pedagang melalui mekanisme
lelang. Padagang terdiri dari pedagang di pasar local di wilayah Pati dan pedagang
di pasar luar kota seperti Jakarta, Bandung, Surabaya dan Banyuwangi. Jumlah ikan
yang disalurkan ke pasar lokal sekitar 40%, sedangkan ke pasar di luar kota sekitar
60%.
Jakarta
Pedagang Lokal
Lelang
Bandung
Pasar Daerah
Nelayan
Pelabuhan
Surabaya
Banyuwangi
Gambar 5 Aliran Hasil Tangkapan di Pelabuhan Bajomulyo
8
Aliran Hasil Tangkapan di Pelabuhan Morodemak, Jawa Tengah
Distribusi hasil perikanan tangkap di Pelabuhan Morodemak dapat dilihat
pada Gambar 6. Pada pelabuhan Morodemak, hasil tangkapan nelayan
dikumpulkan ke pelabuhan. Hasil tangkapan tersebut disalurkan kepada para
pengumpul ikan melalui mekanisme lelang. Selanjutnya ikan disalurkan ke
pengolah ikan, pabrik, dan para pedagang. Sebagian pedagang menyalurkan ikan
ke kota lain seperti Semarang, Cilacap, Kudus, dan Jakarta.
Pengolah
Pengumpul ikan
Pabrik
Nelayan
Semarang
Cilacap
Pelabuhan
Pedagang
Kudus
Jakarta
Gambar 6 Aliran Hasil Tangkapan di Pelabuhan Morodemak
Aliran Hasil Tangkapan di Pelabuhan Muara Angke, Jakarta
Distribusi hasil perikanan tangkap di Pelabuhan Muara Angke dapat dilihat
pada Gambar 7. Penanganan hasil tangkapan pada pelabuhan ini terdiri dari tiga
tahap, yaitu pendaratan ikan, penyimpanan, dan pengangkutan ke daerah tujuan.
Nelayan
Pelabuhan
Sortir
Pelelangan
Penyimpanan (storage)
Ekspor
Penjualan & Pengangkutan
Perusahaan Perikanan
Pasar
Gambar 7 Aliran Hasil Tangkapan di Pelabuhan Muara Angke
Ikan yang diperoleh nelayan dari laut didaratkan di pelabuhan di tiga lokasi,
yaitu di dermaga timur untuk kapal long line, dermaga barat untuk kapal gill net,
dan TPI untuk kapal-kapal tradisional. Sebagian langsung disortir di atas kapal
ketika hendak diturunkan ke pelabuhan. Setelah disortir, sebagian ikan dilelang di
TPI dan berdasarkan kapal yang mendaratkannya. Khusus ikan tuna, pendaratan
ikan dilakukan di lokasi khusus yang disebut dengan Tuna Landing Centre (TLC)
dan tidak dilelang.
Ikan yang mendarat di TLC serta ikan yang tidak habis dilelang disimpan di
dalam cold storage. Cold storage berfungsi untuk menjaga kualitas hasil tangkapan
sebelum maupun sesudah diolah serta sebelum dipasarkan. Beberapa ikan yang
9
biasanya masuk ke cold storage yaitu tuna, marlin, meka, cakalang, cumi-cumi, dan
kerapu.
Pengangkutan hasil tangkapan di Muara Angke terbagi menjadi
pengangkutan melalui darat dan pengangkutan melalui laut. Pengangkutan melalui
darat menggunakan transportasi mobil pick up/ colt, mobil berpendingin yang
dilengkapi freezer, dan truk kontainer. Sementara itu, pengangkutan melalui laut
dilakukan melalui kapal kargo. Mobil pick up/ colt biasanya digunakan untuk
mengangkut ikan dari lokasi pendaratan atau pelelangan ke cold storage dan tempat
penjualan ikan di sekitar pelabuhan. Mobil berpendingin digunakan untuk
mengirim ikan ke lokasi yang lebih jauh seperti wilayah Jakarta dan luar Jakarta.
Mobil berpendingin juga bisa digunakan untuk mengirimkan ikan menuju kargo di
pelabuhan Tanjung Priok dan bandara Soekarno Hatta untuk diekspor.
Kebutuhan Bahan Baku bagi Pedagang dan Industri Perikanan
Berdasarkan beberapa referensi (Murdiyanto 2003; Darmawan 2006; Bangun
2010; Tanjung 2012) dan hasil pengamatan pada empat pelabuhan di atas, hasil
tangkapan nelayan melewati beberapa proses seperti lelang, pengolahan,
pengiriman / transportasi dan penjualan. Lingkup penjualan ikan pada setiap
pelabuhan berbeda-beda, sebagian ikan dijual di pasar lokal maupun pasar di kota
yang berbeda. Beberapa penjual besar juga melakukan penjualan lintas provinsi dan
expor.
Dari sudut pandang pedagang dan industri pengolahan ikan, hasil tangkapan
dapat diperoleh dari beberapa pelabuhan sekaligus. Hal ini disebabkan karena
terkadang kebutuhan ikan satu industri tidak dapat dipenuhi dari satu pelabuhan
saja, akan tetapi harus dipenuhi dari beberapa pelabuhan.
Pemilihan pelabuhan sebagai lokasi pembelian ikan ditentukan oleh beberapa
faktor, seperti: aksesibilitas pelabuhan, ketersediaan ikan, harga ikan, kemudahan
layanan, dan kualitas ikan. Aksesibilitas ikan menunjukkan kemudahan untuk
mencapai lokasi pelabuhan. Aksesibilitas bisa dilihat dari jarak antara pelabuhan
dengan pedagang atau industri pengolahan ikan serta kemudahan untuk mencapai
pelabuhan tersebut, misalnya kondisi infrastruktur jalan dan transportasi yang
tersedia. Ketersediaan ikan dapat berupa jumlah produksi ikan yang tercatat di
pelabuhan serta keragaman ikan yang diperoleh. Kualitas ikan dapat ditentukan dari
ukuran ikan, lama berlayar, dan lamanya ikan disimpan.
Data Perikanan pada PIPP
Di sebagian pelabuhan, terutama Pelabuhan Perikanan Samudera dan
Pelabuhan Perikanan Nusantara seperti Pelabuhan Brondong, terdapat petugas
pelabuhan yang memiliki tugas untuk memasukkan harga dan produksi ikan harian
di setiap pelabuhan ke dalam Pusat Informasi Pelabuhan Perikanan (PIPP). PIPP
merupakan sistem informasi perikanan yang disediakan oleh Kementerian Kelautan
dan Perikanan. Dengan kata lain, saat ini data perkiraan harga dan produksi ikan
setiap pelabuhan telah tersedia pada sistem PIPP. Data PIPP yang dikelola oleh
petugas pelabuhan dapat dilihat pada Gambar 8.
Penentuan Objektif untuk Multi-Objective Genetic Algorithm
Pada sub bab terdahulu telah disampaikan bahwa banyak faktor yang
menentukan pemilihan pelabuhan untuk dijadikan sebagai penyedia hasil
10
tangkapan. Data harga dan persediaan ikan dapat diperoleh dari PIPP. Jarak dapat
diketahui berdasarkan koordinat. Data mengenai kemudahan layanan dan
infrastruktur pelabuhan banyak tertulis dalam karya-karya ilmiah dan laporan
tahunan di pelabuhan maupun kementrian perikanan. Akan tetapi data tersebut
cukup sulit diukur karena tidak ada standar yang dapat digunakan untuk
menentukan layanan dan infrastruktur di suatu pelabuhan dapat dikatakan baik atau
tidak.
Dengan mempertimbangkan ketersediaan data di atas, sistem yang dibangun
dalam penelitian ini hanya menggunakan 3 objektif sebagai penentu pelabuhan
perikanan, yaitu jarak, harga, dan ketersediaan ikan.
Gambar 8 Use case diagram petugas pelabuhan pada PIPP
Rancangan Algoritme Genetika
Representasi Individu
Setiap individu dalam populasi terdiri atas beberapa gen. Gen-gen tersebut
dimasukkan ke dalam tiga kelompok kromosom, yaitu kromosom pelabuhan,
kromosom komoditas/ jenis ikan dan kromosom alokasi pembelian komoditas.
Secara detail, contoh representasi individu dapat dilihat pada Gambar 9.
Susunan gen pada representasi individu sebagai berikut: p1, p2, ... pi, s1, s2, ... sj, a1,1,
a1,2, ..., ai,1, ai,2 …, ai, j-1, ai,j. Sejumlah gen pelabuhan P diletakkan pada bagian
depan individu, dengan P = {p1, p2, ... pi}, dengan i merupakan jumlah pelabuhan
maksimal yang diinginkan. Selanjutnya sejumlah gen J disusun berurutan setelah
gen pelabuhan P. S = {s1, s2, ... sj} dengan k merupakan banyaknya jenis komoditas
yang dibutuhkan, sedangkan jk berupa integer yang merepresentasikan ID jenis
11
komoditas yang dibutuhkan. Di sebelah kanan kromosom komoditas J, sejumlah
gen A = {a1,1, a1,2, ... ai, j-1, ai,j} dengan jumlah i × j merupakan alokasi pembelian
komoditas dengan jenis jk pada pelabuhan pi. Jumlah alokasi pembelian suatu
komoditas pada seluruh pelabuhan harus sesuai dengan kebutuhan komoditas.
 Jumlah output pelabuhan yang diinginkan (P) = 2
 Jumlah spesies yang dibutuhkan (S) = 3
 Alokasi Pembelian = 2 × 3 = 6
 Panjang Kromosom: P + S + (P x S)
Gen tunggal
p1
p2
Kromosom
pelabuhan
s1
s2
s3
p1,s1
p1,s2
p1,s3
Pembelian pada p1
Kromosom
spesies ikan
p2,s1
p2,s2
p2,s3
Pembelian pada p2
Kromosom pembelian
Individu tunggal
Gambar 9 Representasi individu pada GA untuk 2 output pelabuhan
dan 3 spesies ikan
Inisialisasi Populasi
Populasi awal dibuat dengan memberikan nilai acak pada gen pelabuhan, gen
spesies ikan, dan gen alokasi pembelian sesuai dengan batasan yang telah
ditentukan pada representasi individu. Gen pelabuhan (P) diisi dengan ID
pelabuhan secara acak. Gen spesies bersifat statik, karena jenis ikan ditentukan di
awal bersama dengan penentuan volume kebutuhan ikan dan tidak akan berubah
selama proses rekombinasi. Alokasi pembelian ikan dibuat secara acak dengan
syarat total pembelian suatu spesies ikan sesuai dengan jumlah kebutuhan spesies
tersebut. Gambar 10 menunjukkan proses inisialisasi, sedangkan Gambar 11
merupakan contoh individu hasil inisialisasi populasi.
p1
p2
Kromosom
pelabuhan,
diisi dengan
ID pelabuhan
acak
s1
s2
s3
Kromosom
spesies ikan,
disesuaikan
dengan
kebutuhan
p1,s1
p1,s2
p1,s3
Pembelian pada p1
p2,s1
p2,s2
p2,s3
Pembelian pada p2
Kromosom pembelian ikan, diisi
dengan jumlah spesies ikan yang
akan dibeli pada pelabuhan tertentu.
Individu tunggal
Gambar 10 Inisialisasi populasi
12
300 kg
Pelabuhan lain
dengan ID 19
100 kg
1
3
19
PPS Jakarta
2
5
4
20
111
120
80
89
180
200 kg
Gambar 11 Contoh salah satu individu hasil inisialisasi populasi
Fitness Function
Terdapat tiga objektif yang digunakan dalam penelitian ini, yaitu biaya yang
harus dikeluarkan untuk membeli ikan, jarak untuk mencapai lokasi pembelian ikan
(pelabuhan), dan persediaan ikan. Nilai fitness pada objektif pertama (biaya)
diperoleh dengan membaca alokasi volume pembelian ikan di setiap pelabuhan.
Perhitungan harga ikan ditentukan dengan formula berikut:
𝑠
𝑝
∑ (∑ min (𝑎𝑖,𝑗 , 𝑏𝑖,𝑗 ) × ℎ𝑖,𝑗 )
𝑖=1
𝑗=1
dengan:
ai,j = banyaknya pembelian komoditas j di pelabuhan i,
bi,j = persediaan pembelian komoditas j di pelabuhan i,
hi,j = harga komoditas j di pelabuhan I, dan
p = jumlah pelabuhan.
Nilai fitness pada objektif kedua yaitu jumlah seluruh jarak antara pengguna
atau titik asal dengan pelabuhan-pelabuhan terpilih. Formula berikut digunakan
untuk menghitung total jarak untuk mencapai seluruh pelabuhan:
𝑝
∑ 𝐿𝑖
𝑖=1
dengan:
Li = jarak antara pengguna (titik asal) dengan pelabuhan ke-i, dan
p = jumlah output pelabuhan yang diinginkan.
Pendekatan yang digunakan untuk menghitung jarak yaitu menggunakan
formula Haversine (Bullock 2007; Jovanović et al. 2015). Haversine merupakan
formula yang menghitung jarak antara dua titik yang berada pada permukaan bola
berukuran besar tanpa mempertimbangkan lintasan atau jalan yang dilalui. Dalam
hal ini bola tersebut adalah bumi. Jarak haversine tidak merepresentasikan jarak
yang harus ditempuh pengguna, tetapi pendekatan ini dapat digunakan untuk
memperkirakan perbandingan jarak yang dihasilkan oleh setiap individu. Formula
Haversine juga lebih sederhana dari algoritme pencarian jarak lainnya seperti
Dijkstra dan A* yang mempertimbangkan lintasan yang dilalui. Dengan demikian,
13
Haversine cukup sesuai apabila digunakan dalam algoritme genetika yang
menerapkan iterasi yang berulang.
Pencarian jarak antara dua lokasi A dan B dengan menggunakan formula
Haversine memerlukan input berupa koordinat kedua lokasi tersebut. Berikut ini
merupakan formula Haversine:
cos θ = sin φA sin φB + cos φA cos φB cos ∆L
dengan:
φA = posisi lintang titik A (°)
LA = posisi bujur titik A (°)
φB = posisi lintang titik B (°)
LB = posisi bujur titik B (°)
∆L = LA − LB
Jika θ telah diketahui, maka jarak antara A dan B dapat dihitung:
D=Rθ
dengan:
D = jarak (km)
R = jari-jari bumi ( 6378.14 km )
Nilai fitness ketiga yaitu ketersediaan ikan pada pelabuhanse terpilih. Fitness
ketiga ini digunakan untuk menilai apakah persediaan ikan di pelabuhan dapat
mencukupi pembelian ikan oleh pembeli. Ketersediaan ikan ditentukan dengan
menghitung kekurangan spesies ikan terhadap pembelian ikan tersebut pada sebuah
pelabuhan seperti pada formula berikut:
𝑠
𝑝
𝑆 = ∑ (∑ 𝑎𝑖,𝑗 − min (𝑎𝑖,𝑗 , 𝑏𝑖,𝑗 ))
𝑖=1
𝑗=1
dengan:
S = selisih (kekurangan) komoditas i pada pelabuhan j,
p = jumlah pelabuhan,
s = jumlah spesies,
𝑎𝑖,𝑗 = pembelian spesies i di pelabuhan j, dan
𝑏𝑖,𝑗 = persediaan spesies i di pelabuhan j.
Formula di atas menghitung kekurangan persediaan spesies ikan tertentu
terhadap banyaknya ikan yang akan dibeli pada pelabuhan tersebut. Dengan
demikian nilai S yang diharapkan adalah mendekati nol karena nilai nol pada S
menunjukkan bahwa pembelian spesies tertentu pada pelabuhan tersebut dapat
terpenuhi.
Seleksi Individu
Terdapat dua jenis seleksi individu yang digunakan, yaitu truncating selection
dan tournament selection. Pada truncating selection, individu-individu diurutkan
berdasarkan objektif ketersediaan ikan. Individu yang dapat menghasilkan solusi
yang memenuhi seluruh kebutuhan pengguna ( nilai S-nya bernilai nol) diletakkan
di posisi paling atas dan individu yang tidak memenuhi kebutuhan pengguna
diletakkan di bagian yang paling bawah. Setelah individu diurutkan, selanjutnya
14
dipilih individu yang objektif ketersediaannya terpenuhi. Jika jumlah individu yang
terpilih kurang dari ukuran populasi, maka dipilih kembali individu-individu
lainnya berdasarkan urutan yang telah terbentuk. Contoh truncating selection
dengan ukuran populasi 10 dapat dilihat pada Gambar 12.
Individu 1, S = 0
Individu 2, S = 0
Individu 3, S = 0
Individu dengan objektif ketersediaan
terbaik (nilai S = 0) dipilih untuk
dimasukkan ke populasi baru.
Individu 4, S = 0
Individu 5, S = 3
Individu 6, S = 5
Individu 7, S = 11
Individu 8, S = 17
Individu 9, S = 17
Individu 10, S = 20
Karena ukuran populasi yang
diharapkan 10, individu yang terpilih
belum mencapai 10, maka individuindividu berikutnya diambil berdasarkan
nilai objektif ketersediaan ikannya untuk
dimasukkan ke dalam populasi baru.
Dengan demikian jumlah individu yang
terpilih memenuhi ukuran populasi yang
diinginkan.
Individu 11, S = 21
...
...
Gambar 12 Contoh truncating selection, dengan ukuran populasi 10
Sebelum tournament selection dapat dilakukan, individu-individu pada
populasi perlu diurutkan terlebih dahulu untuk mengetahui apakah satu individu
dinyatakan baik atau tidak berdasarkan objektif biaya dan jarak. Metode sorting
yang digunakan yaitu non-dominated sorting. Metode ini dapat mengurutkan
individu berdasarkan dua atau beberapa objektif sekaligus. Hasil dari nondominated sorting yaitu individu-individu yang telah dikelompokkan dalam
beberapa front F1, F2, F3, dan seterusnya seperti pada Gambar 13. Satu front dapat
berisi satu atau lebih individu. Pada gambar tersebut, F1, F2, F3, dan seterusnya
adalah lapisan-lapisan yang terbentuk. F1 berisi individu-individu yang
memberikan solusi terbaik berdasarkan biaya dan jarak.
Algoritme yang digunakan untuk membentuk front pada populasi P adalah:
for each p ϵ P
Sp = Ø
np = 0
for each q ϵ P
if ( p ≺ q ) then
Sp = Sp ∪ {q}
else if ( q ≺ p ) then
np = np + 1
if np = 0 then
prank = 1
# Jika p mendominasi q
# Masukkan q dalam himpunan solusi yang didominasi oleh p
# Naikkan counter dominasi untuk p
# p termasuk dalam front pertama
15
F1 = F1 ∪ {p}
i=1
while Fi ≠ Ø
Q=Ø
for each p ϵ Fi
for each q ϵ Sp
nq = nq + 1
if nq = 0 then
qrank = I + 1
Q = Q ∪ {q}
i=i+1
Fi = Q
# Inisialisasi front counter
# Digunakan untuk menyimpan anggota front berikutnya
# q termasuk dalam front berikutnya
Non-dominated
sorting
F1
F2
Pengurutan individu –
individu dalam satu front
dilakukan berdasarkan
crowding distance
F3
F4
F5
F6
Populasi yang
belum terurut
Populasi yang telah
dikelompokkan dalam
beberapa front
Hasil sorting
Gambar 13 Non-dominated sorting pada NSGA II
Jarak
Setelah front terbentuk, individu-individu dalam front yang sama diurutkan
berdasarkan crowding distance (CD). CD merupakan tingkat kedekatan satu
individu terhadap individu-individu tetangganya di dalam satu front. CD juga dapat
digunakan untuk menunjukkan sebaran solusi pada sebuah front. Nilai CD yang
kecil dapat menyatakan bahwa individu tersebut kurang baik karena menandakan
bahwa individu tersebut dekat dengan individu yang lain. Bila banyak individu
yang berdekatan, berarti kemungkinan terpilihnya optimum lokal menjadi besar,
padahal hasil yang diharapkan adalah optimum global yang mencakup seluruh
populasi. Sebaliknya, semakin besar nilai CD, berarti individu tersebut semakin
baik.
Biaya pembelian
Gambar 14 Perhitungan crowding distance
16
Ilustrasi mengenai crowding distance dapat dilihat pada Gambar 14.
Algoritme yang digunakan untuk menentukan crowding distance pada front yang
memiliki himpunan individu I adalah:
# Jumlah solusi (individu) di dalam I
# Inisialisasi jarak (distance)
# Urutkan berdasarkan setiap nilai objektif
# Setiap titik tepi selalu terpilih
# Untuk lainnya
CD dihitung untuk setiap objektif. CD akumulasi untuk seluruh objektif diperoleh
dengan cara menjumlahkan seluruh CD dari setiap objektif yang telah
dinormalisasi.
Tourname
nt
Populasi hasil
non-dominated
sorting
Pool
Pemilihan T
individu secara acak
untuk dibandingkan
Penentuan satu individu
terbaik dari T individu
untuk dimasukkan ke
dalam pool
Belum
Apakah pool
sudah penuh?
Sudah
Pool
Hasil tournament
selection
Gambar 15 Tournament selection
Populasi yang telah diurutkan dengan non-dominated sudah dapat digunakan
sebagai input untuk tournament selection. Tournament selection memerlukan dua
parameter, yaitu ukuran tournament (T) dan ukuran polo. Ukuran pool pada NSGA
II disamakan dengan ukuran populasi. Tournament selection dilakukan dengan
memilih sejumlah T individu dari populasi secara acak dan memilih satu individu
terbaik dari individu yang terpilih untuk disimpan ke dalam pool sebagai populasi
baru. Proses ini akan dilakukan terus menerus hingga ukuran populasi/pool yang
17
diinginkan terpenuhi. Gambar 15 menunjukkan langkah-langkah yang dilakukan
pada tournament selection.
Operator Genetik
Sebagaimana algoritme genetika pada umumnya, terdapat 2 operator genetik
yang digunakan, yaitu crossover dan mutasi. Seperti pada Gambar 16, crossover
maupun mutasi diawali dengan penentuan titik-titik crossover / mutasi pada
kromosom pelabuhan dan spesies ikan. Titik-titik tersebut menentukan gen mana
saja yang akan mengalami perubahan nilai.
Crossover memerlukan dua individu yang akan dijadikan sebagai induk
crossover. Pemilihan induk crossover dilakukan secara acak. Terdapat 2
kemungkinan crossover, yaitu 1) PMX Crossover, dan 2) Arithmetic Crossover.
3
19
2
Kromosom
pelabuhan
4
5
150
Kromosom
spesies ikan
200
100
150
200
700
Kromosom pembelian ikan
penentu crossover dan mutasi
Gambar 16 Titik penentu crossover dan mutasi pada sebuah individu
PMX Crossover
PMX crossover terjadi pada kromosom pelabuhan. Crossover ini dilakukan
dengan menukarkan pelabuhan pada pasangan individu induk. Gambar 17
menunjukkan salah satu contoh PMX crossover yang terjadi pada gen pertama.
2
19
2
4
5
100
50
500
200
350
300
3
19
2
4
5
150
200
100
150
200
700
3
19
2
4
5
100
50
500
200
350
300
2
19
2
4
5
150
200
100
150
200
700
Gambar 17 Contoh PMX crossover (1)
PMX crossover dapat menghindari terjadinya munculnya pelabuhan yang
sama dalam satu kromosom. Jika penukaran gen mengakibatkan munculnya
pelabuhan yang sama pada satu individu, maka PMX crossover menukar gen
tersebut dengan pasangan gen lain yang memiliki pelabuhan yang sama. Contoh ini
dapat dilihat pada Gambar 18.
18
4
11
2
4
5
100
50
500
200
350
300
8
4
2
4
5
150
200
100
150
200
700
8
11
2
4
5
100
50
500
200
350
300
4
4
2
4
5
150
200
100
150
200
700
Gen pelabuhan 4 kembar, sehingga dicari pasangan
gen yang nilainya 4 pada individu kedua
8
11
2
4
5
100
50
500
200
350
300
11
4
2
4
5
150
200
100
150
200
700
Gambar 18 Contoh PMX crossover (2)
Pada contoh tersebut apabila gen pertama mengalami crossover, maka
mengakibatkan salah satu turunan memiliki pelabuhan yang kembar, yaitu
pelabuhan dengan kode 4. Hal ini dapat mengakibatkan kesalahan saat perhitungan
fitness dilakukan. Untuk menghindari hal tersebut, gen yang kembar harus diganti
dengan pasangan pelabuhan yang sama pada individu kedua. Dalam hal ini
pasangan pelabuhan 4 pada individu kedua adalah 11, sehingga kode 11 digunakan
untuk mengganti gen yang kembar tadi. Seandainya setelah gen tersebut diganti
ternyata masih menghasilkan gen pelabuhan yang kembar, maka perlu dicari lagi
pasangan gen pelabuhan dengan kode 11 pada individu kedua dan seterusnya.
Arithmetic Crossover
Arithmetic crossover terjadi pada kromosom pembelian ikan, akan tetapi
dipengaruhi oleh kromosom spesies. Crossover ini dilakukan dengan merombak
jumlah pembelian suatu spesies ikan pada pelabuhan tertentu. Gambar 19
menunjukkan ilustrasi mengenai bagaimana kromosom spesies mempengaruhi
crossover ini. Hasil arithmetic crossover diperoleh melalui formula berikut:
Turunan 1: ( α × x1 ) + ( (1- α) × x2)
α : bilangan real pada range [0,1]
Turunan 2: ( (1- α) × x1 ) + ( α × x2)
x1 : nilai gen pada individu pertama
x2 : nilai gen pada individu kedua
Nilai α ditentukan secara acak sehingga selalu memiliki nilai yang berbeda
pada setiap iterasi. Hal ini memberikan keuntungan berupa turunan yang lebih
beragam. Turunan yang beragam memberikan peluang munculnya solusi-solusi
baru yang lebih baik dari generasi sebelumnya.
19
Pembelian untuk spesies terpillih di semua pelabuhan akan
mengalami crossover
Spesies terpilih
2
19
2
4
5
100
50
500
200
350
300
3
19
2
4
5
150
200
100
150
200
700
2
19
2
4
5
145
50
500
155
350
300
2
19
2
4
5
105
200
100
195
200
700
Gambar 19 Contoh arithmetic crossover dengan α = 0.1
Mutasi
Seperti pada Gambar 16, mutasi juga diawali dengan memilih sejumlah gen
secara acak pada kromosom pelabuhan dan kromosom spesies ikan. Terdapat dua
kemungkinan mutasi, yaitu mutasi yang terjadi pada gen pelabuhan dan mutasi
yang terjadi pada alokasi pembelian ikan. Jumlah gen yang mengalami mutasi
tergantung pada nilai peluang mutasi (Pm).
Mutasi pada Kromosom Pelabuhan
Mutasi ini dilakukan secara sederhana dengan mengganti salah satu gen
pelabuhan dengan ID pelabuhan yang belum digunakan pada individu terpilih.
Gambar 20 menunjukkan contoh mutasi yang terjadi pada kromosom pelabuhan.
2
19
2
4
5
150
200
100
150
200
700
5
19
2
4
5
150
200
100
150
200
700
Gambar 20 Contoh mutasi pada kromosom pelabuhan
Mutasi pada Kromosom Pembelian Ikan
Mutasi pada kromosom pembelian ikan dilakukan dengan merombak
banyaknya pembelian ikan secara acak untuk spesies yang terpilih. Gambar 21
menunjukkan salah satu contoh kromosom yang terjadi pada kromosom alokasi
pembelian ikan. Pada gambar tersebut, pembelian 300 kg ikan tuna awalnya
dilakukan pada pelabuhan pertama sebanyak 150 kg dan pelabuhan kedua sebanyak
150 kg. Proses mutasi menyebabkan pembelian ikan pada pelabuhan pertama
menjadi 110 kg dan pelabuhan kedua menjadi 190 kg.
20
Spesies terpilih
2
19
2
4
5
150
200
100
150
200
700
2
19
2
4
5
110
50
500
190
350
300
Gambar 21 Mutasi pada kromosom pembelian ikan
Jarak
Perancangan Termination Criteria
Proses perhitungan fitness function hingga mutasi terjadi terus menerus
hingga memenuhi termination criteria. Terdapat dua termination criteria yang
digunakan:
1 Ketika jumlah generasi telah melebihi batas maksimal yang ditentukan.
2 Ketika fitness function maksimal telah konvergen dan dianggap tidak akan
mengalami peningkatan.
(front pertama)
Biaya pembelian
Gambar 22 Penentuan nilai konvergen
Pada setiap terbentuk generasi baru pada GA, individu-individu yang baru
diharapkan menghasilkan solusi-solusi yang lebih baik yang ditandai dengan
semakin kecilnya biaya pembelian dan jarak. Pada Gambar 22, hasil yang baik
ditandai dengan front pertama (pareto optimal front) yang semakin mendekati
bagian sudut kiri bawah, di mana pada bagian tersebut biaya dan jarak berada pada
nilai yang paling kecil. GA bisa dikatakan telah konvergen jika front pertama tidak
mengalami pergeseran lagi menuju nilai biaya dan jarak yang lebih kecil.
Besarnya pergeseran populasi dapat dinyatakan dengan variabel ϒ. Penentuan
nilai perggeseran front pertama ditentukan dengan formula berikut:
𝑛
1
ϒ = ∑ 𝑚𝑖𝑛 _𝑑𝑖𝑠𝑡(𝑝𝑥 , 𝑄)
𝑛
𝑥=1
dengan:
21
px = individu front pertama pada generasi sebelumnya (obtained solutions),
Q = himpunan individu front pertama generasi baru (pareto optimal front), dan
min_dist(𝑝𝑥 , 𝑄) = fungsi jarak euclid minimal px terhadap titik-titik pada Q.
Variabel ϒ digunakan untuk menentukan pergeseran front pertama pada
generasi terbaru dibandingkan dengan front pertama pada generasi sebelumnya.
Terkadang pergeseran front tidak terjadi (ϒ = 0) dalam satu atau dua generasi, akan
tetapi baru terjadi setelah beberapa generasi. Jika nilai ϒ tidak berubah dalam
sepuluh generasi atau lebih dapat dinyatakan bahwa GA telah konvergen. Jumlah
generasi tersebut dapat ditingkatkan atau diturunkan dengan pertimbangan nilai ϒ
diperkirakan tidak mengalami perubahan lagi setelah jumlah generasi tersebut
dilewati tanpa perubahan ϒ.
Rancangan Sistem
Perancangan dan Integrasi Jaringan
`
GPS
Foreign System
Internal System
Perangkat
Mobile
Server Aplikasi,
Basis Data, dan GA
Petugas /
Enumerator
Pelabuhan
Server PIPP, KKP
Gambar 23 Topologi sistem
Gambar 23 menunjukkan topologi sistem yang dibangun. Secara
keseluruhan, sistem dibagi menjadi dua, yaitu internal system dan foreign system.
Internal system merupakan sistem yang dibangun. Pada Gambar 23, Internal
System berada di dalam gambar awan, sedangkan objek diluar awan merupakan
Foreign System. Internal System melibatkan perangkat keras berupa perangkat
mobile yang dimiliki oleh pengguna, server aplikasi mobile, server basis data, dan
server operasi matriks untuk menjalankan algoritme genetika (GA). Foreign System
melibatkan Global Positioning System (GPS) untuk mengetahui posisi pengguna
sistem dan sistem PIPP milik KKP yang menyimpan data perikanan, termasuk data
harga dan persediaan ikan di pelabuhan.
22
Agar sistem dapat berjalan dengan baik, maka seluruh bagian sistem, baik
internal system maupun foreign system harus saling terhubung. Perangkat mobile
milik pengguna, server aplikasi, dan sistem KKP saling terhubung melalui jaringan
internet. Server aplikasi mobile, basis data, dan aplikasi matriks terhubung dengan
jaringan intranet.
Dalam penelitian ini, bagian yang dibangun hanya bagian aplikasi mobile
saja. Pada Gambar 23, bagian yang dikembangkan berada pada sebelah kiri garis
putus-putus. Penelitian ini dapat dilanjutkan dengan menghubungkan aplikasi
mobile dengan sistem yang dimiliki oleh KKP melalui sebuah web service.
Perancangan Arsitektur Aplikasi dan Perangkat Lunak
Berdasarkan komponen algoritme genetika yang telah dirancang, dibuat
aplikasi untuk menyelesaikan permasalahan pemilihan pelabuhan terbaik. Gambar
24 menggambarkan garis besar aliran data yang menuju maupun masuk ke dalam
sistem. Sistem melibatkan dua agen eksternal, yaitu penggunan dan sistem PIPP
KKP.
Terdapat lima buah use case yang terjadi dalam sistem, yaitu:
1 Menampilkan info pelabuhan,
2 Menampilkan rekomendasi pembelian ikan
3 Menampilkan data peneliti
4 Menampilkan informasi sistem
5 Menampilkan informasi ikan
Gambar 24 Context Diagram
Aliran data yang terjadi pada setiap use case dapat dilihat pada data flow
diagram (DFD) pada Gambar 25. Pada gambar tersebut, terlihat bahwa hanya
terdapat dua data store yaitu kabupaten_kota dan provinsi. Hal ini disebabkan
karena sebagian besar data perikanan seperti data pelabuhan, spesies ikan, harga,
dan ketersediaan ikan telah disediakan dari sistem KKP.
23
Gambar 25 DFD level 1
Pada use case yang kedua, yaitu “menampilkan rekomendasi pembelian
ikan“, aliran yang terjadi di dalamnya cukup banyak sehingga perlu dipaparkan lagi
ke dalam DFD level 2 seperti pada Gambar 26. Proses pada use case kedua dibagi
menjadi empat sub proses, yaitu:
1 Input posisi pengguna dan jumlah pelabuhan,
2 Input kebutuhan ikan,
3 Menghitung rekomendasi pembelian ikan,
4 Menampilkan rekomendasi pembelian ikan,
5 Menampilkan informasi ikan
24
Gambar 26 DFD level 2 untuk Use Case 2
Pada sub sistem 2.3, yaitu “Menghitung rekomendasi pembelian ikan",
algoritme genetika dijalankan untuk memperoleh rekomendasi pembelian ikan.
Diagram alir algoritme genetika dapat dilihat pada Gambar 27.
Populasi ke i
Start
Perhitungan nilai
fitness function
Seleksi individu
i=i+1
Crossover
Tidak
Finish
h
Ya
Apakah
terminating
criteria
terpenuhi?
Gambar 27 Diagram alir algoritme genetika
Mutasi
25
Perancangan User Interface
Gambar 28 Tampilan depan sistem
Gambar 30 Tampilan input posisi asal
dan jumlah output pelabuhan
Gambar 29 Tampilan menu aplikasi
Gambar 31 Tampilan input
kebutuhan ikan
26
Gambar 32 Tampilan rekomendasi pembelian ikan
Aplikasi mobile yang dibangun memiliki 5 buah menu seperti terlihat pada
Gambar 29. Menu pertama yaitu halaman Home (Gambar 28). Menu ini hanya
menampilkan halaman pembuka saja. Menu kedua yaitu menu untuk menampilkan
rekomendasi pemilihan pelabuhan dan pembelian ikan. Untuk memperoleh
rekomendasi pembelian ikan (Gambar 32), pengguna harus memasukkan posisi
pengguna / posisi asal dan jumlah output pelabuhan (Gambar 30) serta kebutuhan
ikan (Gambar 31). Menu lainnya berisi informasi peneliti dan informasi mengenai
sistem ini.
Perancangan dan Integrasi Basis Data
Basis data yang digunakan yaitu basis data relasional. Secara fisik, basis data
sistem hanya menyimpan tabel kota dan provinsi. Data perikanan seperti harga,
spesies ikan, dan pelabuhan diperoleh dari server KKP sehingga tidak perlu
disimpan dalam sebuah tabel pada server basis data. Gambar 33 menunjukkan
entitas yang terlibat dan hubungan antar entitas di dalam basis data.
Provinsi
Kabupaten_kota
Gambar 33 Entity Relationship Diagram (ERD)
Setiap provinsi dapat memiliki beberapa kabupaten atau kota. Berdasarkan
entitas yang terlihat pada Gambar 33, terdapat dua tabel yang perlu dibuat. Masingmasing tabel memiliki beberapa atribut. Tabel 1 menampilkan tabel-tabel yang
dibutuhkan serta atribut yang ada di dalamnya. Hubungan antar tabel (relatioinship)
ditunjukkan dengan adanya primary key dan foreign key. Pada Tabel 1, primary key
dituliskan dalam huruf tebal dan foreign key dituliskan dalam huruf miring.
27
Tabel 1 Entitas tabel pada basis data
Atribut
ProvinsiID, Nama
KabupatenKotaID, ProvinsiID, Nama
Tabel
Pelabuhan
SpesiesIkan
Perancangan System Interface
System interface memungkinkan terjadinya komunikasi dengan sistem lain
(foreign system). System interface diperlukan pada komunikasi server aplikasi
mobile dengan server KKP dan perangkat mobile yang dimiliki oleh pengguna.
Rancangan system interface dapat dilihat pada Gambar 34.
Pada komunikasi dengan server KKP, RESTful web service (Wilde and
Pautasso 2011) dimanfaatkan untuk mengirimkan data harga, persediaan ikan,
spesies ikan, dan informasi pelabuhan. REST merupakan web service yang
memanfaatkan standar protokol HTTP yang biasa digunakan untuk layanan web.
Dengan memanfaatkan REST diharapkan komunikasi dengan foreign key menjadi
lebih mudah karena protokol HTTP mendukung berbagai macam perangkat
komunikasi dan server.
Komunikasi antara server aplikasi dengan perangkat mobile digunakan untuk
mengambil data posisi pengguna, input jumlah pelabuhan yang diinginkan oleh
pengguna, dan kebutuhan ikan. Komunikasi dengan perangkat mobile dilakukan
melalui protokol HTTP.
Perangkat mobile pengguna juga memerlukan system interface untuk
terhubung dengan GPS untuk memperoleh koordinat lokasi pengguna. Dengan
demikian untuk mendapatkan hasil yang lebih akurat, pengguna harus
mengaktifkan perangkat GPS nya sebelum menggunakan aplikasi ini.
Enumerator Pelabuhan
GPS
B
TS
HTTP
RESTful Webservice
Server Aplikasi
Server KKP
Pengguna
Gambar 34 System interface pada sistem
Implementasi
Pada tahap implementasi, dilakukan pembuatan source code program
berdasarkan rancangan yang telah dibuat. Akses terhadap data perikanan server
28
KKP belum diperoleh, sehingga data-data perikanan seperti pelabuhan, spesies
ikan, harga, dan persediaan ikan disimpan dalam basis data. Source code
perhitungan rekomendasi pembelian ikan dapat dilihat pada Lampiran 1, Lampiran
2, dan Lampiran 3. Hasil perhitungan rekomendasi pembelian ikan dapat dilihat
pada Gambar 35 hingga Gambar 40.
Pada Gambar 35 dapat dilihat bahwa hasil perhitungan rekomendasi
pembelian ikan tersebar. Pada gambar tersebut, sumbu X menunjukkan besarnya
biaya yang harus dikeluarkan untuk membeli ikan, sedangkan sumbu Y
menunjukkan jarak yang harus ditempuh menuju tempat pembelian ikan. Titik-titik
yang dihubungkan oleh garis merah menunjukkan hasil-hasil terbaik yang
menghasilkan harga minimal dan jarak terpendek. Garis merah tersebut adalah
pareto front.
Gambar 35 Hasil perhitungan pada generasi ke-1
Pada Gambar 36, generasi ke-5 memberikan hasil yang semakin baik yang
ditunjukkan dengan bergesernya pareto front menuju jarak yang lebih kecil dan
biaya terkecil. Perbaikan hasil ini terus terjadi seperti yang terlihat pada Gambar
37, Gambar 38, Gambar 39, dan Gambar 40. Semakin banyak generasi yang dilalui
ternyata memberikan hasil yang lebih baik, akan tetapi jika kembali dilihat pada
Gambar 39 dan Gambar 40, perbaikan yang terjadi semakin kecil. Hal ini
disebabkan karena hasil perhitungan semakin konvergen.
29
Gambar 36 Hasil perhitungan pada generasi ke-5
Gambar 37 Hasil perhitungan pada generasi ke-10
30
Gambar 38 Hasil perhitungan pada generasi ke-25
Gambar 39 Hasil perhitungan pada generasi ke-50
31
Gambar 40 Hasil perhitungan pada generasi ke-100
Prototipe Sistem Penentuan Pelabuhan Terbaik dalam Penyediaan Hasil
Tangkapan diinstal ke dalam salah satu server hingga dapat diakses melalui
internet. Spesifikasi server sebagai berikut:
1 Perangkat Lunak
 Linux Centos 6.2 64 bit
 Apache 2.4.4
 MySQL 5.5.32
 PHP 5.5.9
2 Perangkat Keras
 Hardisk 450 GB
 Intel(R) Xeon(R) CPU E5620 16 Core @ 2.40GHz
 RAM 8 GB
Proses instalasi sistem dapat dilihat pada Gambar 41.
32
Mulai
Instalasi sistem operasi
Instalasi Apache, PHP,
My SQL, PhpMyAdmin,
R, dan RStudio
Konfigurasi Nameserver
Konfigurasi virtual host
untuk Apache
Selesai
Gambar 41 Instalasi sistem
200
190
180
170
160
150
140
130
120
110
100
90
80
70
60
50
40
30
30
40
50
60
70
20
20000
18000
16000
14000
12000
10000
8000
6000
4000
2000
0
10
Rataan ϒ pada 20 percobaan
Pengujian
Generasi
Gambar 42 Pengaruh ukuran populasi terhadap perolehan titik konvergen
Untuk mendapatkan parameter algoritma terbaik, beberapa kombinasi
percobaan pada ukuran populasi, Pc, dan Pm. Kinerja setiap parameter GA diukur
dengan menghitung ϒ. Setiap percobaan diulang 20 kali untuk mendapatkan hasil
yang lebih akurat.
33
Tabel 2 Pengaruh variasi ukuran populasi
Ukuran Populasi
30
40
50
60
70
Waktu
12.746
19.793
27.625
39.801
49.550
Rataan titik konvergen
168.65
181.90
151.70
169.25
151.05
Rataan ϒ pada 20 percobaan
20000
0.5
0.6
0.7
0.8
0.9
1.0
18000
16000
14000
12000
10000
8000
6000
4000
2000
0
10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200
Generasi
Gambar 43 Pengaruh peluang crossover terhadap perolehan titik konvergen
Tabel 3 Pengaruh variasi Pc
Pc
Time (s)
0.5
0.6
0.7
0.8
0.9
1.0
18.333
20.589
25.294
26.919
28.384
30.695
Avg. Convergence
Point
186.70
181.05
172.30
179.15
172.20
183.05
Tabel 4 Pengaruh variasi Pm
Pm
Time (s)
0.1
0.2
0.3
0.4
0.5
27.609
39.513
47.452
52.314
55.117
Avg. Convergence
Point
179.15
165.95
165.85
159.25
150.20
Berdasarkan Tabel 2, ukuran populasi yang lebih besar meningkatkan waktu
eksekusi. Akan tetapi, peningkatan jumlah populasi dapat menurunkan jumlah
generasi yang dibutuhkan untuk mencapai titik konvergen. Berdasarkan Gambar
42, ukuran populasi 50, 60, dan 70 tampak lebih konvergen dari ukuran populasi 30
dan 40. Dengan mempertimbangkan waktu eksekusi, ukuran populasi 50 dapat
dipilih karena memerlukan waktu eksekusi yang lebih pendek.
Berdasarkan Tabel 3 dan Tabel 4, peningkatan nilai Pc dan Pm dapat
memperpanjang waktu eksekusi. Di sisi lain, berdasarkan nilai rata-rata ϒ pada 20
percobaan, peningkatan Pc dan Pm tidak terlalu mempengaruhi jumlah generasi
yang dibutuhkan untuk mencapai titik konvergen seperti ditunjukkan pada Gambar
43 dan Gambar 44. Dengan mempertimbangkan waktu eksekusi, nilai Pc yang kecil
34
(0.5) dan Pm yang kecil (0.1) dapat dipilih sebagai parameter untuk algoritma
genetika yang digunakan dalam aplikasi.
Rataan ϒ pada 20 percobaan
20000
0.1
0.2
0.3
0.4
0.5
18000
16000
14000
12000
10000
8000
6000
4000
2000
200
190
180
170
160
150
140
130
120
110
100
90
80
70
60
50
40
30
20
10
0
Generasi
Gambar 44 Pengaruh peluang mutasi terhadap perolehan titik konvergen
4 SIMPULAN DAN SARAN
Simpulan
Dalam penelitian ini telah dibangun sebuah desain algoritme genetika dengan
menggunakan NSGA II yang dibuat untuk menyelesaikan kasus penentuan
pelabuhan terbaik dalam penyediaan hasil tangkapan. Berdasarkan beberapa
percobaan yang telah dibuat peningkatan jumlah populasi, Pc, dan Pm dapat
memperlama proses komputasi yang dibutuhkan, akan tetapi di sisi lain dapat
mempercepat algoritme dalam mencapai titik konvergen. Implementasi sistem telah
dibuat dalam sebuah aplikasi mobile, di mana seorang pengguna cukup
memasukkan jumlah ikan yang dibutuhkan dan jumlah pelabuhan yang diharapkan
untuk memperoleh beberapa rekomendasi alokasi dan tempat pembelian ikan.
Saran
Saat ini kondisi data di lapangan dinilai masih tidak valid, karena data yang
masuk ke PIPP telah mengalami perubahan jika dibandingkan dengan data di
lapangan. Untuk itu selain sistem ini masih perlu mengalami pengembangan dari
segi teknologi, aspek lain seperti kondisi sosial dan validasi data di lapangan juga
perlu diperhatikan.
35
DAFTAR PUSTAKA
Arajo F, Trindade J, Borges J, Klautau A, Couto I. 2012. Real-World Applications
of Genetic Algorithms. Rijeka (HR): InTech.
Aryadi O. 2007. Pengendalian kualitas ikan pada distribusi hasil tangkapan di PPP
Cilauteureun Kecamatan Pameungpeuk Kabupaten Garut [skripsi]. Bogor
(ID): Institut Pertanian Bogor.
Atef A, Osman H, Moselhi O. 2012. Multiobjective genetic algorithm to allocate
budgetary resources for condition assessment of water and sewer networks.
Canadian Journal of Civil Engineering. 39:978–992.
Bangun IK. 2010. Distribusi hasil tangkapan di Pelabuhan Perikanan Samudera
Belawan Sumatera Utara [skripsi]. Bogor (ID): Institut Pertanian Bogor.
BPS. 2013. Perkembangan Beberapa Indikator Utama Sosial-Ekonomi Indonesia
Agustus 2013. Jakarta (ID): Badan Pusat Statistik.
Brugger F. 2011. Mobile Applications in Agriculture. Basel (CH): Syngenta
Foundation.
Bullock R. 2007. Great circle distances and bearings between two locations. MDT.
5:1-3.
Darmawan TRA. 2006. Distribusi hasil tangkapan di Pelabuhan Perikanan
Samudera Nizam Zachman Jakarta [skripsi]. Bogor (ID): Institut Pertanian
Bogor.
Harper PR, de Senna V, Vieira IT, Shahani AK. 2005. A genetic algorithm for the
project assignment problem. Comput Oper Res. 32:1255–1265.
Jovanović V, Lazović V, Minić N. 2015. SQL query execution time between two
Singidunum University locations. Di dalam: Syntesis 2015; 2015 Apr 16;
Belgrade (RS): Singidunum University. hlm. 624–628.
Kimbahune S, Singh VV, Pande A, Singh D, Chandel P. 2013. ICT for fisheries Environment friendly way: Pilot experience in Raigadh. Di dalam: 2013
Annual IEEE India Conference (INDICON); 2013 Des. Hlm. 1–8.
Malik JS. 2006. Kajian distribusi hasil tangkapan ikan di pangkalan pendaratan ikan
(PPI) Muara Angke, Jakarta Utara [skripsi]. Bogor (ID): Institut Pertanian
Bogor.
Murdiyanto B. 2003. Pelabuhan Perikanan. Bogor (ID): IPB Press.
Pemberton AMJ, Daly TD, Ertugrul N. 2013. On-Shore Wind Farm Cable Network
Optimisation Utilising a Multiobjective Genetic Algorithm. Wind
Engineering. 37:659–674.
Qiang CZ, Kuek SC, Dymond A, Esselaar S. 2011. Mobile applications for
agriculture and rural development. Washington DC (US): World Bank.
Satzinger J, Jackson R, Burd SD. 2011. Systems analysis and design in a changing
world. Boston (US): Cengage Learning.
Tanjung A. 2012. Analisis distribusi ikan di Pelabuhan Perikanan Kabupaten
Indramayu (Studi kasus: PPI Tegal Agung, PPI Karangsong dan PPI Eretan
Kulon) [skripsi]. Bogor (ID): Institut Pertanian Bogor.
The World Bank. 2011. ICT in Agriculture: Connecting Smallholders to
Knowledge, Networks, and Institutions. Washington DC (US): World Bank.
Unep. 2009. The Role of Supply Chains in Addressing the Global Seafood Crisis.
Paris (FR): UNEP/Earthprint.
36
Wilde E, Pautasso C, editors. 2011. REST: From Research to Practice. New York
(US): Springer New York.
Ye J, Zhou Y, Shi Z. 2010. Integrated application for production process
informatization of fisheries enterprise based on wireless transport technology.
Di dalam: World Automation Congress (WAC), 2010. Hlm. 349–355.
Zhang Y, Rockett P. 2008. A Comparison of three evolutionary strategies for
multiobjective genetic programming. Artif. Intell. 27:149–163.
37
LAMPIRAN
Lampiran 1 Source Code Pembacaan Variabel pada R
posisi_sekarang <- c(122.5948815,-3.9675945)
commandArgs(), contoh koordinat Bogor
# dari
# DATA PELABUHAN
pelabuhan <- getPelabuhan()
lonlat_pelabuhan <- pelabuhan[,c("longitude", "latitude")]
lonlat_pelabuhan <- apply(lonlat_pelabuhan,c(1,2),as.numeric)
# KEBUTUHAN IKAN ( dari commandArgs() juga )
komoditas <- c(1,19,56) # diganti dengan fromJSON
jumlah <- c(100,120,150) # diganti dengan fromJSON
kebutuhan <- cbind(komoditas, jumlah)
rownames(kebutuhan) <- paste0("komoditas.", 1:nrow(kebutuhan) )
#rm(komoditas,jumlah)
# HARGA (dari DATABASE)
harga <- getHarga(komoditas)
rownames(harga) <- paste0("komoditas.", 1:nrow(harga) )
colnames(harga) <- paste0("pelabuhan.", 1:ncol(harga) )
# PERSEDIAAN (dari DATABASE)
persediaan <- getPersediaan(komoditas)
rownames(persediaan) <- paste0("komoditas.", 1:nrow(persediaan) )
colnames(persediaan) <- paste0("pelabuhan.", 1:ncol(persediaan) )
38
Lampiran 2 Source Code Fungsi-fungsi NSGA II pada R
require(RMySQL)
require(nsga2R)
require(geosphere)
#' FUNGSI MEMBACA PELABUHAN YANG DIBUTUHKAN DARI DATABASE
getPelabuhan <- function(id_pelabuhan = NULL ){
#require(RMySQL)
m<-dbDriver("MySQL");
con<-dbConnect(m,user='priyodksi', password='ntar aja',
host='localhost', dbname='fishpro');
if(length(id_pelabuhan) == 0){
query <- "select PelabuhanID,nama,longitude,latitude from
pelabuhan order by PelabuhanID"
}else{
query <- sprintf("select PelabuhanID,nama,longitude,latitude
from Pelabuhan where id in (%s) order by PelabuhanID",
paste(id_pelabuhan,collapse = ","))
}
res<-dbSendQuery(con, query)
pelabuhan <- fetch(res, n = -1)
dbDisconnect(con)
return(pelabuhan)
}
getHarga <- function(spesiesIkanID){
m<-dbDriver("MySQL");
con<-dbConnect(m,user='priyodksi', password='ntar aja',
host='localhost', dbname='fishpro');
query <- sprintf("SELECT harga FROM fishpro.harga_terbaru WHERE
spesiesikanid=%s order by PelabuhanID;", spesiesIkanID[1]);
res<-dbSendQuery(con, query)
harga <- fetch(res, n = -1)
for (sp in spesiesIkanID[2:length(spesiesIkanID)]) {
query <- sprintf("SELECT harga FROM fishpro.harga_terbaru
WHERE spesiesikanid=%s order by PelabuhanID;", sp);
res<-dbSendQuery(con, query)
harga <- cbind(harga,fetch(res, n = -1))
}
colnames(harga) <- 1:length(spesiesIkanID)
dbDisconnect(con)
return(t(harga))
}
39
Lanjutan
getPersediaan <- function(spesiesIkanID){
m<-dbDriver("MySQL");
con<-dbConnect(m,user='priyodksi', password='ntar aja',
host='localhost', dbname='fishpro');
query <- sprintf("SELECT persediaan FROM
fishpro.persediaan_terbaru WHERE spesiesikanid=%s order by
PelabuhanID;", spesiesIkanID[1]);
res<-dbSendQuery(con, query)
persediaan <- fetch(res, n = -1)
for (sp in spesiesIkanID[2:length(spesiesIkanID)]) {
query <- sprintf("SELECT persediaan FROM fishpro.persediaan
WHERE spesiesikanid=%s order by PelabuhanID;", sp);
res<-dbSendQuery(con, query)
persediaan <- cbind(persediaan,fetch(res, n = -1))
}
colnames(persediaan) <- 1:length(spesiesIkanID)
dbDisconnect(con)
return(t(persediaan))
}
#' FUNGSI INISIALISASI POPULASI
inisialisasi_populasi <- function(n_populasi, kebutuhan,
n_gen_pelabuhan){
n_gens <- n_gen_pelabuhan + nrow(kebutuhan) + (n_gen_pelabuhan *
nrow(kebutuhan))
populasi <- matrix(0, nrow = n_populasi, ncol = n_gens)
populasi <- penamaan_gen(populasi)
# Isi Gen Pelabuhan secara random
populasi[,nama_gen$pelabuhan] <t(apply(as.matrix(1:n_populasi), 1, function(x)
sample(1:nrow(pelabuhan),size = n_gen_pelabuhan,replace = F)))
# Isi Gen Komoditas sesuai kebutuhan
populasi[,nama_gen$komoditas] <matrix(rep(1:nrow(kebutuhan),each=n_populasi),nrow=n_populasi)
# Isi Gen Alokasi secara random
populasi[,nama_gen$alokasi] <matrix(runif(length(populasi[,nama_gen$alokasi])),
dim(populasi[,nama_gen$alokasi])) # mengisi gen dengan bilangan
random
for(i in 1:nrow(kebutuhan)){
x <- populasi[,nama_gen$alokasi_komoditas[[paste0("a.p.",i)]]]
populasi[,nama_gen$alokasi_komoditas[[paste0("a.p.",i)]]] <round(x/apply(x,1,sum) * kebutuhan[i,"jumlah"])
}
populasi <- fix_alokasi(populasi, kebutuhan)
return(populasi)
}
40
Lanjutan
#' FUNGSI GENERATE NAMA KOLOM GEN
generate_nama_gen <- function(n_gen_pelabuhan, n_gen_komoditas){
nama_gen <- list()
nama_gen$pelabuhan <- paste0("p.", 1:n_gen_pelabuhan)
nama_gen$komoditas <- paste0("k.", 1:n_gen_komoditas)
nama_gen$alokasi_pelabuhan <- list()
nama_gen$alokasi_komoditas <- list()
nama_gen$evaluasi <- c("eval_harga","eval_jarak",
"eval_kekurangan")
nama_gen$evaluasi_nsga <- c("eval_harga","eval_jarak")
alokasi <- matrix(nrow=n_gen_pelabuhan, ncol=n_gen_komoditas)
for(i in 1:n_gen_pelabuhan){
for(j in 1:n_gen_komoditas){
alokasi[i,j] <- sprintf("a.%d.%d", i,j)
nama_gen$alokasi_pelabuhan[[paste0("a.",i)]] <c(nama_gen$alokasi_pelabuhan[[paste0("a.",i)]], sprintf("a.%d.%d",
i,j))
nama_gen$alokasi_komoditas[[paste0("a.p.",j)]] <c(nama_gen$alokasi_komoditas[[paste0("a.p.",j)]],
sprintf("a.%d.%d", i,j))
}
}
nama_gen$alokasi <- as.vector(t(alokasi))
nama_gen$total <- c(nama_gen$pelabuhan, nama_gen$komoditas,
nama_gen$alokasi)
return(nama_gen)
}
#' FUNGSI UNTUK MENAMAI KOLOM POPULASI
penamaan_gen <- function(populasi){
colnames(populasi) <- nama_gen$total
return(populasi)
}
#' EVALUASI
evaluasi <- function(populasi, kebutuhan, posisi_sekarang){
eval_harga <- evaluasi_harga(populasi, kebutuhan, harga)
eval_jarak <- evaluasi_jarak(populasi, lonlat_pelabuhan,
posisi_sekarang)
eval_kekurangan <- evaluasi_persediaan(populasi,persediaan)
populasi <- cbind(populasi, eval_harga, eval_jarak,
eval_kekurangan)
return(populasi)
}
41
Lanjutan
#' EVALUASI HARGA
evaluasi_harga <- function(populasi, kebutuhan, harga){
matrix_harga <- t(apply(populasi[,nama_gen$pelabuhan],MARGIN =
1,function(x) harga[,x]))
# matrix harga yang dipetakan populasi
matrix_jumlah <- populasi[,nama_gen$alokasi]
subtotal <- matrix_harga * matrix_jumlah
return(apply(subtotal,1,sum))
}
#' EVALUASI JARAK
evaluasi_jarak <- function(populasi, lonlat_pelabuhan,
posisi_sekarang){
eval_jarak <- apply(populasi[,nama_gen$pelabuhan],1,
function(vektor_id_pelabuhan)
haversine_diagonal_persegi(lonlat_pelabuhan, vektor_id_pelabuhan,
posisi_sekarang)
)
return(eval_jarak/1000) # satuan: KM
}
#' HAVERSINE DIAGONAL PERSEGI
#' Mencari panjang diagonal 'persegi panjang' yang menutupi titiktitik pelabuhan dan 'posisi sekarang'
#' Digunakan untuk EVALUASI JARAK
haversine_diagonal_persegi <- function(lonlat_pelabuhan,
vektor_id_pelabuhan, posisi_sekarang){
lonlat <- lonlat_pelabuhan[vektor_id_pelabuhan,]
lonlat <- rbind(lonlat,posisi_sekarang)
titik_min <- apply(lonlat,2,min)
#longitude, latitude
titik_max <- apply(lonlat,2,max)
#longitude, latitude
jarak_haversine <- distHaversine(titik_min, titik_max)
return(jarak_haversine)
}
#' EVALUASI PERSEDIAAN
evaluasi_persediaan <- function(populasi, persediaan){
matrix_persediaan <- apply(populasi[,nama_gen$pelabuhan], 1,
function(vektor_id_pelabuhan)
matrix(persediaan[,vektor_id_pelabuhan] , nrow = 1)
)
matrix_persediaan <- t(matrix_persediaan)
matrix_selisih <- matrix_persediaan populasi[,nama_gen$alokasi]
kekurangan <- apply(matrix_selisih,1,function(x) - sum(x[x<0]))
# Menjumlahkan kekurangan persediaan per solusi/individu
return(kekurangan)
}
42
Lanjutan
#' FUNGSI UNTUK MEMPERBAIKI TOTAL ALOKASI AGAR SESUAI KEBUTUHAN
(biasanya kelebihan/kekurangan sedikit)
#' Caranya dengan menambah/mengurangi alokasi pada pelabuhan
pertama
#' @param populasi Matrix populasi
#' @param kebutuhan Matrix kebutuhan komoditas
#' @return Populasi dengan alokasi pembelian ikan yang totalnya
telah disesuaikan dengan kebutuhan
fix_alokasi <- function(populasi, kebutuhan){
apply(as.matrix(1:nrow(kebutuhan)),c(1,2),
function(i) {
apply(populasi[,nama_gen$alokasi_komoditas[[paste0("a.p.",i)]] ],
1, sum) - kebutuhan[i,"jumlah"]
}
)[,,1] -> adapter
random_pelabuhan <- paste0("a.",
ceiling(runif(1)*n_gen_pelabuhan))
populasi[,nama_gen$alokasi_pelabuhan[[random_pelabuhan]] ] <populasi[,nama_gen$alokasi_pelabuhan[[random_pelabuhan]] ] adapter
return(populasi)
}
#' FUNGSI SELEKSI INDIVIDU
#' Menggunakan Truncating Crossover untuk solusi yang tidak
memenuhi permintaan (nilai eval_kekurangan lebih besar dari 0)
#' Menggunakan Non-Dominated Sorting + Tournament Crossover untuk
untuk variable harga dan jarak
seleksi_individu <- function(populasi, n_populasi, elitisme,
generasi){
# Truncating Selection, untuk KETERSEDIAAN ikan di pelabuhan
index_populasi <- populasi[,"eval_kekurangan"] == 0
# mencari
index populasi yang terpenuhi oleh pelabuhan
populasi <- populasi[index_populasi,]
populasi <- populasi[,colnames(populasi) != "eval_kekurangan"]
# Hapus kolom "eval_kekurangan" karena tidak akan dimasukkan ke
NSGA
populasi <- sorting_nsga(populasi)
# Simpan hasil eval rank1
eval_front1[[generasi]] <<- populasi[populasi[,"rank"] == 1,
nama_gen$evaluasi_nsga]
# Elitisme. Mengambil minimal e % individu terbaik dari populasi
n_elitist <- ceiling( elitisme*n_populasi ) # Jumlah individu
yang dipertahankan (elitisme)
elit <- populasi[1:n_elitist, ]
43
Lanjutan
# Tournament Selection
ts <- tournamentSelection(populasi, tour_size = 2, pool_size =
n_populasi - n_elitist)
populasi <- rbind(elit,ts)
rownames(populasi) <- NULL
return(populasi) # Gabungkan hasil elitisme dengan hasil TS
}
# SORT AJA dengan NSGA
sorting_nsga <- function(populasi){
# Non Dominated Sorting (Tahap Penentuan Rank)
ranking <fastNonDominatedSorting(populasi[,nama_gen$evaluasi_nsga])
rank <- integer(nrow(populasi))
i <- 1
while (i <= length(ranking)) {
rank[ranking[[i]]] <- i
i <- i + 1
}
populasi <- cbind(populasi[,c(nama_gen$total,
nama_gen$evaluasi_nsga)],rank)
# Non Dominated Sorting (Tahap Penentuan Crowding Distance)
objRange <- apply(populasi[,nama_gen$evaluasi_nsga], 2, max) apply(populasi[,nama_gen$evaluasi_nsga], 2, min)
#
Menghitung jarak antara nilai max - min untuk masing-masing
onjective
cd <- crowdingDist4frnt(populasi,ranking,objRange)
populasi <- cbind(populasi, cd = apply(cd,1,sum)) # crowding
distance dari beberapa objektif dijumlahkan
populasi <populasi[order(populasi[,"rank"],populasi[,"cd"]),c(nama_gen$total
, nama_gen$evaluasi_nsga, "rank", "cd")] # Diurutkan berdasarkan
RANK dan CD
return(populasi) # Gabungkan hasil
}
# FUNGSI UNTUK MENJALANKAN CROSSOVER
crossover <- function(populasi, pc){
populasi <- populasi[runif(nrow(populasi)) <= pc,] # menentukan
sejumlah pc dari populasi yang akan mengalami crossover
if(nrow(populasi) %% 2 == 1) {
parents <- populasi[1:(nrow(populasi)-1),]
}else{
parents <- populasi[1:(nrow(populasi)),]
}
pasangan <- lapply(1:(nrow(parents)/2), function(x)
parents[(2*x-1):(2*x),])
44
Lanjutan
# Menentukan titik2 crossover untuk tiap pasangan
titik_crossover <- matrix(sample(c(T,F),
(length(nama_gen$pelabuhan)+length(nama_gen$komoditas)) *
nrow(parents)/2,
replace = T ),
nrow = nrow(parents)/2)
colnames(titik_crossover) <c(nama_gen$pelabuhan,nama_gen$komoditas) # penamaan kolom untuk
mempermudah pemanggilan
# Jalankan arithmetic crossover
z <- titik_crossover[,nama_gen$komoditas] *
col(titik_crossover[,nama_gen$komoditas]) # Index kolom yang
tidak mengalami crossover akan dijadikan 0
index_crossover_komoditas <- lapply(1:nrow(z), function(x) z[x,]
)
kolom_crossover_komoditas <- lapply(index_crossover_komoditas,
function(x) paste0("a.p.", x))
kolom_crossover_komoditas <- lapply(kolom_crossover_komoditas,
function(x) x[x!="a.p.0"])
kolom_crossover_komoditas <- lapply(kolom_crossover_komoditas,
function(x) {
as.vector(
apply(as.matrix(x),1,
function(y) nama_gen$alokasi_komoditas[[y]])
)
})
pasangan <- lapply(as.list(1:length(pasangan)), function(x)
arithmetic_crossover(pasangan[[x]],
kolom_crossover_komoditas[[x]]))
# Jalankan pmx crossover
kolom_crossover_pelabuhan <titik_crossover[,nama_gen$pelabuhan]
kolom_crossover_pelabuhan <- kolom_crossover_pelabuhan *
col(kolom_crossover_pelabuhan)
pasangan <- lapply(as.list(1:length(pasangan)), function(x)
pmx_crossover(pasangan[[x]], kolom_crossover_pelabuhan[x,]))
# List pasangan dikonversi ke dalam bentuk matrix
child_crossover <- t(matrix(apply(as.matrix(1:length(pasangan)),
1, function(x) t(pasangan[[x]])), nrow = length(nama_gen$total)))
colnames(child_crossover) <- nama_gen$total
return(child_crossover)
}
45
Lanjutan
arithmetic_crossover <- function(pasangan_individu,
kolom_crossover){
alfa_crossover <- runif(1)
childs <- pasangan_individu # inisialisasi childs
if(length(kolom_crossover) > 0){
childs[1, kolom_crossover] <- (alfa_crossover *
pasangan_individu[1,kolom_crossover]) +
((1-alfa_crossover) * pasangan_individu[2,kolom_crossover]) #
anak pertama
childs[2, kolom_crossover] <- (alfa_crossover *
pasangan_individu[2,kolom_crossover]) +
((1-alfa_crossover) * pasangan_individu[1,kolom_crossover]) #
anak kedua
}
return(childs)
}
pmx_crossover <- function(pasangan_individu, kolom_crossover){
p1 <- pasangan_individu[1,nama_gen$pelabuhan]
p2 <- pasangan_individu[2,nama_gen$pelabuhan]
c2 <- c1 <- integer(length(nama_gen$pelabuhan)) # child1 & child
2
# Pembentukan child1
c1[kolom_crossover] <- p1[kolom_crossover] # copy gen p1 yang
berada pada kolom_crossover ke c1
p2_mapped <- p2[kolom_crossover][!(p2[kolom_crossover] %in% c1)]
# gen pada p2 yang akan dipetakan ke c1
p2_mapped_new_index <- apply(as.matrix(p2_mapped), 1,
function(x) get_new_index(x, p1, p2, kolom_crossover) ) # Index
baru untuk p2_mapped
c1[p2_mapped_new_index[p2_mapped_new_index != 0]] <p2_mapped[p2_mapped_new_index != 0] # Memetakan p2_mapped ke c1
c1[c1==0] <- p2[c1==0] # Mengisi gen c1 yang masih kosong
# Pembentukan child2
c2[kolom_crossover] <- p2[kolom_crossover] # copy gen p2 yang
berada pada kolom_crossover ke c2
p1_mapped <- p1[kolom_crossover][!(p1[kolom_crossover] %in% c2)]
# gen pada p1 yang akan dipetakan ke c2
p1_mapped_new_index <- apply(as.matrix(p1_mapped), 1,
function(x) get_new_index(x, p2, p1, kolom_crossover) ) # Index
baru untuk p1_mapped
c2[p1_mapped_new_index[p1_mapped_new_index != 0]] <p1_mapped[p1_mapped_new_index != 0] # Memetakan p1_mapped ke c2
c2[c2==0] <- p1[c2==0] # Mengisi gen c2 yang masih kosong
pasangan_individu[1,nama_gen$pelabuhan] <- c2
pasangan_individu[2,nama_gen$pelabuhan] <- c1
return(pasangan_individu)
}
46
Lanjutan
#' Pencarian index untuk penempatan gen p2 (ortu 2) pada c1 (anak
1)
#' Digunakan untuk pmx crossover
get_new_index <- function(gen, p1, p2, kolom_crossover){
id <- match(gen,p2) # index gen pada p2
pair <- p1[id]
if(match(pair,p2) %in% kolom_crossover){
return(get_new_index(pair, p1, p2, kolom_crossover))
}else if( is.na(match(pair,p2))){
return(F)
}else{
return(match(pair,p2))
}
}
#' FUNGSI UNTUK MENJALANKAN MUTASI
mutasi <- function(populasi, pm){
# Penentuan titik mutasi berdasarkan nilai pm
titik_mutasi <- matrix(0,nrow(populasi),
length(c(nama_gen$pelabuhan, nama_gen$komoditas)))
titik_mutasi <- apply(titik_mutasi,c(1,2), function(x) runif(1)
<= pm)
colnames(titik_mutasi) <- c(nama_gen$pelabuhan,
nama_gen$komoditas)
# Penentukan baris yang mengalami mutasi
baris_mutasi <- apply(titik_mutasi,1,function(x) sum(x)>0) #
semua baris yang mengalami mutasi
baris_mutasi_pelabuhan <apply(titik_mutasi[,nama_gen$pelabuhan],1,function(x) sum(x)>0) #
baris yang mengalami mutasi pelabuhan
baris_mutasi_alokasi <apply(titik_mutasi[,nama_gen$komoditas],1,function(x) sum(x)>0) #
baris yang mengalami mutasi alokasi
# Jalankan mutasi pelabuhan
individu_mutan_pelabuhan <- populasi[baris_mutasi_pelabuhan,] #
individu yang mengalami mutasi pelabuhan
titik_mutasi_pelabuhan <titik_mutasi[baris_mutasi_pelabuhan,nama_gen$pelabuhan] *
col(as.matrix(titik_mutasi[baris_mutasi_pelabuhan,nama_gen$pelabuh
an])) # Mengambil titik mutasi pelabuhan saja
child_mutasi_pelabuhan <t(apply(as.matrix(1:length(baris_mutasi_pelabuhan[baris_mutasi_pel
abuhan == TRUE])), 1, function(x)
mutasi_pelabuhan(individu_mutan_pelabuhan[x,],
titik_mutasi_pelabuhan[x,] ) ))
populasi[baris_mutasi_pelabuhan,] <- child_mutasi_pelabuhan
47
Lanjutan
# Jalankan mutasi alokasi
individu_mutan_alokasi <- populasi[baris_mutasi_alokasi,] #
individu yang mengalami mutasi alokasi
titik_mutasi_alokasi <titik_mutasi[baris_mutasi_alokasi,nama_gen$komoditas] *
col(as.matrix(titik_mutasi[baris_mutasi_alokasi,nama_gen$komoditas
])) # Mengambil titik mutasi alokasi saja
child_mutasi_alokasi <t(apply(as.matrix(1:length(baris_mutasi_alokasi[baris_mutasi_aloka
si == TRUE])), 1, function(x)
mutasi_alokasi(individu_mutan_alokasi[x,],
titik_mutasi_alokasi[x,] ) ))
populasi[baris_mutasi_alokasi,] <- child_mutasi_alokasi
return(populasi[baris_mutasi,])
}
#' MUTASI UNTUK KROMOSOM PELABUHAN
mutasi_pelabuhan <- function(individu, kolom_mutasi){
p1 <- integer(length(nama_gen$pelabuhan)) # p1 diisi dengan 0
semua
p1[kolom_mutasi] <- sample(1:nrow(pelabuhan), size =
length(kolom_mutasi[kolom_mutasi !=0]))
p2 <- individu[nama_gen$pelabuhan]
c1 <- integer(length(kolom_mutasi)) # child
c1[kolom_mutasi] <- p1[kolom_mutasi] # copy gen p1 yang berada
pada kolom_mutasi ke c1
p2_mapped <- p2[kolom_mutasi][!(p2[kolom_mutasi] %in% c1)] # gen
pada p2 yang akan dipetakan ke c1
p2_mapped_new_index <- apply(as.matrix(p2_mapped), 1,
function(x) get_new_index(x, p1, p2, kolom_mutasi) ) # Index baru
untuk p2_mapped
c1[p2_mapped_new_index[p2_mapped_new_index != 0]] <p2_mapped[p2_mapped_new_index != 0] # Memetakan p2_mapped ke c1
c1[c1==0] <- p2[c1==0] # Mengisi gen c1 yang masih kosong
individu[nama_gen$pelabuhan] <- c1
return(individu)
}
48
Lanjutan
#' MUTASI UNTUK KROMOSOM ALOKASI
mutasi_alokasi <- function(individu, kolom_mutasi){
child <- individu # inisialisasi childs
kolom_alokasi <- matrix(
apply(
as.matrix(kolom_mutasi[kolom_mutasi!=0]), 1, function(x)
nama_gen$alokasi_komoditas[[paste0("a.p.",x)]]
),
nrow = 1)
child[kolom_alokasi] <matrix(apply(as.matrix(kolom_mutasi[kolom_mutasi !=
0]),1,function(x) {
r <- runif(n_gen_pelabuhan)
r/sum(r) * kebutuhan[x,"jumlah"]
}), nrow=1)
return(child)
}
#' Membuat Gambar:
create_image <- function(populasi, generasi){
populasi <- sorting_nsga(populasi)
xlimit <- c(20000, 23000)
ylimit <- c(0,2000)
plotfile <- sprintf("Generasi_%03d", generasi )
#assign(sprintf("generasi_%03d",generasi), populasi)
png(filename = paste0("images/",plotfile,".png"), units = "px",
width = 1440, height = 1080)
rank1 <- populasi[populasi[,"rank"] == 1,]
plot(x = populasi[,"eval_harga"]/1000, y =
populasi[,"eval_jarak"], xlab = "Biaya( x Rp 1.000)", ylab =
"Jarak (km)", xlim = xlimit, ylim = ylimit, main = plotfile,
new=T)
par(new=T)
if(is.matrix(rank1)){
rank1 <- rank1[order(rank1[,"eval_harga"]),]
plot(x = c(min(rank1[,"eval_harga"])/1000,
rank1[,"eval_harga"]/1000, xlimit[2]), y = c(max(ylimit[2],
rank1[1,"eval_jarak"]), rank1[,"eval_jarak"],
rank1[nrow(rank1),"eval_jarak"]), type = "l", col = "red", xlab =
"", ylab = "", xlim = xlimit, ylim = ylimit, main = "")
par(new=T)
plot(x = rank1[,"eval_harga"]/1000, y = rank1[,"eval_jarak"],
col = "red", xlab = "", ylab = "", xlim = xlimit, ylim = ylimit,
main = "")
}else{
plot(x = c(rank1["eval_harga"]/1000, rank1["eval_harga"]/1000,
xlimit[2]), y = c(ylimit[2], rank1["eval_jarak"],
rank1["eval_jarak"]), type = "l", col = "red", xlab = "", ylab =
"", xlim = xlimit, ylim = ylimit, main = "")
49
Lanjutan
par(new=T)
plot(x = rank1["eval_harga"]/1000, y = rank1["eval_jarak"],
col = "red", xlab = "", ylab = "", xlim = xlimit, ylim = ylimit,
main = "")
}
dev.off()
#Sys.sleep(1)
}
metric_yumega <- function(current_optima, previous_optima){
min_distance <- apply(previous_optima, MARGIN = 1, function(x){
# Hitung jarak euclid minimal titik2 pada previous_optima
terhadap titik2 pada current_optima
min(spDistsN1(current_optima,x))
})
return(mean(min_distance))
}
tic <- function(){
assign("tictoctime",
}
Sys.time(), pos = ".GlobalEnv")
toc <- function(){
x <- Sys.time() - tictoctime
rm(tictoctime, pos = ".GlobalEnv")
return(x)
}
konvergen <- function(input_array, n){
result <- apply(as.matrix(n:length(input_array)), 1, function(x)
{
mean(input_array[(x-n+1):x])
})
return(min(which(result==0)+n, n_max_generasi))
}
50
Lampiran 3 Source Code Program Utama Algoritme Genetika pada R
source("app01/functions.R")
source("app01/variable.R")
#' FUNGSI MENJALANKAN GA
#' n_populasi : ukuran populasi pada setiap generasi
#' n_max_generasi : jumlah maksimal generasi
#' n_gen_pelabuhan : jumlah pelabuhan yang diharapkan
#' pc : peluang crossover
#' pm : peluang mutasi
#' elitisme : menentukan jumlah individu yang dipertahankan dari
populasi induk
JALANKAN_GA <- function(n_populasi, n_max_generasi,
n_gen_pelabuhan, pc, pm, elitisme){
populasi <- inisialisasi_populasi(n_populasi*2, kebutuhan,
n_gen_pelabuhan) # n_populasi dikali 2 karena masih akan
diseleksi...
# Front1
eval_front1 <<- list();
# Iterasi Generasi ------------------------------------------------------generasi <- 1
while(T){
#cat("Generasi", generasi, "\n")
populasi <- evaluasi(populasi, kebutuhan, posisi_sekarang)
# Export output image --------------------------------------------#
if((generasi %% 5 == 0) || (generasi %in% 1:100) ){
#
create_image(populasi, generasi)
#
}
# End Export output image --------------------------------------------------------------------------# Dihentikan jika sudah memenuhi TERMINATION CRITERIA
if(generasi > n_max_generasi){
populasi <- sorting_nsga(populasi)
return(populasi)
break
}
populasi <- seleksi_individu(populasi, n_populasi, elitisme,
generasi)
# hapus semua kolom evaluasi, rank, & cd sebelum REKOMBINASI
populasi <- populasi[,nama_gen$total]
# Crossover
turunan_crossover <- crossover(populasi, pc)
offspring1 <- rbind(populasi, turunan_crossover) # Offspring =
gabungan populasi dengan hasil crossover
51
Lanjutan
# Mutasi
turunan_mutasi <- mutasi(offspring1, pm)
offspring2 <- rbind(offspring1, turunan_mutasi)
# Pembulatan volume dan offspring2 digunakan sebagai kandidat
populasi baru
populasi <- floor(offspring2)
populasi <- fix_alokasi(populasi, kebutuhan)
# Hapus duplikat individu
populasi <- unique(populasi,incomparables = F)
generasi <- generasi + 1
}
# End Iterasi Generasi --------------------------------------------------}
n_gen_pelabuhan <- 3
nama_gen <- generate_nama_gen(n_gen_pelabuhan, nrow(kebutuhan))
populasi <- JALANKAN_GA(50, 200, n_gen_pelabuhan, 0.5, 0.1, 0.1)
output <- populasi[populasi[,'rank']==1,]
52
RIWAYAT HIDUP
Priyo Puji Nugroho dilahirkan di Semarang,
pada tanggal 5 Maret 1987. Penulis merupakan
anak keempat dari empat bersaudara, dari pasangan
Soenarto Sujud dan Djumiati. Tahun 2012, penulis
lulus sarjana pada Jurusan Ilmu Komputer,
Fakultas Fakultas Matematika dan Ilmu
Pengetahuan Alam , Institut Pertanian Bogor (IPB).
Setelah menyelesaikan pendidikan sarjananya,
penulis bekerja sebagai staf di Direktorat
Komunikasi dan Sistem Informasi yang kini
berubah nama menjadi Direktorat Integrasi Data
dan Sistem Informasi. Penulis dipercaya untuk
membantu mengelola jaringan dan beberapa
aplikasi di IPB. Pada tahun 2012 penulis melanjutkan pendidikan magister di
jurusan Ilmu Komputer, Fakultas Matematika dan Ilmu Pengetahuan Alam, IPB.
Pada tahun 2014 penulis menikah dengan Fitri Insani dan pada tahun 2015
dikaruniai seorang anak bernama Maryam Adzkannisa.
Download