You are on page 1of 30

Algoritma genetika adalah algoritma komputasi yang diinspirasi teori evolusi yang kemudian

diadopsi menjadi algoritma komputasi untuk mencari solusi suatu permasalahan dengan cara
yang lebih 'alamiah. Salah satu aplikasi algoritma genetika adalah pada permasalahan optimasi
kombinasi, yaitu mendapatkan suatu nilai solusi optimal terhadap suatu permasalahan yang
mempunyai banyak kemungkinan solusi. Dalam tulisan ini akan dibahas teori dasar algoritma
genetika beserta contoh aplikasinya dalam menyelesaikan suatu permasalahan optimasi
kombinasi sederhana.
Teori Dasar Algoritma Genetika
Algoritma genetika yang dikembangkan oleh Goldberg adalah algoritma komputasi yang
diinspirasi teori evolusi Darwin yang menyatakan bahwa kelangsungan hidup suatu makhluk
dipengaruhi aturan 'yang kuat adalah yang menang. Darwin juga menyatakan bahwa
kelangsungan hidup suatu makhluk dapat dipertahankan melalui proses reproduksi, crossover,
dan mutasi. Konsep dalam teori evolusi Darwin tersebut kemudian diadopsi menjadi algoritma
komputasi untuk mencari solusi suatu permasalahan dengan cara yang lebih 'alamiah.
Sebuah solusi yang dibangkitkan dalam algoritma genetika disebut sebagai chromosome,
sedangkan kumpulan chromosome-chromosome tersebut disebut sebagai populasi. Sebuah
chromosome dibentuk dari komponen-komponen penyusun yang disebut sebagai gen dan
nilainya dapat berupa bilangan numerik, biner, simbol ataupun karakter tergantung dari
permasalahan yang ingin diselesaikan.
Chromosome-chromosome tersebut akan berevolusi secara berkelanjutan yang disebut dengan
generasi. Dalam tiap generasi chromosome-chromosome tersebut dievaluasi tingkat keberhasilan
nilai solusinya terhadap masalah yang ingin diselesaikan (IungsiobjektiI) menggunakan ukuran
yang disebut dengan Iitness. Untuk memilih chromosome yang tetap dipertahankan untuk
generasi selanjutnya dilakukan proses yang disebut dengan seleksi. Proses seleksi chromosome
menggunakan konsep aturan evolusi Darwin yang telah disebutkan sebelumnya yaitu
chromosome yang mempunyai nilai Iitness tinggi akan memiliki peluang lebih besar untuk
terpilih lagi pada generasi selanjutnya.

