import os
import math # modul math berisi fungsi matematika seerti pi atau log
import random # modul import angka random tipe data float renatng 0,0 hingga 1,0
import numpy as np # library python yang digunakan untuk proses komputasi
numerik
class GA:
populasi = 6
gen = ["a", "b", "c", "d"]
batas_nilai = {
'max': 10,
'min': 0
}
co = 50/100
mutasi = 10/100
jumlah_gen = 24
gen_next = [Link](4) # Arrange digunakan untuk membuat array
stop = False
# Inisialisasi chromosome secara random
def __init__(self):
self.first_chrom = [Link]( # randint() menghasilkan angka
acak dengan tipe data integer yang berada pada rentang yang telah ditentukan.
low=self.batas_nilai['min'], high=self.batas_nilai['max'],
size=([Link], len([Link])))
print("Inisialisasi")
print(self.first_chrom)
print("****************")
print(" ")
print("Evaluasi")
# Evaluasi chromosome
def Evaluasi(self, chromosome, generasi):
# mencari fungsi objektif
print("Generasi["+str(generasi+1)+"]")
# len() digunakan untuk mengidentifikasi dan mengetahui seberapa panjang
jumlah item atau anggota pada suatu objek.
jumlah_chromosome = len(chromosome)
# Arrange digunakan untuk membuat array
objektif = [Link](jumlah_chromosome)
# Fungsi dtype() digunakan untuk membuat objek tipe data.
fitness = [Link](jumlah_chromosome, dtype='f')
# Perulangan Fungsi Objektif
# range() merupakan fungsi yang menghasilkan list. Fungsi ini akan
menciptakan sebuah list baru dengan rentang nilai tertentu.
for x in range(len(chromosome)):
# fungsi objektif
# fo = fungsi objektif(chromosome[x])=o[x]
fungsi_obj = abs( # abs() digunakan untuk mengembalikan nilai
absolut dari suatu angka/bilangan.
(chromosome[x][0]+2*chromosome[x][1]+3*chromosome[x]
[2]+4*chromosome[x][3])-30)
objektif[x] = fungsi_obj
# Seleksi Chromosome dan mencari fitness
hasil_fitness = 1/(fungsi_obj+1)
fitness[x] = hasil_fitness
if(hasil_fitness == 1):
[Link] = True
print("Chromosome ke - {0} : {1}, Fitness = {2}".format( #
format() digunakan untuk mengatur format string yang nantinya akan dicetak atau
ditampilkan ke layar.
x+1, np.array2string(chromosome[x], separator=','),
hasil_fitness)) # fungsi array2string digunakan untuk mendapatkan representasi
string dari array
print(objektif)
# Probabilitas
probabilitas = [Link](jumlah_chromosome, dtype='f')
total_fitness = [Link]() # rumus total fitness
probabilitas = fitness/total_fitness # rumus mencari probabilitas
print("Total Fitness = {}".format(str(total_fitness)))
print("Rata-rata Fitness = {}".format(str([Link](fitness))))
print("Probabilitas = {}".format(
np.array2string(probabilitas, separator=',')))
print("Probabilitas Terbesar = {}, Pada Chromosome ke - {}".format(
probabilitas[[Link]()], str([Link]()+1)))
# argmax adalah fungsi yang memberikan indeks angka terbesar di baris atau kolom
yang diberikan dan baris atau kolom
print("Chromosome yang mungkin terpilih pada generasi selanjutnya =
{}".format(
np.array2string(chromosome[[Link]()], separator=',')))
self.gen_next = chromosome[[Link]()]
print(" ")
# Mencari Nilai Kumulatif (C)
Cum = [Link](jumlah_chromosome, dtype='f')
total_x = 0
for x in range(len(probabilitas)):
total_x += probabilitas[x]
Cum[x] = total_x
# Putar roulette wheel sebanyak populasi (R)
R = [Link](len(fitness))
chromosome_baru = [Link](
jumlah_chromosome*len([Link])).reshape(jumlah_chromosome,
len([Link])) # Fungsi reshape digunakan untuk membuat atau merubah baris kolom
# Mencari Chromosome baru dari roulette wheel
for y in range(len(R)):
for k in range(len(chromosome_baru)):
if(R[y] < Cum[0]):
chromosome_baru[y] = chromosome[0]
elif((Cum[k-1] < R[y]) & (R[y] < Cum[k])):
chromosome_baru[y] = chromosome[k]
# Mencari crossover(co) Chromosome
R = [Link](jumlah_chromosome)
index_chrome_induk = []
for p in range(len(R)):
if(R[p] < [Link]):
index_chrome_induk.append(p)
# Menentukan Posisi crossover(co)
posisi_cross = [Link](low=1, high=len( # randint()
menghasilkan angka acak dengan tipe data integer yang berada pada rentang yang
telah ditentukan.
[Link]), size=len(index_chrome_induk))
# Menentukan Posisi Cut Point co
offspring = [Link](len([Link])*len(index_chrome_induk)
).reshape(len(index_chrome_induk), len([Link]))
# Fungsi reshape digunakan untuk membuat atau merubah baris kolom
for i_parent in range(len(index_chrome_induk)):
index_chrome_1 = index_chrome_induk[i_parent]
if(i_parent == len(index_chrome_induk)-1):
index_chrome_2 = index_chrome_induk[0]
else:
index_chrome_2 = index_chrome_induk[i_parent+1]
for p in range(len(chromosome_baru[index_chrome_1])):
if(p >= posisi_cross[i_parent]):
offspring[i_parent][p] = chromosome_baru[index_chrome_2][p]
else:
offspring[i_parent][p] = chromosome_baru[index_chrome_1][p]
for x in range(len(offspring)):
chromosome_baru[index_chrome_induk[x]] = offspring[x]
# Mutasi Chromosome
jumlah_gen = len(chromosome) * len(chromosome[0])
jumlah_mutasi = [Link] * jumlah_gen # rumus menghitung jumlah
mutasi
jumlah_mutasi = int(jumlah_mutasi)
random_i_mutasi = [Link](
low=0, high=jumlah_gen, size=jumlah_mutasi)
for x in range(len(random_i_mutasi)):
index_mutasi = random_i_mutasi[x]
banyak_chromosome = len(chromosome)
banyak_gen = len(chromosome[0])
random_value = [Link]( # randint() menghasilkan angka acak
dengan tipe data integer yang berada pada rentang yang telah ditentukan.
self.batas_nilai['min'], self.batas_nilai['max'])
if(index_mutasi <= banyak_gen):
chromosome_baru[0][index_mutasi-1]
else:
posisi_y = index_mutasi/banyak_gen
posisi_y = int(posisi_y)
posisi_x = index_mutasi % banyak_gen
chromosome_baru[posisi_y][posisi_x] = random_value
return chromosome_baru
def do_now(self):
chromosome_current = self.first_chrom
for generasi in range(0, self.jumlah_gen):
if([Link] != True):
chromosome_current = [Link](
chromosome_current, generasi)
print(self.gen_next)
# Run Class
run = GA()
run.do_now()