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)

cmd3c

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.