Chromosome-chromosome baru yang disebut dengan oIIspring, dibentuk dengan cara
melakukan perkawinan antar chromosome-chromosome dalam satu generasi yang disebut
sebagai proses crossover. Jumlah chromosome dalam populasi yang mengalami crossover
ditetukan oleh paramater yang disebut dengan crossoverrate. Mekanisme perubahan susunan
unsur penyusun mahkluk hidup akibat adanya Iaktor alam yang disebut dengan mutasi
direpresentasikan sebagai proses berubahnya satu atau lebih nilai gen dalam chromosome dengan
suatu nilai acak. Jumlah gen dalam populasi yang mengalami mutasi ditentukan oleh parameter
yang dinamakan mutationrate. Setelah beberapa generasi akan dihasilkan chromosome-
chromosome yang nilai gen-gennya konvergen ke suatu nilai tertentu yang merupakan solusi
terbaik yang dihasilkan oleh algoritma genetika terhadap permasalahan yang ingin diselesaikan.
Aplikasi Algoritma Genetika
Berikut adalah contoh aplikasi algoritma genetika yang digunakan untuk menyelesaikan masalah
kombinasi. Misalkan ada persamaan a2b3c4d 30, kita mencari nilai a, b, c, dan d yang
memenuhi persamaan diatas. Kita mencoba menggunakan algoritma genetika untuk
menyelesaikan permasalahan diatas.
Penjelasan mengenai langkah-langkah penyelesaian permasalahan diatas menggunakan
algoritma genetika adalah sebagai berikut:
1. Pembentukan chromosome
Karena yang dicari adalah nilai a, b, c, d maka variabel a, b, c, d dijadikan sebagai gen-gen
pembentuk chromosome. Batasan nilai variabel a adalah bilangan integer 0 sampai 30.
Sedangkan batasan nilai variabel b, c, dan d adalah bilangan integer 0 sampai 10.
2. Inisialisasi
Proses inisialisasi dilakukan dengan cara memberikan nilai awal gen-gen dengan nilai acak
sesuai batasan yang telah ditentukan.
Misalkan kita tentukan jumlah populasi adalah 6, maka:
Chromosome|1| |a;b;c;d| |12;05;03;08|
Chromosome|2| |a;b;c;d| |02;01;08;03|
Chromosome|3| |a;b;c;d| |10;04;03;04|
Chromosome|4| |a;b;c;d| |20;01;10;06|
Chromosome|5| |a;b;c;d| |01;04;03;09|
Chromosome|6| |a;b;c;d| |20;05;07;01|
3. Evaluasi Chromosome
Permasalahan yang ingin diselesaikan adalah nilai variabel a, b, c, dan d yang memenuhi
persamaan a2b3c4d 30, maka IungsiobjektiI yang dapat digunakan untuk mendapatkan
solusi adalah IungsiobjektiI(chromosome) , (a2b3c4d) 30 ,
Kita hitung IungsiobjektiI dari chromosome yang telah dibangkitkan:
IungsiobjektiI(chromosome|1|) Abs(( 12 2*5 3*3 4*8 ) 30)
Abs((12 10 9 32 ) 30)
Abs(63 30)
33
IungsiobjektiI(chromosome|2|) Abs(( 2 2*1 3*8 4*3 ) 30)
Abs(( 2 2 24 12 ) 30)
Abs(40 30)
10
IungsiobjektiI(chromosome|3|) Abs(( 10 2*4 3*3 4*4 ) 30)
Abs(( 10 8 9 16 ) 30)
Abs(43 30)
13
IungsiobjektiI(chromosome|4|) Abs(( 20 2*1 3*10 4*6 ) 30)
Abs(( 20 2 30 24 ) 30)
Abs(76 30)
46
IungsiobjektiI(chromosome|5|) Abs(( 1 2*4 3*3 4*9 ) 30)
Abs(( 1 8 9 36 ) 30)
Abs(54 30)
24
IungsiobjektiI(chromosome|6|) Abs(( 20 2*5 3*7 4*1 ) 30)
Abs(( 20 10 21 4) 30)
Abs(55 30)
25
Rata-rata dari Iungsi objektiI adalah:
rata-rata (331013462425)/6
151 / 6
25.167
4. Seleksi Chromosome
Proses seleksi dilakukan dengan cara membuat chromosome yang mempunyai IungsiobjektiI
kecil mempunyai kemungkinan terpilih yang besar atau mempunyai nilai probabilitas yang
tinggi. Untuk itu dapat digunakan Iungsi Iitness (1/(1IungsiobjektiI)), IungsiobjektiI perlu
ditambah 1 untuk menghindari kesalahan program yang diakibatkan pembagian oleh 0.
Iitness|1| 1 / (IungsiobjektiI|1|1)
1 / 34
0.0294
Iitness|2| 1 / (IungsiobjektiI|2|1)
1 / 11
0.0909
Iitness|3| 1 / (IungsiobjektiI|3|1)
1 / 14
0.0714
Iitness|4| 1 / (IungsiobjektiI|4|1)
1 / 47
0.0212
Iitness|5| 1 / (IungsiobjektiI|5|1)
1 / 25
0.0400
Iitness|6| 1 / (IungsiobjektiI|6|1)
1 / 26
0.0385
totalIitness 0.0294 0.0909 0.0714 0.0212 0.04 0.0385
0.2914
Rumus untuk mencari probabilitas: P|i| Iitness|i| / totalIitness
P|1| 0.0294 / 0.2914
0.1009
P|2| 0. 0909 / 0.2914
0.3119
P|3| 0. 0714 / 0.2914
0.2450
P|4| 0. 0212 / 0.2914
0.0728
P|5| 0.04 / 0.2914
0.1373
P|6| 0.0385 / 0.2914
0.1321
Dari probabilitas diatas dapat kita lihat kalau chromosome ke 2 yang mempunyai Iitness paling
besar maka chromosome tersebut mempunyai probabilitas untuk terpilih pada generasi
selanjutnya lebih besar dari chromosome lainnya. Untuk proses seleksi kita gunakan roulete
wheel, untuk itu kita harus mencari dahulu nilai kumulatiI probabilitasnya:
C|1| 0.1009
C|2| 0.1009 0.3119
0.4128
C|3| 0.1009 0.3119 0.2450
0.6578
C|4| 0.1009 0.3119 0.2450 0.0728
0.7306
C|5| 0.1009 0.3119 0.2450 0.0728 0.1373
0.8679
C|6| 0.1009 0.3119 0.2450 0.0728 0.1373 0.1321
1
Setelah dihitung cumulative probabilitasnya maka proses seleksi menggunakan roulete-wheel
dapat dilakukan. Prosesnya adalah dengan membangkitkan bilangan acak R dalam range 0-1.
Jika R|k| C|1| maka pilih chromosome 1 sebagai induk, selain itu pilih chromosome ke-k
sebagai induk dengan syarat C|k-1| R C|k|. Kita putar roulete wheel sebanyak jumlah
populasi yaitu 6 kali (bangkitkan bilangan acak R) dan pada tiap putaran, kita pilih satu
chromosome untuk populasi baru. Misal:
R|1| 0.201
R|2| 0.284
R|3| 0.009
R|4| 0.822
R|5| 0.398
R|6| 0.501
Angka acak pertama R|1| adalah lebih besar dari C|1| dan lebih kecil daripada C|2| maka pilih
chromosome|2| sebagai chromosome pada populasi baru, dari bilangan acak yang telah
dibangkitkan diatas maka populasi chromosome baru hasil proses seleksi adalah:
chromosome|1| chromosome|2|
chromosome|2| chromosome|2|
chromosome|3| chromosome|1|
chromosome|4| chromosome|5|
chromosome|5| chromosome|2|
chromosome|6| chromosome|3|
Chromosome baru hasil proses seleksi:
chromosome|1| |02;01;08;03|
chromosome|2| |02;01;08;03|
chromosome|3| |12;05;03;08|
chromosome|4| |01;04;03;09|
chromosome|5| |02;01;08;03|
chromosome|6| |10;04;03;04|
5. Crossover
Setelah proses seleksi maka proses selanjutnya adalah proses crossover. Metode yang digunakan
salah satunya adalah one-cut point, yaitu memilih secara acak satu posisi dalam chromosome
induk kemudian saling menukar gen. Chromosome yang dijadikan induk dipilih secara acak dan
jumlah chromosome yang mengalami crossover dipengaruhi oleh parameter crossoverrate ( pc
).
Pseudo-code untuk proses crossover adalah sebagai berikut:
begin
k 0;
while(kpopulasi) do
R|k| random(0-1);
iI (R|k| pc ) then
select Chromosome|k| as parent;
end;
k k 1;
end;
end;
Misal kita tentukan crossover probability adalah sebesar 25, maka diharapkan dalam satu
generasi ada 50 Chromosome (3 chromosome) dari satu generasi mengalami proses crossover.
Prosesnya adalah sebagai berikut:
Pertama kita bangkitkan bilangan acak R sebanyak jumlah populasi
R|1| 0.191
R|2| 0.259
R|3| 0.760
R|4| 0.006
R|5| 0.159
R|6| 0.340
Maka Chromosome ke k akan dipilih sebagai induk jika R|k| pc, dari bilangan acak R diatas
maka yang dijadikan induk adalah chromosome|1|, chromosome|4| dan chromosome|5|.
Setelah melakukan pemilihan induk proses selanjutnya adalah menentukan posisi crossover. Ini
dilakukan dengan cara membangkitkan bilangan acak dengan batasan 1 sampai (panjang
chromosome-1), dalam kasus ini bilangan acak yang dibangkitkan adalah 1 3. Misalkan
didapatkan posisi crossover adalah 1 maka chromosome induk akan dipotong mulai gen ke 1
kemudian potongan gen tersebut saling ditukarkan antar induk.
chromosome|1| ~ chromosome|4|
chromosome|4| ~ chromosome|5|
chromosome|5| ~ chromosome|1|
Posisi cut-point crossover dipilih menggunakan bilangan acak 1-3 sebanyak jumlah crossover
yang terjadi, misal
C|1| 1
C|2| 1
C|3| 2
oIIspring|1| chromosome|1| ~ chromosome|4|
|02;01;08;03| ~ |01;04;03;09|
|02;04;03;09|
oIIspring|4| Chromosome|4| ~ Chromosome|5|
|01;04;03;09| ~ |02;01;08;03|
|01;01;08;03|
oIIspring|5| Chromosome|5| ~ Chromosome|1|
|02;01;08;03| ~ |02;01;08;03|
|02;01;08;03|
Dengan demikian populasi Chromosome setelah mengalami proses crossover menjadi:
chromosome|1| |02;04;03;09|
chromosome|2| |02;01;08;03|
chromosome|3| |12;05;03;08|
chromosome|4| |01;01;08;03|
chromosome|5| |02;01;08;03|
chromosome|6| |10;04;03;04|
6. Mutasi
Jumlah chromosome yang mengalami mutasi dalam satu populasi ditentukan oleh parameter
mutationrate. Proses mutasi dilakukan dengan cara mengganti satu gen yang terpilih secara
acak dengan suatu nilai baru yang didapat secara acak. Prosesnya adalah sebagai berikut.
Pertama kita hitung dahulu panjang total gen yang ada dalam satu populasi. Dalam kasus ini
panjang total gen adalah totalgen (jumlah gen dalam chromosome) * jumlah populasi
4 * 6
24
Untuk memilih posisi gen yang mengalami mutasi dilakukan dengan cara membangkitkan
bilangan integer acak antara 1 sampai totalgen, yaitu 1 sampai 24. Jika bilangan acak yang kita
bangkitkan lebih kecil daripada variabel mutationrate (pm) maka pilih posisi tersebut sebagai
sub-chromosome yang mengalami mutasi. Misal pm kita tentukan 10 maka diharapkan ada
10 dari totalgen yang mengalami populasi:
jumlah mutasi 0.1 * 24
2.4
2
Misalkan setelah kita bangkitkan bilangan acak terpilih posisi gen 12 dan 18 yang mengalami
mutasi. Dengan demikian yang akan mengalami mutasi adalah chromosome ke-3 gen nomor 4
dan Chromosome ke-5 gen nomor 2. Maka nilai gen pada posisi tersebut kita ganti dengan
bilangan acak 0-30.
Misalkan bilangan acak yang terbangkitkan adalah 2 dan 5. Maka populasi chromosome setelah
mengalami proses mutasi adalah:
chromosome|1| |02;04;03;09|
chromosome|2| |02;01;08;03|
chromosome|3| |12;05;03;02|
chromosome|4| |01;01;08;03|
chromosome|5| |02;05;08;03|
chromosome|6| |10;04;03;04|
Setelah proses mutasi maka kita telah menyelesaikan satu iterasi dalam algoritma genetika atau
disebut dengan satu generasi. Maka Iungsiobjective setelah satu generasi adalah:
chromosome|1| |02;04;03;09|
IungsiobjektiI|1| Abs(( 2 2*4 3*3 4*9 ) 30)
Abs(( 2 8 9 36 ) 30)
Abs( 55 30)
25
chromosome|2| |02;01;08;03|
IungsiobjektiI|2| Abs(( 2 2*1 3*8 4*3 ) 30)
Abs(( 2 2 24 12 ) 30)
Abs(40 30)
10
chromosome|3| |12;05;03;02|
IungsiobjektiI|3| Abs(( 12 2*5 3*3 4*2 ) 30)
Abs(( 12 10 9 8 ) 30)
Abs(39 30)
9
chromosome|4| |01;01;08;03|
IungsiobjektiI|4| Abs(( 1 2*1 3*8 4*3 ) 30)
Abs(( 1 2 24 12 ) 30)
Abs(39 30)
9
chromosome|5| |02;05;08;03|
IungsiobjektiI|5| Abs(( 2 2*5 3*8 4*3 ) 30)
Abs(( 2 10 24 12 ) 30)
Abs(48 30)
18
chromosome|6| |10;04;03;04|
IungsiobjektiI|6| Abs(( 10 2*4 3*3 4*4 ) 30)
Abs(( 10 8 9 16 ) 30)
Abs(43 30)
13
Rata-rata Iungsi objektiI setelah satu generasi adalah:
rata-rata ( 25 10 9 9 18 13) / 6
84 / 6
14.0
Dapat dilihat dari hasil perhitungan Iungsi objektiI diatas bahwa setelah satu generasi, nilai hasil
rata-rata IungsiobjektiI lebih menurun dibandingkan hasil IungsiobjektiI pada saat sebelum
mengalami seleksi, crossover dan mutasi. Hal ini menunjukkan bahwa chromosome atau solusi
yang dihasilkan setelah satu generasi lebih baik dibandingkan generasi sebelumnya. Maka pada
generasi selanjutnya chromosome-chromosome yang baru adalah:
chromosome|1| |02;04;03;09|
chromosome|2| |02;01;08;03|
chromosome|3| |12;05;03;02|
chromosome|4| |01;01;08;03|
chromosome|5| |02;05;08;03|
chromosome|6| |10;04;03;04|
Chromosome-chromosome ini akan mengalami proses yang sama seperti generasi sebelumnya
yaitu proses evaluasi, seleksi, crossover dan mutasi yang kemudian akan menghasilkan
chromosome-chromosome baru untuk generasi yang selanjutnya. Proses ini akan berulang
sampai sejumlah generasi yang telah ditetapkan sebelumnya.
Setelah 50 generasi didapatkan chromosome yang terbaik adalah:
Chromosome |07;05;03;01|
Jika didekode maka:
a7 ; b5 ; c3 ; d1
Jika dihitung terhadap persamaan I a2b3c4d:
7 (2*5) (3*3) (4*1) 30
Penutup
Pada contoh diatas telah diberikan contoh mengenai penerapan algoritma genetika untuk mencari
solusi suatu persamaan matematis sederhana. Source code dalam bahasa Java untuk contoh
diatas dapat didownload di milis sc-ina yahoogroups:








