Anda di halaman 1dari 11

Kelompok 4

1. Rafly Faldiansyah 210411100063


2. Niswatul Sifa 210411100145
3. Desti Fitrotun Nisa 210411100182

Optimasi fungsi matematika 2 variabel menggunakan Algoritma Genetika

Algoritma Genetika

 Algoritma genetika (genetic algorithm) adalah suatu metode dalam komputasi yang
terinspirasi dari prinsip evolusi dalam biologi, yang digunakan untuk mencari solusi
terbaik pada suatu masalah optimisasi. Algoritma ini menggunakan konsep seleksi alam,
crossover, dan mutasi dalam suatu populasi individu untuk menciptakan variasi genetik
baru dan mencari solusi yang lebih baik.
 Algoritma genetika menghasilkan solusi yang semakin baik secara iteratif melalui
generasi-generasi dengan cara melakukan seleksi berdasarkan kualitas solusi dan
menerapkan operator genetik seperti crossover (persilangan) dan mutasi untuk
menghasilkan keturunan baru.
 Algoritma genetika telah digunakan dalam berbagai aplikasi, seperti optimasi fungsi
matematika, pengaturan jadwal, optimasi rute, dan perancangan mesin.

Studi Kasus

Studi kasus yang kami ambil yaitu optimasi fungsi matematika untuk mencari nilai minimum
atau maksimum dari suatu fungsi.

Disini kami mencari nilai minimum dari fungsi f(x,y) = (x+2y-7)² + (2x+y-5)² yang terbatas pada
domain -10 ≤ x ≤ 10 dan -10 ≤ y ≤ 10.

Langkah – Langkah, Source Code serta Penjelasan Algoritma Genetika


1. Import Library

Penjelasan :

Library yang digunakan yaitu Numpy dan Pandas karena keduanya memiliki fitur dan
fungsi yang dapat memudahkan pengolahan data dan operasi matematika yang
dibutuhkan dalam algoritma genetika.

Pada kasus ini Library Pandas digunakan untuk mengubah struktur data menjadi
DataFrame yang lebih mudah digunakan dan diproses dalam algoritma genetika.

Sedangkan library numpy sangat berguna untuk melakukan operasi matematika pada
individu atau kromosom dalam populasi, seperti menghitung nilai fitness, melakukan
operasi aritmatika, atau menghitung jarak antarindividu. Selain itu, numpy juga dapat
digunakan untuk menghasilkan nilai acak yang dibutuhkan dalam tahap inisialisasi atau
mutasi.

Code :

import numpy as np

import pandas as pd

2. Inisialisasi Populasi Awal


Pada langkah ini, dibangun populasi awal yang terdiri dari beberapa individu secara acak
dengan nilai kromosom yang merepresentasikan solusi dari suatu masalah
Code :
# nilai minimum dan maximum dari setiap variable
min_value = -10
max_value = 10

# banyaknya variabel, panjang dari kromosom
m = 2

# jumlah kromosom dalam 1 populasi
n = 20
# banyaknya generasi
N = 100
def createPopulation():
    pop = np.random.rand(n, m)*(max_value - min_value) + min_value
    pop = pd.DataFrame(pop)
    pop.columns = ['x', 'y']

    return pop

pop = createPopulation()
pop

Penjelasan Code :
membuat fungsi createPopulation() yang digunakan untuk menghasilkan populasi awal
dalam algoritma genetika.
pop = np.random.rand(n, m)*(max_value - min_value) + min_value: Membuat array
numpy acak dengan ukuran n baris dan m kolom. Setiap elemen dalam array ini adalah
nilai acak yang dihasilkan oleh fungsi np.random.rand(), yang memiliki rentang antara 0
dan 1. Array ini kemudian dikalikan dengan rentang yang diinginkan (max_value -
min_value), dan ditambahkan dengan nilai minimum min_value, sehingga setiap elemen
dalam array memiliki rentang antara min_value dan max_value.

3. Evaluasi Fungsi Fitness


Setiap individu dalam populasi dihitung nilai fitnessnya, yaitu seberapa baik solusi dari
individu tersebut dalam mengatasi masalah yang diberikan.
Code :
def fitness(pop):
    fitness = (pop['x'] + 2*pop['y'] - 7)**2 + (2*pop['x'] + pop['y'] – 5)
**2
    pop['fitness'] = fitness

    return pop
pop = fitness(pop)
pop

Penjelasan Code :
fungsi fitness() menghitung nilai fitness dari setiap kromosom dalam populasi
menggunakan fungsi objektif pada persoalan optimasi, kemudian menambahkan kolom
fitness ke dalam dataframe pop, dan mengembalikan populasi dengan nilai fitness yang
sudah dihitung dalam bentuk dataframe pandas.

4. Seleksi
Pada tahap ini, individu-individu terbaik dipilih untuk menjadi induk (parent) dalam
generasi berikutnya.
Code :
def randomSelection():
    position = np.random.permutation(n)

    return position[0], position[1]

