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.