Algoritma Genetika Sederhana dengan Pseudo Code C-Like
ebruari 13, 2011 Rahmat Ihsan
Permasalahan:
Diberikan Iungsi di bawah ini:
Maksimalkan I(x
1
, x
2
) 21.5 x
1
sin(4pix
1
) x
2
sin(20pix
2
)
-3.0 x
1
12.1
4.1 x
2
5.8
Input:
jumlah populasi awal 5o5*size,
probabilitas crossover 5
r
,
probabilitas mutation 5
m
,
banyak iterasi
ungsi-fungsi:
ungsi yang harus ada dalam program:
initPop: untuk mendapatkan populasi awal sebanyak popsize
Evaluation: mengevaluasi nilai Iitnes masing-masing kromosom
Selection:
menciptakan populasi baru dari populasi lama yang berhubungan dengan distribusi probabilitas
pada nilai Iitness-nya.
Crossover:
sebagai metode pemotongan kromosom, yang secara random memilih titik potong pada
kromosom dan menggantinya dengan bagian kanan dari 2 kromosom induk (parent) untuk
menghasilkan kromosom anak (offspring)
Mutation:
mengubah satu atau lebih gen dengan probabilitas sama dengan angka mutasi.
ungsi tambahan:
printBitStr: mencetak bit string, baik populasi maupun substring.
BitRequired: mencari bit yang diperlukan untuk variable x
1
dan x
2
.
decimalsubstr: mendapatkan nilai decimal dari variable substring
decision: mendapatkan variable keputusan
separate:
memisahkan bitstring sumber sebanyak popsize pada bit ke batas bawah sampai batas atas
kemudian dicopykan ke populasi bitstring tujuan, bisa juga untuk mengcopy semua bitstring
sumber ke bitstring tujuan.
Eval: mengevaluasi Iungsi obyektiI.
Pilihan: mengatur mode output, mode adalah variable global.
Output:
Nilai maximum yang didapat, nilai x
1
dan x
2
saat kondisi maksimum.
max, x
1
max, dan x
2
max adalah variable global.
ALGORITMA:
Fungsi main
1. Atur mode output yang ditampilkan
2. hitung range
3. hitung jumlah bit yang diperlukan oleh variable x1 dan x2
4. input populasi, jumlah iterasi, peluang crossover, dan peluang mutasi.
5. i-0
6. do
i. evaluation
ii. selection
iii. crossover
iv. mutation
7. until ijumlah iterasi
8. print nilai maximum Iungsi, x
1
dan x
2
saat Iungsi maximum
ungsi printBitStr
Input: int bitstr|maxpop||maxbit|
1. j0, i0
2. while bitstr|i||j| not equal to -1
a. do while bitstr|i||j| not equal to -1
i. do print bitstr|i||j|
ii. j - j1
b. change to next row
c. j0
d. i
ungsi bitRequired
Input: unit
1. i-0
2. while unit/(2
i
) ~ 1
a. do i - i1
3. return i
ungsi decimalsubstr
Input: substr|maxbit|
1. temp0
2. Ior jnumber oI bit 2 down to 0
a. temp - tempsubstr|j|*2
(i-1)-j