Penjelasan Code :
fungsi randomSelection() memilih dua kromosom secara acak dari populasi dengan
menggunakan bilangan bulat acak dari 0 hingga n-1. Hasil pemilihan ini disimpan dalam
sebuah tuple yang terdiri dari dua bilangan bulat yang dipilih secara acak.

5. Crossover
Pada tahap ini, kromosom dari induk dipadukan untuk menciptakan offspring baru.
Dalam crossover, biasanya dipilih dua induk secara acak dan kemudian bagian-bagian
dari kromosom mereka dipertukarkan untuk menciptakan offspring yang memiliki
kombinasi gen yang berbeda.
Code :
def crossover(pop):
    popc = pop.copy()
    for i in range(n):
        a, b = randomSelection()
        x = (pop.loc[a] + pop.loc[b])/2
        popc.loc[i] = x    

    return popc

popc = crossover(pop)
popc = fitness(popc)
popc

Penjelasan Code :
fungsi crossover() melakukan operasi crossover pada setiap kromosom dalam populasi
dengan memilih dua kromosom secara acak dari populasi menggunakan fungsi
randomSelection() dan menghitung rata-rata aritmatik dari kedua kromosom tersebut
sebagai titik potong untuk operasi crossover. Hasil operasi crossover kemudian disimpan
ke dalam dataframe popc yang merupakan salinan dari populasi pop. Populasi hasil
operasi crossover kemudian dikembalikan dalam bentuk dataframe pandas.

6. Mutasi
Pada tahap ini, dilakukan perubahan acak pada gen dalam kromosom offspring
(kromosom yang dihasilkan dari operasi crossover antara dua kromosom individu dalam
populasi) dengan tujuan menjaga variasi genetik dalam populasi dan mencegah
kehilangan keragaman genetik dalam populasi dan meningkatkan kemungkinan
menemukan solusi yang lebih optimal.
Code :
def mutation(popc):
    popm = popc.copy()

    for i in range(n):
        for j in popm.columns:
            popm.loc[i][j] += np.random.rand()*0.2-0.1
    return popm

popm = mutation(popc)
popm = fitness(popm)
popm

Penjelasan Code :
fungsi mutation() melakukan operasi mutasi pada setiap kromosom dalam populasi hasil
operasi crossover.
popm.loc[i][j] += np.random.rand()*0.2-0.1 yaitu Melakukan penambahan bilangan acak
yang bernilai antara -0.1 hingga 0.1 ke setiap nilai dalam kromosom pada baris ke-i dan
kolom ke-j dalam dataframe popm.
Hasil operasi mutasi kemudian disimpan ke dalam dataframe popm yang merupakan
salinan dari populasi popc. Populasi hasil operasi mutasi kemudian dikembalikan dalam
bentuk dataframe pandas.

7. Pemilihan Solusi Terbaik


Code :
def combinePopulation(pop, popc, popm):
    popAll = pop.copy()    

    popAll = pd.concat([popAll, popc], ignore_index=True)
    popAll = pd.concat([popAll, popm], ignore_index=True)

    popAll = popAll.drop_duplicates()

    popAll.index = range(len(popAll))

    return popAll

Penjelasan Code :
Fungsi combinePopulation() digunakan untuk menggabungkan populasi awal dengan
populasi offspring yang dihasilkan dari operasi crossover dan mutasi. Populasi awal
disalin terlebih dahulu dan dimasukkan ke dalam variabel popAll. Selanjutnya, populasi
offspring hasil dari operasi crossover dimasukkan ke dalam popAll menggunakan
fungsi concat(). Pada fungsi ini, parameter ignore_index=True digunakan agar indeks
dari hasil penggabungan tersebut dapat direset. Kemudian, populasi offspring hasil dari
operasi mutasi juga dimasukkan ke dalam popAll dengan menggunakan
fungsi concat() yang sama.
Setelah dilakukan penggabungan, fungsi drop_duplicates() digunakan untuk menghapus
individu-individu yang sama atau duplikat yang mungkin muncul karena penggabungan.
Akhirnya, indeks dari popAll direset dengan menggunakan index = range(len(popAll)).
Hasil penggabungan populasi awal, populasi offspring hasil dari operasi crossover dan
mutasi adalah popAll, yang selanjutnya akan digunakan untuk seleksi individu yang
terbaik dalam populasi.

Code :
popAll = combinePopulation(pop, popc, popm)
popAll

def sort(popAll):
    popAll = popAll.sort_values(by=['fitness'])

    popAll.index = range(len(popAll))

    return popAll

