Algoritma Genetika adalah salah satu algoritma yang digunakan untuk mengoptimasi hasil akhir berdasarkan sebaran inputan data acak. Contoh kasus yang akan dibahas kali ini adalah untuk mengoptimasi performa mobil dengan mengupgrade parts tertentu.
Algoritma Genetika adalah proses pencarian yang didasarkan pada seleksi alam. Teknik ini secara umum digunakan untuk menghasilkan solusi optimasi dan teknik pencarian. Algoritma Genetika menggunakan teknik yang diinspirasi dari teori evolusi alam, seperti seleksi, warisan, crossover, dan mutasi.
Pada contoh kasus ini, diasumsikan ada 3 kategori parts yang ingin diupgrade, yaitu knalpot, rem, dan mesin.
Masing-masing item memiliki biaya sendiri dan besar poin performa yang dihasilkan.
Maka tentukan pasangan parts dengan jumlah poin performa paling tinggi dan biayanya termasuk dalam biaya yang dimiliki
Contoh data untuk masing-masing kategori adalah sebagai berikut
Knalpot
Nama Item | Biaya | Poin Performa |
---|---|---|
Knalpot 1 | 2500 | 10 |
Knalpot 2 | 5000 | 15 |
Knalpot 3 | 3500 | 11 |
Knalpot 4 | 2000 | 8 |
Knalpot 5 | 4000 | 12 |
Rem
Nama Item | Biaya | Poin Performa |
---|---|---|
Rem 1 | 500 | 3 |
Rem 2 | 1000 | 5 |
Rem 3 | 800 | 4 |
Rem 4 | 700 | 4 |
Rem 5 | 1200 | 6 |
Mesin
Nama Item | Biaya | Poin Performa |
---|---|---|
Mesin 1 | 10000 | 30 |
Mesin 2 | 9000 | 25 |
Mesin 3 | 12000 | 40 |
Mesin 4 | 10500 | 33 |
Mesin 5 | 9500 | 28 |
Langkah pertama adalah memasukkan data-data yang digunakan.
Contoh data adalah sebagai berikut
Dim knalpot(4, 1) As Double knalpot(0, 0) = 2500 knalpot(0, 1) = 10 knalpot(1, 0) = 5000 knalpot(1, 1) = 15 knalpot(2, 0) = 3500 knalpot(2, 1) = 11 knalpot(3, 0) = 2000 knalpot(3, 1) = 8 knalpot(4, 0) = 4000 knalpot(4, 1) = 12 Dim brake(4, 1) As Double brake(0, 0) = 500 brake(0, 1) = 3 brake(1, 0) = 1000 brake(1, 1) = 5 brake(2, 0) = 800 brake(2, 1) = 4 brake(3, 0) = 700 brake(3, 1) = 4 brake(4, 0) = 1200 brake(4, 1) = 6 Dim mesin(4, 1) As Double mesin(0, 0) = 10000 mesin(0, 1) = 30 mesin(1, 0) = 9000 mesin(1, 1) = 25 mesin(2, 0) = 12000 mesin(2, 1) = 40 mesin(3, 0) = 10500 mesin(3, 1) = 33 mesin(4, 0) = 9500 mesin(4, 1) = 28
Sebelum masuk kedalam bagian perhitungan, ada beberapa inputan data yang harus diketahui, yaitu
* Tentukan besar modal yang dimiliki
Diasumsikan dalam kasus ini, modal yang tersedia adalah 15000
Const modal As Double = 15000
* Tentukan iterasi
Diasumsikan dalam kasus ini, akan dilakukan 5 kali perulangan mutasi dan crossover dalam sekali perhitungan
Const jumlahIterasi As Double = 5
* Tentukan besar popsize
popsize adalah jumlah baris data yang dibuat dalam satu kali iterasi
Diasumsikan dalam kasus ini, jumlah popsize adalah 10
Const popsize As Double = 10
* Tentukan probabilitas crossover
probabilitas crossover adalah persentase jumlah baris data crossover yang dibuat dalam satu kali iterasi
nantinya jumlah baris data crossover = popsize * probabilitas crossover
Diasumsikan dalam kasus ini, probabilitas crossover adalah 0.4, sehingga nantinya muncul 4 baris data crossover
Const crossover As Double = 0.4
* Tentukan probabilitas mutasi
probabilitas mutasi adalah persentase jumlah baris data mutasi yang dibuat dalam satu kali iterasi
nantinya jumlah baris data mutasi = popsize * probabilitas mutasi
Diasumsikan dalam kasus ini, probabilitas mutasi adalah 0.3, sehingga nantinya muncul 3 baris data mutasi
Const mutasi As Double = 0.3
Langkah-langkah penggunaan algoritma ini adalah
1. Inisialisasi Populasi awal
Populasi adalah baris data sebanyak inputan popsize.
Isi dari populasi adalah pengambilan data secara acak dari masing-masing kategori
Jika total biaya pada baris acak tersebut melebihi modal, maka ulangi pengambilan acak.
iIndeksPopulasi(iPopsize, 0) = rnd.Next(0, 4) iIndeksPopulasi(iPopsize, 1) = rnd.Next(0, 4) iIndeksPopulasi(iPopsize, 2) = rnd.Next(0, 4) iPopulation(iPopsize, 0) = knalpot(iIndeksPopulasi(iPopsize, 0), 0) iPopulation(iPopsize, 1) = brake(iIndeksPopulasi(iPopsize, 1), 0) iPopulation(iPopsize, 2) = mesin(iIndeksPopulasi(iPopsize, 2), 0) Dim iTotal As Double = iPopulation(iPopsize, 0) + iPopulation(iPopsize, 1) + iPopulation(iPopsize, 2) If iTotal > modal Then Continue Do
2. Hitung Fitness untuk setiap baris data
Semakin tinggi nilai fitness, maka baris data tersebut semakin mendekati data optimal
Rumus untuk nilai fitness bisa disesuaikan, tergantung banyak parameter yang ingin digunakan dalam perhitungan
Diasumsikan dalam kasus ini, rumus nilai fitness adalah hanya melalui jumlah poin performa yang dihasilkan masing-masing parts terpilih
iPopulation(iPopsize, 3) = knalpot(iIndeksPopulasi(iPopsize, 0), 1) + brake(iIndeksPopulasi(iPopsize, 1), 1) + mesin(iIndeksPopulasi(iPopsize, 2), 1)
3. Lakukan perhitungan crossover
Crossover adalah pembuatan baris data baru berdasarkan baris data pada populasi awal
Ambil 2 baris data awal secara acak, kemudian tukar datanya pada sebuah kategori acak, catat hasilnya menjadi 2 baris data baru
Inputan probabilitas = 0.4, maka akan dihasilkan 0.4 * 10 = 4 data baru
Karena dalam sekali perhitungan menghasilkan 2 baris data baru, maka hanya perlu melakukan 2x perhitungan
Dim iIndeksDataAwal1 As Integer = 0 Dim iIndeksDataAwal2 As Integer = 0 Dim iIndeksTukar As Integer = 0 Do While iIndeksDataAwal1 = iIndeksDataAwal2 iIndeksDataAwal1 = rnd.Next(0, popsize - 1) iIndeksDataAwal2 = rnd.Next(0, popsize - 1) iIndeksTukar = rnd.Next(0, 2) Loop iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 1), 0) = iIndeksPopulasi(IIf(iIndeksTukar = 0, iIndeksDataAwal2, iIndeksDataAwal1), 0) iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 1), 1) = iIndeksPopulasi(IIf(iIndeksTukar = 1, iIndeksDataAwal2, iIndeksDataAwal1), 1) iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 1), 2) = iIndeksPopulasi(IIf(iIndeksTukar = 2, iIndeksDataAwal2, iIndeksDataAwal1), 2) iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 2), 0) = iIndeksPopulasi(IIf(iIndeksTukar = 0, iIndeksDataAwal1, iIndeksDataAwal2), 0) iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 2), 1) = iIndeksPopulasi(IIf(iIndeksTukar = 1, iIndeksDataAwal1, iIndeksDataAwal2), 1) iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 2), 2) = iIndeksPopulasi(IIf(iIndeksTukar = 2, iIndeksDataAwal1, iIndeksDataAwal2), 2) iPopulation(popsize - 1 + (iCrossover * 2 + 1), 0) = iPopulation(IIf(iIndeksTukar = 0, iIndeksDataAwal2, iIndeksDataAwal1), 0) iPopulation(popsize - 1 + (iCrossover * 2 + 1), 1) = iPopulation(IIf(iIndeksTukar = 1, iIndeksDataAwal2, iIndeksDataAwal1), 1) iPopulation(popsize - 1 + (iCrossover * 2 + 1), 2) = iPopulation(IIf(iIndeksTukar = 2, iIndeksDataAwal2, iIndeksDataAwal1), 2) iPopulation(popsize - 1 + (iCrossover * 2 + 2), 0) = iPopulation(IIf(iIndeksTukar = 0, iIndeksDataAwal1, iIndeksDataAwal2), 0) iPopulation(popsize - 1 + (iCrossover * 2 + 2), 1) = iPopulation(IIf(iIndeksTukar = 1, iIndeksDataAwal1, iIndeksDataAwal2), 1) iPopulation(popsize - 1 + (iCrossover * 2 + 2), 2) = iPopulation(IIf(iIndeksTukar = 2, iIndeksDataAwal1, iIndeksDataAwal2), 2) Dim iTotal As Double = iPopulation(popsize - 1 + (iCrossover * 2 + 1), 0) + iPopulation(popsize - 1 + (iCrossover * 2 + 1), 1) + iPopulation(popsize - 1 + (iCrossover * 2 + 1), 2) If iTotal > modal Then Continue Do Dim iTotal2 As Double = iPopulation(popsize - 1 + (iCrossover * 2 + 2), 0) + iPopulation(popsize - 1 + (iCrossover * 2 + 2), 1) + iPopulation(popsize - 1 + (iCrossover * 2 + 2), 2) If iTotal2 > modal Then Continue Do
4. Hitung Fitness untuk setiap baris data baru pada perhitungan crossover
iPopulation(popsize - 1 + (iCrossover * 2 + 1), 3) = knalpot(iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 1), 0), 1) + brake(iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 1), 1), 1) + mesin(iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 1), 2), 1) iPopulation(popsize - 1 + (iCrossover * 2 + 2), 3) = knalpot(iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 2), 0), 1) + brake(iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 2), 1), 1) + mesin(iIndeksPopulasi(popsize - 1 + (iCrossover * 2 + 2), 2), 1)
5. Lakukan perhitungan mutasi
Mutasi adalah pembuatan baris data baru berdasarkan baris data pada populasi awal
Ambil 1 baris data awal secara acak, kemudian ganti data pada sebuah kategori acak, catat hasilnya menjadi baris data baru
Inputan probabilitas = 0.3, maka akan dihasilkan 0.3 * 10 = 3 data baru
Dim iParentIndeks As Integer = 0 Dim iIndeksTukar As Integer = 0 iParentIndeks = rnd.Next(0, popsize - 1) iIndeksTukar = rnd.Next(0, 2) If iIndeksTukar = 0 Then Dim iIndeksMasterItem As Double = -1 Do While iIndeksMasterItem = -1 Or iIndeksMasterItem = iIndeksPopulasi(iParentIndeks, 0) iIndeksMasterItem = rnd.Next(0, 4) Loop iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 0) = iIndeksMasterItem iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 0) = knalpot(iIndeksMasterItem, 0) Else iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 0) = iIndeksPopulasi(iParentIndeks, 0) iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 0) = iPopulation(iParentIndeks, 0) End If If iIndeksTukar = 1 Then Dim iIndeksMasterItem As Double = -1 Do While iIndeksMasterItem = -1 Or iIndeksMasterItem = iIndeksPopulasi(iParentIndeks, 1) iIndeksMasterItem = rnd.Next(0, 4) Loop iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 1) = iIndeksMasterItem iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 1) = brake(iIndeksMasterItem, 0) Else iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 1) = iIndeksPopulasi(iParentIndeks, 1) iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 1) = iPopulation(iParentIndeks, 1) End If If iIndeksTukar = 2 Then Dim iIndeksMasterItem As Double = -1 Do While iIndeksMasterItem = -1 Or iIndeksMasterItem = iIndeksPopulasi(iParentIndeks, 2) iIndeksMasterItem = rnd.Next(0, 4) Loop iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 2) = iIndeksMasterItem iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 2) = mesin(iIndeksMasterItem, 0) Else iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 2) = iIndeksPopulasi(iParentIndeks, 2) iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 2) = iPopulation(iParentIndeks, 2) End If Dim iTotal As Double = iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 0) + iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 1) + iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 2) If iTotal > modal Then Continue Do
6. Hitung Fitness untuk baris data baru pada perhitungan mutasi
iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 3) = knalpot(iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 0), 1) + brake(iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 1), 1) + mesin(iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + (iMutasi + 1), 2), 1)
7. Urutkan baris data ini berdasarkan fitness tertinggi
Kemudian ambil data sebanyak popsize, dan data ini akan digunakan untuk perhitungan selanjutnya
Dim dt As DataTable dt = New DataTable dt.Rows.Clear() dt.Columns.Clear() dt.Columns.Add("No") dt.Columns.Add("Knalpot") dt.Columns.Add("Rem") dt.Columns.Add("Mesin") dt.Columns.Add("Fitness") dt.Columns("Fitness").DataType = GetType(Double) Dim dr As DataRow For i As Integer = 0 To UBound(iPopulation) dr = dt.NewRow dr(0) = i For j As Integer = 0 To 3 dr(j + 1) = iPopulation(i, j) Next dt.Rows.Add(dr) Next Dim dv As DataView = dt.DefaultView dv.Sort = "Fitness DESC" dt = dv.ToTable ReDim iPopulation(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + iPopulasiMutasi, 3) For i As Integer = 0 To popsize - 1 For j As Integer = 0 To 3 iPopulation(i, j) = dt.Rows(i)(j + 1) Next Next Dim iSortIndeks(popsize - 1) As Double For i As Integer = 0 To popsize - 1 iSortIndeks(i) = dt.Rows(i)(0) Next Dim dt2 As DataTable dt2 = New DataTable dt2.Rows.Clear() dt2.Columns.Clear() dt2.Columns.Add("No") dt2.Columns.Add("Knalpot") dt2.Columns.Add("Rem") dt2.Columns.Add("Mesin") dt2.Columns.Add("Fitness") dt2.Columns("Fitness").DataType = GetType(Double) For i As Integer = 0 To UBound(iIndeksPopulasi) dr = dt2.NewRow dr(0) = i For j As Integer = 0 To 3 dr(j + 1) = iIndeksPopulasi(i, j) Next dt2.Rows.Add(dr) Next ReDim iIndeksPopulasi(popsize - 1 + Math.Round(iPopulasiCrossover / 2) * 2 + iPopulasiMutasi, 3) For i As Integer = 0 To popsize - 1 For j As Integer = 0 To 3 iIndeksPopulasi(i, j) = dt2.Rows(iSortIndeks(i))(j + 1) Next Next
8. Ulangi perhitungan crossover, mutasi dan sorting (point nomor 3 – 7) sebanyak parameter jumlah iterasi
Setelah itu akan didapatkan data paling optimal, yaitu baris data paling awal / pertama
/br>
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
[sdm_download id=”215″ fancy=”0″]
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.
Leave a Reply