3. return temp
ungsi decision
Input: double aj, bj; long substrd; int mj
1. d convert substrd to double
2. hasil a
j
d*
3. return hasil
ungsi separate
Input: bitstr|maxpop||maxbit|, substr|maxpop||maxbit|, bawah, atas
1. j-bawah
2. i-0
3. while bitstr|i||j-bawah|not equal to -1
a. do while jatas
i. substr|i||j-bawah| - bitstr|i||j|
ii. j
b. substr|i||j-bawah| - -1;
c. substr|i||j-bawah1| - NIL;
d. j - bawah;
e. i - i1
4. substr|i||0| - -1;
5. substr|i||1| - NIL;
ungsi eval
Input: x|2|
1. Ix - 21.5 x|0|*sin(4*a*x|0|) x|1|*cos(4*a*x|1|)
2. return Ix
ungsi Evaluation
Input parameter: double x|2||MAXPOP|, int bitstr|MAXPOP||MAXBIT|, int
substr|2||MAXPOP||MAXBIT|, int bit1, int bit2.
1. x1bawah - -3.0
2. x1atas - 12.1
3. x2bawah - 4.1
4. x2atas - 5.8
5. Ior I 0 to popsize
a. substrd|0||i| - decimalsubstr(substr|0||i|)
b. substrd|1||i| - decimalsubstr(substr|1||i|)
c. x|0||i|-decision(x1bawah,substrd|0||i|,x1atas,bit1)
d. x|1||i|-decision(x2bawah,substrd|1||i|,x2atas,bit2)
e. xT|i||0|-x|0||i|;
I. xT|i||1|-x|1||i|;
g. V|i|eval(xT|i|);
h. II V|i|~max then
i. Max-V|i|;
ii. x1max-x|0||i|;
iii. x2max-x|1||i|;
6. substrd|0||i| - ;
7. substrd|1||i| - ;
8. x|0||i| - ;
9. x|1||i| - ;
10.xT|i||0| - ;
ungsi Selection
Input Parameter: double x|2||MAXPOP|, int bitstr|MAXPOP||MAXBIT|, int bit1, int bit2
1. or i0 to popsize
a. xT|i||0| - x|0||i|;
b. xT|i||1| - x|1||i|;
c. V|i| - eval(xT|i|);
d. totalitness - totalitnessV|i|;
2. or i0 to popsize
a. PK|i| - V|i|/totalitness;
b. QK|i| - 0;
c. or j0 to i
i. QK|i| - QK|i|PK|j|
3. or i0 to popsize
a. Rrandom number(double) between 0 to 1
b. j - 0
c. While R ~ QK|j|
i. j - j1
d. or k0 to totalbit
i. DupBS|i||k| - bitstr|j||k|
e. DupBS|i||k| - -1
4. DupBS|i||0| - -1
5. separate(DupBS,bitstr,0,bit1bit2);
ungsi CrossOver
Input parameter: int bitstr|maxpop||maxbit|, double Pc, int bit1, int bit2
1. do
a. k-0;
b. count-0;
c. while kpopsize do
i. rrandom number(double) between 0 to 1
ii. iI(rPc) then
1. iSelected|count| - k
2. count - count 1
iii. end iI
iv. k - k1
2. until count more than 1 and even (not odd)
3. separate(bitstr,Vselected,0,bit1bit2)
4. i - 0
5. while icount
a. pos random number between 0 to totalbit-1
b. Ior kpos to bit1bit2
i. temp - Vselected|iSelected|i|||k|;
ii. Vselected|iSelected|i|||k|-Vselected|iSelected|i1|||k|;
iii. Vselected|iSelected|i1|||k| - temp;
c. i - i2
6. separate(Vselected,bitstr,0,bit1bit2);
ungsi Mutation
Input parameter: int bitstr|maxpop||maxbit|, double Pm, int bit1, int bit2
1. count - 0
2. Ior i0 to popsize*(bit1bit2)
a. r random number (double) between 0 to 1
b. iI rPm then
i. BitPos|count|-i
ii. Count - count 1
c. End iI
3. Ior i0 to count
a. ChromNo - BitPos|i|/(bit1bit2)
b. BitNo - BitPos|i|(bit1bit2)
c. iI(bitstr|ChromNo||BitNo|0) then
i. bitstr|ChromNo||BitNo| - 1
d. else
i. bitstr|ChromNo||BitNo| - 0
e. end iI