Penjelasan Code :
Fungsi sort() digunakan untuk mengurutkan populasi popAll berdasarkan nilai fitness
dari tiap individu yang ada dalam populasi. Pada baris pertama,
fungsi sort_values() digunakan untuk mengurutkan populasi berdasarkan nilai fitness
individu dari yang terkecil hingga yang terbesar dengan menggunakan
parameter by=['fitness']. Baris kedua popAll.index = range(len(popAll)) berfungsi untuk
mengubah indeks populasi setelah diurutkan. Hal ini diperlukan agar indeks dari individu
dalam populasi yang telah diurutkan kembali dimulai dari 0 hingga N-1. Akhirnya, fungsi
mengembalikan populasi yang telah diurutkan secara ascending berdasarkan nilai fitness
individu.

Code :
def elimination(popAll):
    pop = popAll.head(n)

    return pop

Penjelasan Code :
Fungsi elimination() digunakan untuk memilih sejumlah n individu terbaik dari
populasi popAll yang telah diurutkan berdasarkan nilai fitnessnya. Pada baris pertama,
fungsi head() digunakan untuk memilih n individu terbaik dari populasi popAll,
kemudian hasilnya disimpan dalam variabel pop. Fungsi ini mengembalikan
populasi pop yang terdiri dari n individu terbaik yang dipilih dari populasi popAll.

Code :
pop = elimination(popAll)
pop

pop = createPopulation()
pop = fitness(pop)
print('Populasi awal')
print(pop)

for i in range(1, N+1):
    popc = crossover(pop)
    popc = fitness(popc)

    popm = mutation(popc)
    popm = fitness(popm)

    popAll = combinePopulation(pop, popc, popm)
    popAll = sort(popAll)

    pop = elimination(popAll)   

    print()
    print(i)
    print(pop)
print()
print('Populasi akhir')
print(pop)

Hasil Running :

Penjelasan Code :
1) Baris pertama memanggil fungsi createPopulation() untuk membuat populasi awal
dengan ukuran n dan rentang nilai variabel antara min_value hingga max_value.
2) Kemudian, populasi awal yang dihasilkan pada langkah sebelumnya akan
dihitung nilai fitnessnya menggunakan fungsi fitness().
3) Baris selanjutnya mencetak informasi populasi awal yang terdiri dari
variabel x, y, dan nilai fitness.
4) Pada baris ke-4, terdapat loop for yang digunakan untuk melakukan iterasi
sebanyak N kali. Variabel N merupakan konstanta yang telah didefinisikan
sebelumnya.
5) Pada baris ke-5, dilakukan operasi crossover terhadap populasi saat ini
menggunakan fungsi crossover(). Populasi yang telah mengalami operasi
crossover ini kemudian dihitung nilai fitnessnya menggunakan fungsi fitness().
6) Pada baris ke-7, dilakukan operasi mutasi terhadap populasi yang telah melalui
operasi crossover pada langkah sebelumnya menggunakan fungsi mutation().
Populasi hasil mutasi ini kemudian dihitung nilai fitnessnya menggunakan
fungsi fitness().
7) Baris selanjutnya melakukan penggabungan antara populasi sebelumnya dengan
populasi hasil operasi crossover dan mutasi menggunakan
fungsi combinePopulation().
8) Populasi hasil penggabungan tersebut kemudian diurutkan berdasarkan nilai
fitnessnya menggunakan fungsi sort().
9) Selanjutnya, dilakukan seleksi elitisme terhadap n individu terbaik dari populasi
yang telah diurutkan pada baris sebelumnya menggunakan fungsi elimination().
10) Baris ke-11 hingga 14 mencetak informasi populasi setiap iterasi, yaitu nomor
iterasi dan populasi yang dihasilkan.
11) Setelah seluruh iterasi selesai, dilakukan pencetakan informasi populasi terakhir
pada baris ke-16.

8. Kesimpulan
Dalam kasus ini, kita tidak dapat memastikan bahwa algoritma akan menemukan nilai
minimum yang sebenarnya, karena ada banyak puncak lokal dalam fungsi objektif.
Namun, algoritma akan mencoba untuk menemukan solusi yang paling dekat dengan
nilai minimum, dengan harapan mendekati nilai minimum sebanyak mungkin.
Fungsi objektif yang digunakan dalam kasus ini adalah fungsi Rosenbrock, yang
memiliki banyak puncak lokal dan sulit untuk dioptimalkan.
Fungsi Rosenbrock adalah sebuah fungsi matematika yang biasa digunakan sebagai tes
untuk algoritma optimasi. Fungsinya ditulis sebagai:
f(x,y) = (a - x)^2 + b(y - x^2)^2
dengan a dan b adalah parameter fungsi. Fungsi Rosenbrock mempunyai sebuah
minimum global di titik (a, a^2), di mana f(a, a^2) = 0. Fungsi ini sering digunakan
sebagai contoh masalah optimasi non-linear, karena memiliki bentuk yang rumit dan
memiliki banyak local minimum.

Link Google Colab :


https://colab.research.google.com/drive/1zA5dy-ZQB5ZtbVYHeRJAdfQVH-LM_D3U?
usp=sharing

Anda mungkin juga menyukai