Pendahuluan:
Hi setiap .. artikel ini adalah algoritma pencarian tentang Genetika ... secara umum, itu
digunakan untuk mencari nilai maksimum atau minimum dari Iungsi yang diberikan dengan
menggunakan konsep Chromes biologis dan gen.
Dasar:
Jadi untuk sekarang ... apa yang perlu kita lakukan ... adalah untuk membuat 2 mengatur
populasi ... mana satu set saat ini memiliki titik awal (Chromes), dan set berikutnya berisi poin-
poin (Chromes) yang dihasilkan oleh set pertama .... dan seterusnya ... sampai kita selesai no.
iterasi.
yaitu: mengatur secara acak saat ini untuk Chromes diinisialisasi:
populasi sekarang dari 4 Chromes,
* Setiap baris adalah sebuah krom.
* Chrom masing terdiri dari 6 gen (6 kolom) |1 tanda bit dan 5 bit lainnya| dan nilai Iitness
|kolom terakhir ke kanan| yang mewakili nilai Iungsi y (x) pada nilai chrom yang diberikan (x )
... mana chrom tersebut dikonversi ke nilai integer dari konversi bit ...
c
tidak.
Sb b5 b4 b3 b2 b1 cocok
1 0 1 0 1 1 0 8
2 1 0 0 1 0 0 6
3 0 0 1 0 1 0 9
4 0 0 0 1 1 0
12
Fungsi:
- Memilib Cbromes terbaik:
seperti dalam prinsip-prinsip hidup yang sebenarnya ... "Survival adalah untuk terkuat", jadi
kami memilih 2 yang terbaik elemen dari himpunan (populasi saat ini) sesuai dengan kebugaran
mereka (kebugaran tertinggi sebagai kita mencari nilai maksimum dari Iungsi).
set baru:
c
tidak.
Sb b5 b4 b3 b2 b1 cocok
4 0 0 0 1 1 0 12
3 0 0 1 0 1 0 9
- Palang untuk mengbasilkan anak-anak:
jadi sekarang di set baru kita memiliki dua Chromes dipetik dari set yang lama ... mereka adalah
orang tua ke dua Chromes lain dalam mengatur siapa yang akan dihasilkan oleh menyeberang
selama dua Chromes pada titik tertentu dan pertukaran dua bagian sebagai berikut:
Menyeberang terjadi setelah sedikit 3 (perhatikan huruf tebal dan miring digit yang
menyeberang pada anak-anak dari orang tua)
c
tidak.
Sb b5 b4 b3 b2 b1 cocok
4 0 0 0 1 1 0 12
3 9
anak
1
0 0 0 14
anak
2
1 1 0

- Mutasi dengan probabilitas rendab:
Mutasi terjadi dengan probabilitas rendah dalam satu krom di set ... dengan membalik satu dari
bit di chrom tersebut.
- pengbentian loop:
sekarang kita memiliki set baru ... jadi kami membuat set yang lama sama dengan yang baru ...
dan melakukan 1,2, dan 3 lagi tergantung pada no. iterasi.
Langkah demi langkah 5engkodean:
Include / / untuk menggunakan Iungsi printI
Include conio.h~ / / untuk menggunakan Iungsi getche
Include / / untuk menggunakan Iungsi rand
typedeI struct chrom / / menciptakan struktur chrom

singkat int bit |6|;
int cocok;
Chrom}; / / sekarang kita memiliki tipe chrom yang dapat kita gunakan
void * evpop (chrom popcurrent |4|); / / mendeIinisikan Iungsi-Iungsi yang akan kita gunakan
int x (chrom popcurrent);
int y (int x);
void * pickchroms (chrom popcurrent |4|);
void * crossover (chrom popnext |4|);
void * mutasi (chrom popnext |4|);
void main () / / Iungsi utama

int num; / / num adalah tidak. iterasi
int i, j;
printI ("\ nWelcome dengan Algoritma Genetika dikodekan oleh Luay Al-wesi: www.luay.inIo \
nthe Algoritma ini didasarkan pada Iungsi y -x ` 2 5 untuk mencari nilai maksimum dari
Iungsi ... \ n "); / / pengenalan program


masukkan: printI ("\ nMasukkan no iterasi:.");
scanI (" d", & num); / / masukkan no. iterasi dalam num
chrom popcurrent |4|; / / kita membuat 4 Chromes dari popcurrent
chrom popnext |4|; / / kita membuat 4 Chromes dari popnext
iI (num 1) / / jika sudah-nomor dimasukkan .. masukkan num lagi
goto masukkan;

evpop (popcurrent); / / menginisialisasinya saat pop

Ior (i 0; i num; i ) / / loop num kali

printI ("\ ni d \ n", i); / / mencetak jumlah iterasi
Ior (j 0; j 4; j )
popnext |j| popcurrent |j|; / / copy popcurrent untuk popnext dalam rangka untuk
menyesuaikan
pickchroms (popnext); / / memilih yang terbaik Chromes
crossover (popnext); / / menyeberang untuk mendapatkan Chromes anak
mutasi (popnext); / / bermutasi dengan probabilitas rendah
Ior (j 0; j 4; j )
popcurrent |j| popnext |j|; / / copy Chromes dari popnext untuk popcurrent
} / / Loop kembali sampai tidak ada. iterasi terlampaui
printI ("\ nTekan sembarang tombol untuk mengakhiri!");

Ilushall (); / / Ilush buIIer masukan
getche (); / / menunggu karakter dari keyboard untuk mengakhiri

} / / Akhir utama
void * evpop (chrom popcurrent |4|) / / mengambil pointer ke chrom dari 4 elemen

int i, j, nilai;
int acak;
Ior (j 0; j 4; j ) / / loop j untuk memilih Chromes dari |0| ke |3|

Ior (i 0; i 6; i ) / / loop saya untuk memilih gen dari chrom dari |0| untuk |5|


acak rand (); / / menciptakan nilai acak
acak ( acak 2); / / membuat nilai acak o atau 1 hanya
popcurrent |j| bit |i| random;. / / inisialisasi bit |i| dari chrom |j| dengan acak
} / / Akhir untuk (i)

nilai x (popcurrent |j|); / / mendapatkan nilai chrom sebagai bilangan bulat
popcurrent |j| cocok y (x (popcurrent |j|));. / / calcualte kebugaran chrom |j|
printI ("\ n popcurrent | d| d d d d d d d nilai kebugaran / / Mencetak
chrom |j|

} / / Akhir Ior (j)


return (0);
} / / Akhir Iungsi evpop
int x (chrom popcurrent) / Iungsi / x yang mengevaluasi nilai dari sebuah chrom diberikan

int z;

iI (popcurrent.bit |5| 1)
z z * (-1); / / z jumlah (bit * bobot mereka) dengan nilai tanda
kembali (z); / / mengembalikan nilai z
} / / Akhir Iungsi x
int y (int x) / / Iungsi y yang kita cari nilai maksimum itu dibutuhkan x nilai

int y;
y - (x * x) 5; / / Iungsi adalah y - (x ` 2) 5
kembali (y);
} / / Akhir Iungsi y
void * pickchroms (chrom popcurrent |4|) / / pickchroms membutuhkan pointer ke array dari
chroms

int i, j;
chrom temp; / / temp krom untuk digunakan dalam pemilahan
Ior (i 0; i 3; i ) / / menyortir set diberikan karena kebugaran
Ior (j 0; j 3; j )

iI (popcurrent |j 1| cocok~. popcurrent |j|. cocok)

temp popcurrent |j 1|;
popcurrent |j 1| popcurrent |j|;
popcurrent |j| temp;
} / / Akhir jika
} / / Akhir untuk loop
Ior (i 0; i 4; i )
printI ("\ nSorting: popnext | d| d kebugaran"., i, popcurrent |i| Iit); / / cetak hasilnya
printI ("\ n"); / / cetak baris baru
Ilushall (); / / Ilush buIIer masukan
return (0);
} / / Akhir Iungsi Chromes memilih

void * crossover (chrom popnext |4|) / / Iungsi crossover yang membutuhkan pointer ke array
dari Chromes

int acak;
int i;
acak rand (); / / lintas di titik acak
acak (( acak 5) 1); titik / / lintas harus antara (1 - 5)
Ior (i 0; i acak; i ) / / melintasi bit bawah indeks titik silang

popnext |2| bit |i| popnext |0| bit |i|;.. / / anak 1 menyeberang
popnext |3| bit |i| popnext |1| bit |i|;.. / / anak 2 menyeberang
} / / Akhir untuk

Ior (i acak; i 6; i ) / / melintasi bit melampaui indeks titik silang

popnext |2| bit |i| popnext |1| bit |i|;.. / / anak 1 menyeberang
popnext |3| bit |i| popnext |0| bit |i|;.. / / chlid 2 menyeberang
} / / Akhir untuk

Ior (i 0; i 4; i )
popnext |i| cocok y (x (popnext |i|));. / / menghitung nilai Iitness untuk set baru

Ior (i 0; i 4; i )
printI ("\ nCrossOver popnext | d| d d d d d d d nilai kebugaran
/ / Mencetak bit, nilai dan kebugaran untuk Chromes set baru

return (0);
} / / Akhir Iungsi crossover yang
void * mutasi (chrom popnext |4|) / / mutasi Iuntion diberi pointer ke array Chromes


int acak;
int baris, col, nilai;
acak rand () 50; / / nilai acak antara (0 - 49)
iI (random 25) / / Suppusiong Probabilitas mutasi adalah 2

col rand () 6; kolom / / acak (gen) memilih
baris rand () 4; baris / / acak (krom) memilih

iI (popnext |baris|. bit |col| 0) / / membalikkan bit ke 1 jika itu adalah 0
popnext |baris| sedikit |col| 1.;

lain jika (popnext |baris|. bit |col| 1) / / membalikkan bit untuk 0 jika itu adalah 1
popnext |baris| sedikit |col| 0.;

popnext |baris| cocok y (x (popnext |baris|));. / / menghitung kebugaran untuk krom bermutasi
nilai x (popnext |baris|);
printI ("\ nMutation terjadi pada popnext | d| sedikit | d|: d d d d d d d
nilai

/ / Cetak indeks krom, bit, nilai, Iintness dari krom bermutasi
} / / Akhir jika

return (0);
} / / Akhir dari mutasi
Akhirnya
harap Anda mendapatkan keuntungan dari kode ini ...
tuhan memberkati
Lisensi
Artikel ini tidak memiliki izin eksplisit melekat padanya, tetapi mungkin berisi penggunaan
istilah dalam teks artikel atau Iile download sendiri. Jika ragu silahkan hubungi penulis melalui
Iorum diskusi di bawah ini.
DaItar penulis mungkin menggunakan lisensi dapat ditemukan di sini
Tentang Penulis
f

lnslnyur
lnLernaslonal 1urnkey
SlsLem
kuwalL












asar genetik algoritma

/ / Generik GA
/ / Biner tunggal kromosom linier
/ / Interpretasi terserah kepada program - tidak ada interpretasi dibuat di
sini




/ / Aku memikirkan randomisasi semua benda dalam konstruktor mereka,
/ / Tapi ini mungkin tidak perlu setengah waktu
/ / (Dan bisa bahkan mungkin menyebabkan loop tak terbatas).
/ / Sebaliknya, saya memiliki hirarki randomisasi,
/ / Sehingga memanggil mengacak () fungsi pada Penduduk yang
/ / Randomises semua individu di dalamnya, dll

const int l = 30; / / panjang kromosom
const int n = 50; / / ukuran populasi (bahkan harus)
pc ganda const = 0,8; / / probabilitas crossover
am ganda const = 0,005; / / probabilitas mutasi


Kromosom A:

alel typedef Boolean; / / alfabet adalah 0,1 (k = 2)



/ / Array saya sendiri, dengan 1 .. n pengindeksan:

kelas AlleleArray
,
publik:
Rahasia alel l,;
Alel & operator , (int i) ,return rahasia i-1,;,
/ / Kembali acuan karena x , mungkin muncul pada persamaan LHS
,;



Kromosom kelas: AlleleArray publik
,
publik:
Kromosom & operator = (Kromosom & c)
,
for (int i = 1; i <= l; i + +)
,( Ini) i, = c i,;,
kembali ini;
,

mengacak ()
,
for (int i = 1; i <= l; i + +)
,( Ini) i, = r.flip (0,5);, / / adil pelemparan
,

teman ostream & operator <<(ostream & streaming, Kromosom & c)
,
for (int i = 1; i <= l; i + +)
,
Boolean b = c i,;
streaming <<b;
,
kembali stream;
,
,;


ang utama, masalab spesifik deklarasi, ma|u:

positiveFitness ganda (Kromosom);

/ / Bagaimana fit Kromosom ini.
/ / Aplikasi pengguna harus kembali kebugaran positif



Seorang individu:

kelas individu
,
publik:
Kromosom; / / a 1, .. a l,
int parent1;
int parent2;
int crossoversite;
kebugaran ganda;

updateFitness () / / kromosom baru ..
,
kebugaran = positiveFitness (a); / / meminta pada aplikasi untuk menilai
itu
if (kebugaran <0)
,
/ / Kembali kesalahan
,
,

Individu & operator = (const individu & x)
,
a = xa;
parent1 = x.parent1;
parent2 = x.parent2;
crossoversite = x.crossoversite;
updateFitness ();
kembali ini;
,

makeMe (Kromosom c, int p1, p2 int, int x)
,
a = c;
parent1 = p1;
parent2 = p2;
crossoversite = x;
updateFitness ();
,

mengacak ()
,
a.randomise ();
parent1 = 0;
parent2 = 0;
crossoversite = 0;
updateFitness ();
,

teman ostream & operator <<(ostream & aliran, individu & x)
,
sprintf (buf, "(% 3d,% 3d)", x.parent1, x.parent2);
streaming <<buf;
if (== x.crossoversite l)
sprintf (buf, ", -"); / / ada crossover yang ada
lain
sprintf (buf, ",% 3d", x.crossoversite);
streaming <<buf;
streaming <<xa;
sprintf (buf, "% 8.3f", x.fitness);
streaming <<buf;
kembali stream;
,
,;




Populasi A:

kelas IndividualArray
,
publik:
Individu rahasia n,;
Individu & operator , (int i) ,return rahasia i-1,;,
,;



Populasi kelas: IndividualArray publik
,
publik:
Penduduk & operator = (Populasi & p)
,
for (int i = 1; i <= n; i + +)
,( Ini) i, = p i,;,
kembali ini;
,

mengacak ()
,
for (int i = 1; i <= n; i + +)
,( Ini) i, mengacak ();.,
,

Populasi ()
,
if ((n% 2) = 0!)
,
/ / Kembali kesalahan
,
,
,;







Kelas Dunia
,
publik:
Populasi A; / / A 1, .. A n,

/ / Statistik ini dihitung dengan runStatistics:
Terbaik individu;
worstFitness ganda, averageFitness, sumFitness;


mengacak () ,A.randomise (); runStatistics ();,

int pilih ();
Crossover (int, int); / / deposit output dalam:
Child1 individu, child2;
Alel bermutasi (alel);
,;




Pilib individu yang acak untuk reproduksi. Fittest yang paling mungkin
untuk dipilib:

int Dunia:: pilih ()
/ / Sebenarnya disebut beberapa kali
/ / Waktu masing-masing hanya memilih satu A i, untuk reproduksi
,
poin ganda = r.prob () sumFitness;
/ / Titik antara fitnesses 0 dan sigma acak ('spin roda')
/ / Cari titik ini berpotongan individu
ganda parsial = 0,0;
int i = 0;
sementara ((parsial <= titik) & & (i <n))
,
i + +;
parsial = parsial + A i, kebugaran.;
,
/ / Loop telah berhenti karena baik parsial baru saja melewati batas, atau
i = n.
/ / Baik cara:
kembali (i);
,



Mencampur gen orang tua :

World:: crossover (int parent1, int parent2)
/ / Menulis output ke child1, child2
,
/ / Pertama membangun kromosom ..
Kromosom p1 = A parent1, yang;.
Kromosom p2 = A parent2, a;.
Kromosom c1;
Kromosom c2;
int situs, i;

if (r.flip (pc)) / / koin sandal tertimbang dengan pc
situs = r.restricted (1, l-1); / / Crossover - dipotong acak, dari
setelah 1 sampai setelah l-1
lain
situs = l; / / silang tidak - 'dipotong' setelah l

/ / Memotong datang setelah situs,
/ / Sehingga elemen 1 ke situs pergi ke satu sisi, situs +1 untuk l ke lain:
for (i = 1; i <= situs; i + +)
,
c1 i, = bermutasi (p1 i,);
c2 i, = bermutasi (p2 i,);
,
for (i = 1 situs; i <= l; i + +)
,
c1 i, = bermutasi (p2 i,);
c2 i, = bermutasi (p1 i,);
,


/ / Kemudian membangun individu ..
child1.makeMe (c1, parent1, parent2, situs);
child2.makeMe (c2, parent1, parent2, situs);
,



ertentu probabilitas mutasi:

Alel Dunia:: bermutasi (a alel)
/ / Bermutasi alel dengan probabilitas am
,
if (r.flip (pm))
kembali (a!);
lain
kembali (a);
,



Membangun sebuab populasi baru dari yang saat ini:

World:: berikutnya ()
/ / Ganti populasi A
,
runStatistics (); / / hanya untuk keamanan, pastikan kami yang up to date
dengan A
Populasi temp;
for (int i = 1; i <= n-1; i = i +2) / / membangun berpasangan - temporer
(1,2), temp (3,4), .. temp (n-1, n)
,
crossover (pilih (), pilih ()); / / memilih dua pasangan dan membangun 2
anak baru
temp i, = child1;
temp i +1, = child2;
,
/ / Sekarang kita selesai dengan A. tua menggantinya:
Sebuah temp =;
,


World:: runStatistics ()
/ / Mengupdate berbagai statistik tentang diriku sendiri
,
terbaik = A 1,;
worstFitness = A 1, kebugaran;.
sumFitness = A 1, kebugaran;.
for (int i = 2; i <= n; i + +)
,
ganda f = A i, kebugaran.;
sumFitness = sumFitness + f;
if (f <worstFitness) worstFitness = f;
if (f best.fitness) terbaik = A i,;
,
/ / Ini semua sekarang sepenuhnya dihitung.
/ / Semua yang tersisa adalah:
averageFitness = sumFitness / n;
,




/ / Laporan statistik perpustakaan GA adalah hanya peduli dengan internal
GA.
/ / Mereka hanya berurusan dengan konsep 'string' dan 'kebugaran'
/ / Mereka tidak tahu mengapa string yang telah kebugaran yang,
/ / Atau apa artinya:

World:: detailedReport (int t, ostream & aliran)
,
runStatistics ();
streaming <<"\ n \ n \ n";
streaming <<"t =" <<t <<"\ n";
streaming <<"orang tua #, Xsite tali kebugaran \ n";
streaming <<"---------------------------------------------- --------------
\ n ";
for (int i = 1; i <= n; i + +)
,
sprintf (buf, "% 3d", i);
streaming <<buf <<A i,;
if (A i, kebugaran. averageFitness)
streaming <<"+";
streaming <<"\ n";
,
streaming <<"---------------------------------------------- --------------
\ n ";
,


World:: summaryReport (int t, ostream & aliran)
/ / (Dunia luar memberitahu saya apa waktu (yaitu apa generasi) itu)
,
runStatistics ();
sprintf (buf, "t =%-3d% 0.3f terburuk = rata-rata =% 0.3f terbaik = (",
t, worstFitness, averageFitness);
streaming <<buf;
streaming <<best.a;
sprintf (buf, ",% 0.3f) \ n",
best.fitness);
streaming <<buf;
,

You might also like