STUDI KASUS
Jika
diketahui bahwa α = 0.05 dan β = 25, berapakah nilai maksimum dari
fungsi Ψ berikut,
Dari persamaan ini,
nilai Ψ akan bernilai maksimum, yaitu sama dengan 1, pada x1 = x2 = ... = xn =
0.
Dengan menggunakan
fungsi EvaluasiIndividu ini,
function fitness = EvaluasiIndividu(x)
n = length(x);
alpha = 0.05;
beta = 25;
SumXi2 = 0;
for ii=1:n
SumXi2 = SumXi2 + x(ii)^2;
end
SumCos = 0;
for ii=1:n
SumjXj = 0;
for jj=1:ii
SumjXj = SumjXj + jj*x(jj);
end
SumCos = SumCos + cos(beta
* x(ii) * sqrt(ii) * SumjXj);
end
fitness = 0.5 + (1/(2*n)) *
exp(-alpha*SumXi2) *
SumCos;
Diterapkan ke sintaks AGoptimasi dengan sedikit perubahan
dari sintaks pada bab sebelumnya,
clc % Me-refresh command
window
clear all % Menghapus semua semua variabel yang sedang
aktif
Nvar = 10; % Jumlah variabel
pada fungsi yang dioptimasi
Nbit = 10; % Jumlah bit yang
mengkodekan satu variabel
JumGen = Nbit*Nvar; % Jumlah gen dalam kromosom
Rb = -2; %
Batas bawah interval
Ra = 2; % Batas atas
interval
UkPop = 300; % Jumlah
kromosom dalam populasi
Psilang = 0.8; % Probabilitas
pindah silang
Pmutasi = 0.005; % Probabilitas
mutasi
MaxG = 5000; % Jumlah
generasi
Fthreshold = 1; % Threshold untuk
nilai Fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
% Inisialisasi grafis 2D
hfig = figure;
hold on
title('Optimasi fungsi kompleks menggunakan AG
standar')
set(hfig, 'position', [50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot = plot(1:MaxG,zeros(1,MaxG));
htext1 = text(0.6*MaxG,0.75*Bgraf,sprintf('Fitness terbaik: %9.8f', 0.0));
htext2 = text(0.6*MaxG,0.70*Bgraf,sprintf('X1 : %9.4f', 0.0));
htext3 = text(0.6*MaxG,0.65*Bgraf,sprintf('X2 : %9.4f', 0.0));
htext4 = text(0.6*MaxG,0.60*Bgraf,sprintf('X3 : %9.8f', 0.0));
htext5 = text(0.6*MaxG,0.55*Bgraf,sprintf('X4 : %9.8f', 0.0));
htext6 = text(0.6*MaxG,0.50*Bgraf,sprintf('X5 : %9.8f', 0.0));
htext7 = text(0.6*MaxG,0.45*Bgraf,sprintf('X6 : %9.8f', 0.0));
htext8 = text(0.6*MaxG,0.40*Bgraf,sprintf('X7 : %9.8f', 0.0));
htext9 = text(0.6*MaxG,0.35*Bgraf,sprintf('X8 : %9.8f', 0.0));
htext10 = text(0.6*MaxG,0.30*Bgraf,sprintf('X9 : %9.8f', 0.0));
htext11 = text(0.6*MaxG,0.25*Bgraf,sprintf('X10: %9.8f', 0.0));
htext12 = text(0.6*MaxG,0.20*Bgraf,sprintf('Nilai maksimum: %9.8f', 0.0));
htext13 = text(0.6*MaxG,0.15*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext14 = text(0.6*MaxG,0.10*Bgraf,sprintf('Probabilitas mutasi: %4.3f', 0.0));
htext15 = text(0.6*MaxG,0.05*Bgraf,sprintf('Jumlah bit/variabel: %4.3f', 0.0));
xlabel('Generasi');
ylabel('Fitness terbaik');
hold off
drawnow;
% Inisialisasi populasi
Populasi = InisialisasiPopulasi(UkPop,JumGen);
% Loop evolusi
for generasi=1:MaxG,
x = DekodekanKromosom(Populasi(1,:),Nvar,Nbit,Ra,Rb);
Fitness(1) = EvaluasiIndividu(x);
MaxF = Fitness(1);
MinF = Fitness(1);
IndeksIndividuTerbaik = 1;
for ii=2:UkPop,
Kromosom = Populasi(ii,:);
x = DekodekanKromosom(Kromosom,Nvar,Nbit,Ra,Rb);
Fitness(ii) = EvaluasiIndividu(x);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
BestX = x;
end
if (Fitness(ii) < MinF),
MinF = Fitness(ii);
end
end
% Penanganan grafis 2D
plotvector = get(hbestplot,'YData');
plotvector(generasi) = MaxF;
set(hbestplot,'YData',plotvector);
set(htext1,'String',sprintf('Fitness terbaik: %9.8f', MaxF));
set(htext2,'String',sprintf('X1 : %9.8f', BestX(1)));
set(htext3,'String',sprintf('X2 : %9.8f', BestX(2)));
set(htext4,'String',sprintf('X3 : %9.8f', BestX(3)));
set(htext5,'String',sprintf('X4 : %9.8f', BestX(4)));
set(htext6,'String',sprintf('X5 : %9.8f', BestX(5)));
set(htext7,'String',sprintf('X6 : %9.8f', BestX(6)));
set(htext8,'String',sprintf('X7 : %9.8f', BestX(7)));
set(htext9,'String',sprintf('X8 : %9.8f', BestX(8)));
set(htext10,'String',sprintf('X9 : %9.8f', BestX(9)));
set(htext11,'String',sprintf('X10: %9.8f', BestX(10)));
set(htext12,'String',sprintf('Nilai maksimum: %9.8f', MaxF));
set(htext13,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext14,'String',sprintf('Probabilitas mutasi: %4.3f', Pmutasi));
set(htext15,'String',sprintf('Jumlah bit/variabel: %2.0f', Nbit));
drawnow
if MaxF >= Fthreshold,
break;
end
TempPopulasi = Populasi;
% Elitisme:
% - Buat satu kopi kromosom terbaik jika ukuran populasi ganjil
% - Buat dua kopi kromosom terbaik jika ukuran populasi genap
if mod(UkPop,2)==0, % ukuran populasi genap
IterasiMulai = 3;
TempPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
TempPopulasi(2,:) =
Populasi(IndeksIndividuTerbaik,:);
else % ukuran populasi
ganjil
IterasiMulai = 2;
TempPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
end
LinearFitness = LinearFitnessRanking(UkPop,Fitness,MaxF,MinF);
% Roulette-wheel selection dan pindah silang
for jj=IterasiMulai:2:UkPop,
IP1 = RouletteWheel(UkPop,LinearFitness);
IP2 = RouletteWheel(UkPop,LinearFitness);
if (rand <
Psilang),
Anak = PindahSilang(Populasi(IP1,:),Populasi(IP2,:),JumGen);
TempPopulasi(jj,:) = Anak(1,:);
TempPopulasi(jj+1,:) =
Anak(2,:);
else
TempPopulasi(jj,:) = Populasi(IP1,:);
TempPopulasi(jj+1,:) =
Populasi(IP2,:);
end
end
% Mutasi dilakukan pada semua kromosom
for kk=IterasiMulai:UkPop,
TempPopulasi(kk,:) = Mutasi(TempPopulasi(kk,:),JumGen,Pmutasi);
end
% Generational Replacement: mengganti semua kromosom sekaligus
Populasi = TempPopulasi;
end
Pada TSP,
jumlah jalur yang mungkin diperoleh dengan menggunakan rumus permutasi pada
persamaan berikut,
a. asimetris
b. simetris.
Skema
Pengkodean menggunakan permutation encoding, dengan setiap kromosom
akan merepresentasikan nomor urut kota. Jumlah gen dalam setiap kromosom sama
dengan jumlah kota, atau ditulis dalam fungsi berikut:
function Populasi =
TSPInisialisasiPopulasi(UkPop,JumGen)
for ii=1:UkPop
[Xval,Ind] = sort(rand(1,JumGen));
Populasi(ii,:) = Ind;
end
Nilai Fitness
Problem pada nilai fitness adalah meminimalkan total
biaya, total biaya dihitung dari jarak kartesian antar kota. yang dapat dihitung dengan
rumus:
function fitness = TSPEvaluasiIndividu(Kromosom,JumGen,XYkota)
TB = 0;
for ii=1:JumGen-1,
TB = TB + norm(XYkota(Kromosom(ii),:) -
XYkota(Kromosom(ii+1),:));
end
% Jalur harus kembali ke kota asal
TB = TB + norm(XYkota(Kromosom(JumGen),:) -
XYkota(Kromosom(1),:));
fitness = 1 / TB;
Linear Fitness
Ranking
Tujuannya menghindari kecenderungan konvergen pada optimum lokal, dengan
fungsi yang masih sama seperti pada bab 3 sebelumnya.
Roulette-Wheel
Digunakan untuk mencari parent terbaik, dengan cara yag sama pada AGstandar
pada bab 3.
Pindah Silang
Diterapkan dengan menggunakan skema order crossover.
function Anak =
TSPPindahSilang(Bapak,Ibu,JumGen)
cp1 = 1 +
fix(rand*(JumGen-1));
cp2 = 1 +
fix(rand*(JumGen-1));
while cp2==cp1
cp2 = 1 +
fix(rand*(JumGen-1));
end
if cp1 < cp2,
cps = cp1;
cpd = cp2;
else
cps = cp2;
cpd = cp1;
end
Anak(1,cps+1:cpd) = Ibu(cps+1:cpd);
Anak(2,cps+1:cpd) = Bapak(cps+1:cpd);
SisaGenbapak = [];
SisaGenIbu = [];
for ii=1:JumGen
if
~ismember(Bapak(ii),Anak(1,:))
SisaGenbapak = [SisaGenbapak Bapak(ii)];
end
if ~ismember(Ibu(ii),Anak(2,:))
SisaGenIbu = [SisaGenIbu Ibu(ii)];
end
end
Anak(1,cpd+1:JumGen) = SisaGenbapak(1:JumGen-cpd);
Anak(1,1:cps) = SisaGenbapak(1+JumGen-cpd:length(SisaGe
nbapak));
Anak(2,cpd+1:JumGen) = SisaGenIbu(1:JumGen-cpd);
Anak(2,1:cps) = SisaGenIbu(1+JumGen-cpd:length(SisaGe
nIbu));
Mutasi
Dilakukan dengan menggunakan skema swapping
mutation, dengan masukan kromosom, JumGen, dan Pmutasi.
function
MutKrom = TSPMutasi(Kromosom,JumGen,Pmutasi)
MutKrom = Kromosom;
for ii=1:JumGen,
if rand <
Pmutasi,
TM2 = 1 +
fix(rand*JumGen);
while TM2==ii,
TM2 = 1 +
fix(rand*JumGen);
end
temp = MutKrom(ii);
MutKrom(ii) = MutKrom(TM2);
MutKrom(TM2) = temp;
end
end
Program Utama
clc
clear all
XYkota = [1 3; 1 7;
3 9; 5 3; 7
1; 9 5; 9 9;
11 1; 15 7; 19
3];
JumGen = length(XYkota(:,1)); % Jumlah gen
(jumlah kota)
UkPop = 100; % Jumlah kromosom dalam populasi
Psilang = 0.8; % Probabilitas pindah silang
Pmutasi = 0.005; % Probabilitas mutasi
MaxG = 100; % Jumlah generasi
PanjJalHarp = 40; % Panjang Jalur yang diharapkan
Fthreshold = 1/PanjJalHarp; % Threshold
untuk fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
hfig = figure;
hold on
set(hfig, 'position',
[50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG));
hbestplot2 = plot(1:MaxG,zeros(1,MaxG));
htext1 =
text(0.6*MaxG,0.25*Bgraf,spr
intf('Fitness terbaik: %7.6f',
0.0));
htext2 =
text(0.6*MaxG,0.20*Bgraf,spr
intf('Fitness rata-rata: %7.6f',
0.0));
htext3 =
text(0.6*MaxG,0.15*Bgraf,spr
intf('Panjang jalur terbaik: %7.3f',
0.0));
htext4 =
text(0.6*MaxG,0.10*Bgraf,spr
intf('Ukuran populasi: %3.0f',
0.0));
htext5 =
text(0.6*MaxG,0.05*Bgraf,spr
intf('Probabilitas Mutasi: %4.3f',
0.0));
xlabel('Generasi');
ylabel('Fitness');
hold off
drawnow;
% Inisialisasi Populasi
Populasi = TSPInisialisasiPopulasi(UkPop,JumGen);
for generasi=1:MaxG,
MaxF = TSPEvaluasiIndividu(Populasi(1,:),JumGen,XYkota);
MinF = MaxF;
IndeksIndividuTerbaik = 1;
for ii=1:UkPop,
Fitness(ii) = TSPEvaluasiIndividu(Populasi(ii,:),JumGen,XYkota);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
JalurTerbaik = Populasi(ii,:);
end
if (Fitness(ii) <= MinF),
MinF = Fitness(ii);
end
end
FitnessRataRata = mean(Fitness);
plotvector1 = get(hbestplot1,'YData');
plotvector1(generasi) = MaxF;
set(hbestplot1,'YData',plotvector1);
plotvector2 = get(hbestplot2,'YData');
plotvector2(generasi) = FitnessRataRata;
set(hbestplot2,'YData',plotvector2);
set(htext1,'String',sprintf('Fitness terbaik: %7.6f', MaxF));
set(htext2,'String',sprintf('Fitness rata-rata: %7.6f', FitnessRataRata));
set(htext3,'String',sprintf('Panjang jalur terbaik: %7.3f',
1/MaxF));
set(htext4,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext5,'String',sprintf('Probabilitas Mutasi: %4.3f', Pmutasi));
drawnow
if MaxF > Fthreshold,
break;
end
TempPopulasi = Populasi;
% Elitisme:
% - Buat satu kopi kromosom terbaik jika ukuran populasi ganjil
% - Buat dua kopi kromosom terbaik jika ukuran populasi genap
if
mod(UkPop,2)==0,
% ukuran populasi genap
IterasiMulai = 3;
TempPopulasi(1,:) = Populasi(IndeksIndividuTerbaik,:);
TempPopulasi(2,:) = Populasi(IndeksIndividuTerbaik,:);
else % ukuran populasi ganjil
IterasiMulai = 2;
TempPopulasi(1,:) = Populasi(IndeksIndividuTerbaik,:);
end
LinearFitness = LinearFitnessRanking(UkPop,Fitness,MaxF,MinF);
% Roulette-wheel selection dan pindah silang
for jj=IterasiMulai:2:UkPop,
IP1 = RouletteWheel(UkPop,LinearFitness);
IP2 = RouletteWheel(UkPop,LinearFitness);
if (rand < Psilang),
Anak = TSPPindahSilang(Populasi(IP1,:),Populasi(IP2,:),JumGen);
TempPopulasi(jj,:) = Anak(1,:);
TempPopulasi(jj+1,:) = Anak(2,:);
else
TempPopulasi(jj,:) = Populasi(IP1,:);
TempPopulasi(jj+1,:) = Populasi(IP2,:);
end
end
% Mutasi dilakukan pada semua kromosom
for kk=IterasiMulai:UkPop,
TempPopulasi(kk,:) = TSPMutasi(TempPopulasi(kk,:),JumGen,Pmutasi);
end
Populasi = TempPopulasi;
end
% Tanpa tanda ';' berarti menampilkan nilai dari variabel 'JalurTerbaik'
JalurTerbaik
% Simpan variabel 'JalurTerbaik' ke dalam file JalurTerbaik.mat
save JalurTerbaik.mat JalurTerbaik
> Pada tabel diatas, permasalahan XOR dapat digeneralisasikan
untuk n masukan, dan fungsi boolean yang dihasilkan disebut dengan n-parity function, yang
dapat direpresentasikan dengan FFNN.
> Variabel X1, X2, dan X3 merupakan
suatu pola berdimensi tiga.
> Keluaran dari FFNN adalah Y, yang bernilai 1
atau 0.
> Penyelesaian ini harus digunakan algoritma
latih backpropagarion learning.
Cara GA
melatih FFNN:
> Represesentasikan solusi ke dalam
kromosom. Untuk n-parity function, jumlah parameter yang diperlukan dalam FFNN
adalah:
> Tentukan nilai fitness yang bisa digunakan, salah satunya invers
dari mean-square devation, (delta)> Untuk
kasus 3-parity (n = 3), maka jumlah parameter FFNN adalah 16.
>
Representasi kromosom yang dapat digunakan seperti gambar berikut, namun digunakan
empat buah neuron (3hidden, 1 output)
> Masing-masing neruon
memiliki 3 bobot sinaptik dan satu bias, sehingga jumlah parameter yang digunakan adalah
16.Terdapat 9 fungsi dan 2 program utama pada bagian
ini:
Int2Bin.m
Bertujuan untuk mengubah
integer menjadi biner.
function BilBiner = Int2Bin(BilInteger,JumBit);
for ii=1:JumBit,
if mod(BilInteger,2) == 0,
BilBiner(JumBit+1-ii) = 0;
else
BilBiner(JumBit+1-ii) = 1;
end
BilInteger = fix(BilInteger/2);
end
Bertujuan untuk
membangkitkan matriks input dan Target untuk pelatihan FFNN.
function [IM,TM] =
BangMatrixIT(JumMasukan,JPmasukan);
for ii=1:JPmasukan,
IM(ii,:) = Int2Bin(ii-1,JumMasukan);
if mod(sum(IM(ii,:)),2) == 1, % angka 1 pada pola input berjumlah ganjil
TM(ii) = 1;
else % angka 1 pada
pola input berjumlah genap
TM(ii) = 0;
end
end
Bertujuan untutk
mengevaluasi sebuah individu sehingga didapatkan nilai fitnessnya.
function fitness =
BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
c = 1.0;
n2 = JumMasukan^2;
Wtemp = FFNNstruk(1:n2);
for ii=1:JumMasukan,
Wih(ii,:) = Wtemp((ii-1)*JumMasukan+1:ii*JumMasukan);
end
bih = FFNNstruk(n2+1:n2+JumMasukan);
Who = FFNNstruk(n2+JumMasukan+1:n2+2*JumMasukan);
bho = FFNNstruk((JumMasukan+1)^2);
RMSE = 0;
for evaluasi=1:JPmasukan,
for ii=1:JumMasukan,
SumWIb = 0;
for jj=1:JumMasukan,
SumWIb = SumWIb + (Wih(ii,jj) * IM(evaluasi,jj)
+ bih(jj));
end
Xih(ii) = 1 / (1+exp(-c*Sum
WIb));
end
SumWXb = 0;
for jj=1:JumMasukan,
SumWXb = SumWXb + (Who(jj) * Xih(jj)
+ bho);
end
Xho = 1 / (1+exp(-c*Sum
WXb));
RMSE = RMSE + (TM(evaluasi)-Xho)^2;
end
Delta = sqrt(1/JPmasukan * RMSE);
fitness = 1/Delta;
Merupakan program
utama untuk melatih FFNN, terdapat 3 variabel penting, yaitu UkPop, Psilang, dan
Pmutasi.
clc
clear all
JumMasukan = 3; % Jumlah
masukan
JPmasukan = 2^JumMasukan; %
Jumlah pola masukan
Nbit = 20; % Jumlah bit
yang mengkodekan satu variabel
JumGen = Nbit*(JumMasukan+1)^2; % Jumlah gen
Nvar = JumGen/Nbit; % Jumlah variabel
Rb = -10;
% Batas bawah interval
Ra = 10; % Batas atas
interval
MinDelta = 0.01; % Delta
minimum yang diharapkan
Fthreshold = 1/MinDelta;
% Threshold untuk nilai Fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
UkPop = 100; % Jumlah
kromosom dalam populasi
Psilang = 0.8; % Probabilitas
pindah silang
Pmutasi = 0.03; % Probabilitas
mutasi
MaxG = 2000; % Jumlah
generasi
% Inisialisasi grafis
hfig = figure;
hold on
title('Algoritma Genetika dengan Binary Encoding
untuk pelatihan FFNN')
set(hfig, 'position', [50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG));
hbestplot2 = plot(1:MaxG,zeros(1,MaxG));
htext1 = text(0.6*MaxG,0.25*Bgraf,sprintf('Fitness terbaik: %7.6f', 0.0));
htext2 = text(0.6*MaxG,0.20*Bgraf,sprintf('Fitness rata-rata: %7.6f', 0.0));
htext3 = text(0.6*MaxG,0.15*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext4 = text(0.6*MaxG,0.10*Bgraf,sprintf('Prob. Pindah Silang: %4.3f', 0.0));
htext5 = text(0.6*MaxG,0.05*Bgraf,sprintf('Prob. Mutasi: %4.3f', 0.0));
xlabel('Generasi');
ylabel('Fitness');
hold off
drawnow;
% Bangkitkan matrix Input and Target untuk pelatihan FFNN
[IM,TM] = BangMatrixIT(JumMasukan,JPmasukan);
% Inisialisasi Populasi
Populasi = InisialisasiPopulasi(UkPop,JumGen);
for generasi=1:MaxG,
FFNNstruk = DekodekanKromosom(Populasi(1,:),Nvar,Nbit,Ra,Rb);
Fitness(1) =
BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
MaxF = Fitness(1);
MinF = Fitness(1);
IndeksIndividuTerbaik = 1;
for ii=2:UkPop,
FFNNstruk = DekodekanKromosom(Populasi(ii,:),Nvar,Nbit,Ra,Rb);
Fitness(ii) = BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
FFNNterbaik = FFNNstruk;
end
if (Fitness(ii) <= MinF),
MinF = Fitness(ii);
end
end
FitnessRataRata = mean(Fitness);
% Penanganan grafis
plotvector1 = get(hbestplot1,'YData');
plotvector1(generasi) = MaxF;
set(hbestplot1,'YData',plotvector1);
plotvector2 = get(hbestplot2,'YData');
plotvector2(generasi) = FitnessRataRata;
set(hbestplot2,'YData',plotvector2);
set(htext1,'String',sprintf('Fitness terbaik: %7.6f', MaxF));
set(htext2,'String',sprintf('Fitness rata-rata: %7.6f', FitnessRataRata));
set(htext3,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext4,'String',sprintf('Prob. Pindah Silang: %4.3f', Psilang));
set(htext5,'String',sprintf('Probabilitas Mutasi: %4.3f', Pmutasi));
drawnow
if MaxF > Fthreshold,
break;
end
TemPopulasi = Populasi;
% Elitisme:
% - Buat satu kopi kromosom terbaik jika ukuran populasi ganjil
% - Buat dua kopi kromosom terbaik jika ukuran populasi genap
if mod(UkPop,2)==0, % ukuran populasi genap
IterasiMulai = 3;
TemPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
TemPopulasi(2,:) =
Populasi(IndeksIndividuTerbaik,:);
else % ukuran populasi
ganjil
IterasiMulai = 2;
TemPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
end
LinearFitness = LinearFitnessRanking(UkPop,Fitness,MaxF,MinF);
for jj=IterasiMulai:2:UkPop,
IP1 = RouletteWheel(UkPop,LinearFitness);
IP2 = RouletteWheel(UkPop,LinearFitness);
if (rand <
Psilang),
Anak = PindahSilang(Populasi(IP1,:),Populasi(IP2,:),JumGen);
TemPopulasi(jj,:) = Anak(1,:);
TemPopulasi(jj+1,:) =
Anak(2,:);
else
TemPopulasi(jj,:) = Populasi(IP1,:);
TemPopulasi(jj+1,:) =
Populasi(IP2,:);
end
end
for kk=IterasiMulai:UkPop,
TemPopulasi(kk,:) = Mutasi(TemPopulasi(kk,:),JumGen,Pmutasi);
end
Populasi = TemPopulasi;
end
FFNNterbaik
save FFNNterbaik.mat FFNNterbaik
Program ini untuk menguji
FFNN hasil pelatihan dengan menggunakan UI sederhana.
clc
clear all
c = 1;
n = 3;
n2 = n^2;
% Load struktur FFNN terbaik hasil pelatihan
load FFNNterbaik.mat
MT = 1;
while MT == 1,
disp('Pengujian FFNN');
disp(' ');
disp('Masukkan tiga input biner
untuk FFNN');
x1 = input('X1: ');
x2 = input('X2: ');
x3 = input('X3: ');
IM = [x1 x2 x3];
NNS = FFNNterbaik;
Wtemp = NNS(1:n2);
for ii=1:n,
Wih(ii,:) = Wtemp((ii-1)*n+1:ii*n);
end
bih = NNS(n2+1:n2+n);
Who = NNS(n2+n+1:n2+2*n);
bho = NNS((n+1)^2);
for ii=1:n,
SumWIb = 0;
for jj=1:n,
SumWIb = SumWIb + Wih(ii,jj) * IM(jj)
+ bih(jj);
end
Xih(ii) = 1 / (1+exp(-c*Sum
WIb));
end
SumWXb = 0;
for jj=1:n,
SumWXb = SumWXb + Who(jj) * Xih(jj) +
bho;
end
Xho = 1 / (1+exp(-c*Sum
WXb));
if Xho <= 0.02,
HasilTes = '0';
else
if Xho >= 0.98,
HasilTes = '1';
else
HasilTes = 'Unidentified';
end
end
disp(' ');
disp(['Output bilangan real:
', num2str(Xho)]);
disp(['Output FFNN adalah:
', HasilTes]);
disp(' ');
MT = input('Tekan 1 untuk tes lagi, dan tekan 0
untuk keluar: ');
end
Pengujian FFNN
Masukkan tiga input biner untuk FFNN
X1: 0
X2: 0
X3: 0
Output bilangan real: 0.012024
Output FFNN adalah: 0
Tekan 1 untuk tes lagi, dan tekan 0 untuk keluar: 1
Pengujian FFNN
Masukkan tiga input biner untuk FFNN
X1: 0
X2: 0
X3: 1
Output bilangan real: 0.9915
Output FFNN adalah: 1
Tekan 1 untuk tes lagi, dan tekan 0 untuk keluar: 1
Pengujian FFNN
Masukkan tiga input biner untuk FFNN
X1: 1
X2: 1
X3: 1
Output bilangan real: 0.99232
Output FFNN adalah: 1
Tekan 1 untuk tes lagi, dan tekan 0 untuk keluar: 0
>
Representasi kromosom yang dapat digunakan seperti pada gambar berikut:
Pada metode ini digunakan 9 fungsi dan 2 program
utama:
MessyInisialisasiPopulasi.m
Bertujuan untuk
membangkitkan kromosom sejumlah UkPop.
function Populasi = MessyInisialisasiPopulasi(UkPop,JGMsatu,Pmessy)
for IndPop=1:UkPop,
BanyakMessy = [];
for ii=1:Pmessy,
[Xval,Sind] = sort(rand(1,JGMsatu));
SatuMessy(1:2:JGMsatu*2) =
Sind;
SatuMessy(2:2:JGMsatu*2) =
fix(2*rand(1,JGMsatu));
BanyakMessy = [BanyakMessy SatuMessy];
end
Populasi(IndPop,:) = BanyakMessy;
end
MessyDekode.m
Bertujuan untuk
mendekodekan kromosom yang berisi bilangan biner menjadi individu x yang bernilai real
dalam interval yang ditentukan [Ra,Rb]
function [x,JGenHilang] = MessyDekode(Kromosom,JGMsatu,Nvar,Nbit,Ra,Rb)
PanjKrom = length(Kromosom);
Identitas = Kromosom(1:2:PanjKrom);
JGenHilang = 0;
for ii=1:JGMsatu,
if ismember(ii,Identitas),
Ind = find(Identitas == ii); % Ind bisa berisi
lebih dari satu
KromTemp(ii) = Kromosom(Ind(1)*2);
else
KromTemp(ii) = 0;
JGenHilang = JGenHilang + 1;
end
end
Kromosom = KromTemp;
for ii=1:Nvar,
x(ii) = 0;
for jj=1:Nbit,
x(ii) = x(ii) + Kromosom((ii-1)*Nbit+jj)*2^(-jj);
end
x(ii) = Rb + (Ra-Rb)*x(ii);
end
Bertujuan untuk
mengevaluasi suatu individu sehingga didapatkan nilai fitnessnya.
function fitness =
MessyEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM,JGHilang)
c = 1.0;
n2 = JumMasukan^2;
Wtemp = FFNNstruk(1:n2);
for ii=1:JumMasukan,
Wih(ii,:) = Wtemp((ii-1)*JumMasukan+1:ii*JumMasukan);
end
bih = FFNNstruk(n2+1:n2+JumMasukan);
Who = FFNNstruk(n2+JumMasukan+1:n2+2*JumMasukan);
bho = FFNNstruk((JumMasukan+1)^2);
RMSE = 0;
for evaluasi=1:JPmasukan,
for ii=1:JumMasukan,
JumWIb = 0;
for jj=1:JumMasukan,
JumWIb = JumWIb + (Wih(ii,jj) * IM(evaluasi,jj)
+ bih(jj));
end
Xih(ii) = 1 / (1+exp(-c*Jum
WIb));
end
SumWXb = 0;
for jj=1:JumMasukan,
SumWXb = SumWXb + (Who(jj) * Xih(jj)
+ bho);
end
Xho = 1 / (1+exp(-c*Sum
WXb));
RMSE = RMSE + (TM(evaluasi)-Xho)^2;
end
Delta = sqrt(1/JPmasukan * RMSE);
fitness = (1/Delta) *
exp(-JGHilang);
Bertujuan untuk
memindah silangkan bagian kromosom bapak dan ibu yang dipotong pada satu titik secara
random.
function
Anak = MessyPindahSilang(Bapak,Ibu,JGMsatu,PanjKrom)
TP = 1 +
fix(rand*(JGMsatu-1));
Anak(1,:) = [Bapak(1:TP*2)
Ibu(TP*2+1:PanjKrom)];
Anak(2,:) = [Ibu(1:TP*2)
Bapak(TP*2+1:PanjKrom)];
Terdapat perbedaan dari
proses yang terjadi pada binary encoding, yaitu gen yang berada di posisi ganjil diubah
dengan nilai random pada interval [1,JGMsatu]. Gen genap berisi bilangan biner yang
dibalikkan nilainya.
function MutKrom = MessyMutasi(Kromosom,JGMsatu,Pmutasi);
MutKrom = Kromosom;
for ii=1:JGMsatu,
if rand <
Pmutasi,
MutKrom((ii-1)*2+1) = 1 +
fix(rand*JGMsatu);
if Kromosom(ii*2) == 0,
MutKrom(ii*2) = 1;
else
MutKrom(ii*2) = 0;
end
end
end
FFNNMessyLatih.m
Program utama untuk melatih FFNN,
dan ada tambahan parameter lain dari program sebelumnya yaitu Pmessy.
clc
clear all
Pmessy = 5; % Panjang
messy
JumMasukan = 3; % Jumlah
masukan
JPmasukan = 2^JumMasukan; %
Jumlah pola masukan
Nbit = 20; % Jumlah bit
yang mengkodekan satu variabel
JGMsatu = Nbit*(JumMasukan+1)^2; % Jumlah gen dalam
satu messy
JGMbanyak = 2*JGMsatu*Pmessy; % Jumlah
gen dalam banyak messy
Nvar = JGMsatu/Nbit; % Jumlah variabel
Rb = -10;
% Batas bawah interval
Ra = 10; % Batas atas
interval
MinDelta = 0.01; % Delta
minimum yang diharapkan
Fthreshold = 1/MinDelta;
% Threshold untuk nilai Fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
UkPop = 100; % Jumlah
kromosom dalam populasi
Psilang = 0.8; % Probabilitas
pindah silang
Pmutasi = 0.03; % Probabilitas
mutasi
MaxG = 2000; % Jumlah
generasi
% Inisialisasi grafis
hfig = figure;
hold on
title('Algoritma Genetika dengan Messy Encoding
untuk pelatihan FFNN')
set(hfig, 'position', [50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG));
hbestplot2 = plot(1:MaxG,zeros(1,MaxG));
htext1 = text(0.6*MaxG,0.25*Bgraf,sprintf('Fitness terbaik: %7.6f', 0.0));
htext2 = text(0.6*MaxG,0.20*Bgraf,sprintf('Fitness rata-rata: %7.6f', 0.0));
htext3 = text(0.6*MaxG,0.15*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext4 = text(0.6*MaxG,0.10*Bgraf,sprintf('Prob. Pindah Silang: %4.3f', 0.0));
htext5 = text(0.6*MaxG,0.05*Bgraf,sprintf('Prob. Mutasi: %4.3f', 0.0));
xlabel('Generasi');
ylabel('Fitness');
hold off
drawnow;
% Bangkitkan matrix Input and Target untuk pelatihan FFNN
[IM,TM] = BangMatrixIT(JumMasukan,JPmasukan);
% Generate Populasi
Populasi = MessyInisialisasiPopulasi(UkPop,JGMsatu,Pmessy);
for generasi=1:MaxG,
[FFNNstruk,JGhilang] = MessyDekode(Populasi(1,:),JGMsatu,Nvar,Nbit,Ra,Rb);
Fitness(1) =
MessyEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM,JGhilang);
MaxF = Fitness(1);
MinF = Fitness(1);
IndeksIndividuTerbaik = 1;
for ii=2:UkPop,
[FFNNstruk,JGhilang] = MessyDekode(Populasi(ii,:),JGMsatu,Nvar,Nbit,Ra,Rb);
Fitness(ii) = MessyEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM,JGhilang);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
FFNNterbaik = FFNNstruk;
end
if (Fitness(ii) <= MinF),
MinF = Fitness(ii);
end
end
FitnessRataRata = mean(Fitness);
plotvector1 = get(hbestplot1,'YData');
plotvector1(generasi) = MaxF;
set(hbestplot1,'YData',plotvector1);
plotvector2 = get(hbestplot2,'YData');
plotvector2(generasi) = FitnessRataRata;
set(hbestplot2,'YData',plotvector2);
set(htext1,'String',sprintf('Fitness terbaik: %7.6f', MaxF));
set(htext2,'String',sprintf('Fitness rata-rata: %7.6f', FitnessRataRata));
set(htext3,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext4,'String',sprintf('Prob. Pindah Silang: %4.3f', Psilang));
set(htext5,'String',sprintf('Probabilitas Mutasi: %4.3f', Pmutasi));
drawnow
if MaxF > Fthreshold,
break;
end
TemPopulasi = Populasi;
% Elitisme:
% - Buat satu kopi kromosom terbaik jika ukuran populasi ganjil
% - Buat dua kopi kromosom terbaik jika ukuran populasi genap
if mod(UkPop,2)==0, % ukuran populasi genap
IterasiMulai = 3;
TemPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
TemPopulasi(2,:) =
Populasi(IndeksIndividuTerbaik,:);
else % ukuran populasi
ganjil
IterasiMulai = 2;
TemPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
end
LinearFitness = LinearFitnessRanking(UkPop,Fitness,MaxF,MinF);
for jj=IterasiMulai:2:UkPop,
IP1 = RouletteWheel(UkPop,LinearFitness);
IP2 = RouletteWheel(UkPop,LinearFitness);
if (rand <
Psilang),
Anak = MessyPindahSilang(Populasi(IP1,:),Populasi(IP2,:),JGMsatu,JGMbanyak);
TemPopulasi(jj,:) = Anak(1,:);
TemPopulasi(jj+1,:) =
Anak(2,:);
else
TemPopulasi(jj,:) = Populasi(IP1,:);
TemPopulasi(jj+1,:) =
Populasi(IP2,:);
end
end
for kk=IterasiMulai:UkPop,
TemPopulasi(kk,:) = MessyMutasi(TemPopulasi(kk,:),JGMsatu,Pmutasi);
end
Populasi = TemPopulasi;
end
FFNNterbaik
save FFNNterbaik.mat FFNNterbaik
> Pada GA basis ini, representasi kromosom yang digunakan sama persis dengan binary encoding, namun ada perbedaan kecil pada evolusi yang terdistribusi ke dalam minimal 2 populasi.
> Terdapat proses pertukaran kromosom antarpopulasi
(tunnelling).
Untuk metode ini, terdapat dua fungsi baru
yang dikhusukan untuk sub populasi:
EvolusiSatuSubPopulasi.m
Bertujuan untuk melakukan
evolusi pada satu subpopulasi.
function PopulasiBaru = EvolusiSatuSubPopulasi(Populasi,IM,TM,Nbit,Psilang,Pmutasi)
FFNSubPopLatih.m
Terdapat
2 parameter pernting pada fungsi ini: JumSubPop, dan ProbTunel.
clc
clear all
JumMasukan = 3; % Jumlah
masukan
JPmasukan = 2^JumMasukan; %
Jumlah pola masukan
Nbit = 20; % Jumlah bit
yang mengkodekan satu variabel
JumGen = Nbit*(JumMasukan+1)^2; % Jumlah gen
Nvar = JumGen/Nbit; % Jumlah variabel
Rb = -10;
% Batas bawah interval
Ra = 10; % Batas atas
interval
MinDelta = 0.01; % Delta
minimum yang diharapkan
Fthreshold = 1/MinDelta;
% Threshold untuk nilai Fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
UkPop = 100; % Jumlah
kromosom dalam populasi
Psilang = 0.8; % Probabilitas
pindah silang
Pmutasi = 0.03; % Probabilitas
mutasi
MaxG = 2000; % Jumlah
generasi
JumSubPop = 4; % jumlah
sub populasi
JumIndSubPop = fix(UkPop/JumSubPop); % jumlah
individu dalam satu sub populasi
ProbTunel = 0.001; %
probabilitas tunelling
% Inisialisasi grafis
hfig = figure;
hold on
title('Algoritma Genetika dengan Sub Populasi
untuk pelatihan FFNN')
set(hfig, 'position', [50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG));
hbestplot2 = plot(1:MaxG,zeros(1,MaxG));
htext1 = text(0.6*MaxG,0.25*Bgraf,sprintf('Fitness terbaik: %7.6f', 0.0));
htext2 = text(0.6*MaxG,0.20*Bgraf,sprintf('Fitness rata-rata: %7.6f', 0.0));
htext3 = text(0.6*MaxG,0.15*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext4 = text(0.6*MaxG,0.10*Bgraf,sprintf('Prob. Pindah Silang: %4.3f', 0.0));
htext5 = text(0.6*MaxG,0.05*Bgraf,sprintf('Prob. Mutasi: %4.3f', 0.0));
xlabel('Generasi');
ylabel('Fitness');
hold off
drawnow;
% Bangkitkan matrix Input and Target untuk pelatihan FFNN
[IM,TM] = BangMatrixIT(JumMasukan,JPmasukan);
% Inisialisasi Populasi
Populasi = InisialisasiPopulasi(UkPop,JumGen);
for generasi=1:MaxG,
%-------------------------
% Evaluasi populasi global
%-------------------------
FFNNstruk = DekodekanKromosom(Populasi(1,:),Nvar,Nbit,Ra,Rb);
Fitness(1) =
BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
MaxF = Fitness(1);
IndeksIndividuTerbaik = 1;
for ii=2:UkPop,
FFNNstruk = DekodekanKromosom(Populasi(ii,:),Nvar,Nbit,Ra,Rb);
Fitness(ii) = BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
FFNNterbaik = FFNNstruk;
end
end
FitnessRataRata = mean(Fitness);
plotvector1 = get(hbestplot1,'YData');
plotvector1(generasi) = MaxF;
set(hbestplot1,'YData',plotvector1);
plotvector2 = get(hbestplot2,'YData');
plotvector2(generasi) = FitnessRataRata;
set(hbestplot2,'YData',plotvector2);
set(htext1,'String',sprintf('Fitness terbaik: %7.6f', MaxF));
set(htext2,'String',sprintf('Fitness rata-rata: %7.6f', FitnessRataRata));
set(htext3,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext4,'String',sprintf('Prob. Pindah Silang: %4.3f', Psilang));
set(htext5,'String',sprintf('Probabilitas Mutasi: %4.3f', Pmutasi));
drawnow
if MaxF > Fthreshold,
break;
end
%---------------------------------------------------------
% Evaluasi sub populasi ke-1 sampai JumSubPop-1
%---------------------------------------------------------
for ISP=1:JumSubPop-1,
SubPop = Populasi((ISP-1)*JumIndSubPop+1:ISP*JumIndSubPop,:);
SubPopBaru = EvolusiSatuSubPopulasi(SubPop,IM,TM,Nbit,Psilang,Pmutasi);
Populasi((ISP-1)*JumIndSubPop+1:ISP*JumIndSubPop,:) = SubPopBaru;
end
%---------------------------------------------------------
% Evaluasi sub populasi terakhir karena jumlah kromosomnya
% bisa berbeda dengan sub populasi yang lain
%---------------------------------------------------------
SubPop = Populasi((JumSubPop-1)*JumIndSubPop+1:UkPop,:);
SubPopBaru = EvolusiSatuSubPopulasi(SubPop,IM,TM,Nbit,Psilang,Pmutasi);
Populasi((JumSubPop-1)*JumIndSubPop+1:UkPop,:) = SubPopBaru;
% Tunneling antar sub populasi
for ISP=1:JumSubPop-1,
for Itt=ISP+1:JumSubPop,
if rand <
ProbTunel
% Pilih satu kromosom pada satu sub populasi
ind1 = fix(1+rand*JumIndSubPop);
if Itt==JumSubPop,
% Pilih satu kromosom pada sub poppulasi yang lain
ind2 = fix(1+rand*(UkPop-
> Perbedaan metode ini dengan binary
encoding adalah indek kromosom yang disusun ke dalam bidang yang teratur. Pindah silang
terbatas pada kromosom tetangga saja.
untuk fungsi tambahan
yang dikhususkan pada metode ini:
GBTournamentSelection.m
Bertujuan untuk memilih satu
kromosom dari sebanyak UkPop kromosom pada populasi.
function IndTerpilih =
GBTourSelection(UkPop,Fitness,UkTour,ProbTour)
for ii=1:UkTour,
Itemp(ii) = 1 +
fix(rand*UkPop); % Indeks dari
individu terpilih
Ftemp(ii) = Fitness(Itemp(ii)); % Nilai fitness dari individu terpilih
end
[M,IndTerbaik] = max(Ftemp); % indeks individu terbaik dalam tournament
IndLainnya = []; % indeks individu selain yang terbaik dalam tournament
if IndTerbaik==1,
IndLainnya = [IndLainnya 2:UkTour];
else
IndLainnya = [IndLainnya 1:IndTerbaik-1];
IndLainnya = [IndLainnya IndTerbaik+1:UkTour];
end
if rand <
ProbTour,
IndTerpilih = Itemp(IndTerbaik);
else
IndTerpilih = Itemp(IndLainnya(1+fix(rand*(Uk
Tour-1))));
end
GBReplacement.m
Bertujuan
untuk mengganti kromosom orang tua dengan kromosom anak jika kromosom anak bernilai
fitness lebih tinggi daripada orang tua.
3 kemungkinan
penggantian:
a. Penggantian hanya pada salah satu kromosom orang
tua.
b. Penggantuan pada kedua kromosom orang tua
c. Tidak ada
penggantian kromosom orang tua.
function PopBaru = GBReplacement(TemPop,Fitness,IP1,IP2,Anak1,Anak2,FA1,FA2)
Output dari
program akan dibangun toroidal space.
clc
clear all
Jbar = 10; % Jumlah
baris
Jkol = 10; % Jumlah
kolom
UkPop = Jbar * Jkol; % Ukuran populasi (ukuran
grid)
JLtetangga = 1; % Jumlah
lapisan ketetanggaan
JumMasukan = 3; % Jumlah
masukan
JPmasukan = 2^JumMasukan; %
Jumlah pola masukan
Nbit = 20; % Jumlah bit
yang mengkodekan satu variabel
JumGen = Nbit*(JumMasukan+1)^2; % Jumlah gen
Nvar = JumGen/Nbit; % Jumlah variabel
Rb = -10;
% Batas bawah interval
Ra = 10; % Batas atas
interval
MinDelta = 0.01; % Delta
minimum yang diharapkan
Fthreshold = 1/MinDelta;
% Threshold untuk nilai Fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
Psilang = 0.8; % Probabilitas
pindah silang
Pmutasi = 0.03; % Probabilitas
mutasi
UkTour = 4; % Ukuran
tournament
ProbTour = 0.8; % Probabilitas
tournament
MaxG = 2000; % Jumlah
generasi
% Inisialisasi grafis
hfig = figure;
hold on
title('Algoritma Genetika berbasis Grid untuk
pelatihan FFNN')
set(hfig, 'position', [50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG));
hbestplot2 = plot(1:MaxG,zeros(1,MaxG));
htext1 = text(0.6*MaxG,0.35*Bgraf,sprintf('Fitness terbaik: %7.6f', 0.0));
htext2 = text(0.6*MaxG,0.30*Bgraf,sprintf('Fitness rata-rata: %7.6f', 0.0));
htext3 = text(0.6*MaxG,0.25*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext4 = text(0.6*MaxG,0.20*Bgraf,sprintf('Prob. Pindah Silang: %4.3f', 0.0));
htext5 = text(0.6*MaxG,0.15*Bgraf,sprintf('Prob. Mutasi: %4.3f', 0.0));
htext6 = text(0.6*MaxG,0.10*Bgraf,sprintf('Ukuran Tournament: %2.0f', 0.0));
htext7 = text(0.6*MaxG,0.05*Bgraf,sprintf('Prob. Tournament: %4.3f', 0.0));
xlabel('Generasi');
ylabel('Fitness');
hold off
drawnow;
% Bangkitkan matrix Input and Target untuk pelatihan FFNN
[IM,TM] = BangMatrixIT(JumMasukan,JPmasukan);
% Inisialisasi Populasi
Populasi = InisialisasiPopulasi(UkPop,JumGen);
% Membangun Toroidal Space yang berisi indeks kromosom pada populasi
TSPI = [Jbar*Jkol (Jbar-1)*Jkol+1:Jbar*Jkol (Jbar-1)*Jkol+1]; % baris pertama
for ii=1:Jbar,
% baris tengah
TSPI = [TSPI ; Jkol*ii (ii-1)*Jkol+1:Jkol*ii (ii-1)*Jkol+1];
end
TSPI = [TSPI ; Jkol 1:Jkol 1]; % baris teakhir
for generasi=1:MaxG,
FFNNstruk = DekodekanKromosom(Populasi(1,:),Nvar,Nbit,Ra,Rb);
Fitness(1) =
BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
MaxF = Fitness(1);
IndeksIndividuTerbaik = 1;
for ii=2:UkPop,
FFNNstruk = DekodekanKromosom(Populasi(ii,:),Nvar,Nbit,Ra,Rb);
Fitness(ii) = BinaryEvalInd(FFNNstruk,JumMasukan,JPmasukan,IM,TM);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
FFNNterbaik = FFNNstruk;
end
end
FitnessRataRata = mean(Fitness);
plotvector1 = get(hbestplot1,'YData');
plotvector1(generasi) = MaxF;
set(hbestplot1,'YData',plotvector1);
plotvector2 = get(hbestplot2,'YData');
plotvector2(generasi) = FitnessRataRata;
set(hbestplot2,'YData',plotvector2);
set(htext1,'String',sprintf('Fitness terbaik: %7.6f', MaxF));
set(htext2,'String',sprintf('Fitness rata-rata: %7.6f', FitnessRataRata));
set(htext3,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext4,'String',sprintf('Prob. Pindah Silang: %4.3f', Psilang));
set(htext5,'String',sprintf('Prob. Mutasi: %4.3f', Pmutasi));
set(htext6,'String',sprintf('Ukuran Tournament: %2.0f', UkTour));
set(htext7,'String',sprintf('Prob. Tournament: %4.3f', ProbTour));
drawnow
if MaxF > Fthreshold,
break;
end
TemPop = Populasi;
if mod(UkPop,2)==0, % ukuran populasi genap
IterasiMulai = 3;
else % ukuran populasi
ganjil
IterasiMulai = 2;
end
for jj=IterasiMulai:UkPop,
IP1 = GBTourSelection(UkPop,Fitness,UkTour,ProbTour);
if (rand <
Psilang),
[Anak,IP2] = GBPindahSilang(TemPop,JumGen,IP1,TSPI,JLtetangga,Jbar,Jkol);
MAnak1 = Mutasi(Anak(1,:),JumGen,Pmutasi);
MAnak2 = Mutasi(Anak(2,:),JumGen,Pmutasi);
x1 = DekodekanKromosom(MAnak1,Nvar,Nbit,Ra,Rb);
x2 = DekodekanKromosom(MAnak2,Nvar,Nbit,Ra,Rb);
FMA1 = BinaryEvalInd(x1,JumMasukan,JPmasukan,IM,TM);
FMA2 = BinaryEvalInd(x2,JumMasukan,JPmasukan,IM,TM);
PopBaru = GBReplacement(TemPop,Fitness,IP1,IP2,MAnak1,MAnak2,FMA1,FMA2);
TemPop = PopBaru;
else
MutKrom = Mutasi(TemPop(IP1,:),JumGen,Pmutasi);
x1 = DekodekanKromosom(MutKrom,Nvar,Nbit,Ra,Rb);
FitnessMutKrom = BinaryEvalInd(x1,JumMasukan,JPmasukan,IM,TM);
if FitnessMutKrom >
Fitness(IP1),
TemPop(IP1,:) = MutKrom;
end
end
end
% Elitisme dilakukan setelah operator-operator Grid-based dilakukan
% untuk mempertahankan individu terbaik
% - Buat satu kopi kromosom terbaik jika ukuran populasi ganjil
% - Buat dua kopi kromosom terbaik jika ukuran populasi genap
if mod(UkPop,2)==0,
TemPop(1,:) =
Populasi(IndeksIndividuTerbaik,:);
TemPop(2,:) =
Populasi(IndeksIndividuTerbaik,:);
else
TemPop(1,:) =
Populasi(IndeksIndividuTerbaik,:);
end
Populasi = TemPop; % generational replacement
end
FFNNterbaik
save FFNNterbaik.mat FFNNterbaik
> Pada dasarnya grammatical encoding
digunakan untuk membangun struktur JST pada bidang evolutionary robotics, dimana
struktur JST akan selalu dinamis sesuai dengan kondisi lingkungan robot.
>
GA dengan grammatical encoding digunakan untuk membangun sebuah struktur JST,
seperti pada gambar berikut:
Bertujuan untuk
membangkitkan 16 variabel yang masing-masing berupa matriks 2x2 nilai
biner.
function [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p] =
BangkitkanMatriks16simbol
a = [0 0 ;
0 0];
b = [0 0 ;
0 1];
c = [0 0 ;
1 0];
d = [0 0 ;
1 1];
e = [0 1 ;
0 0];
f = [0 1 ;
0 1];
g = [0 1 ;
1 0];
h = [0 1 ;
1 1];
i = [1 0 ; 0 0];
j = [1 0 ; 0 1];
k = [1 0 ;
1 0];
l = [1 0 ;
1 1];
m = [1 1 ;
0 0];
n = [1 1 ;
0 1];
o = [1 1 ;
1 0];
p = [1 1 ;
1 1];
BangkitkanNNtarget.m
Fungsi
ini bertujuan untuk membangkitkan matriks 8x8 yang merepresentasikan struktur JST yang
menjadi target.
function NNtarget =
BangkitkanNNtarget
NNtarget = [1 0 0 1 1 0 0 0; ...
0 1 1 1 0 0 0 0; ...
0 0 1 0 0 0 1 0; ...
0 0 0 1 0 1 0 0; ...
0 0 0 0 1 0 0 0; ...
0 0 1 0 0 1 0 1; ...
0 0 0 0 1 0 1 1; ...
0 0 0 0 0 0 0 1];
GEInisialisasiPopulasi.m
Bertujuan untuk membangkitkan
satu populasi yang berisi kromosom sejumlah UkPop.
function Populasi = GEInisialisasiPopulasi(UkPop,HHbesar,HHkecil,JHB,JHK,PBK,PKK,JumGen
)
for pp=1:UkPop,
Kromosom = 'S';
% simbol start
[x,ind] = sort(rand(1,JHB));
Kromosom = [Kromosom HHbesar(ind(1:PBK))];
% 4 simbol huruf besar
Pgrup = PBK + 1; %
Panjang grup = 5 (1 huruf besar + 4 huruf kecil)
IndeksMulai = PBK + 2;
for ii=IndeksMulai:Pgrup:JumGen,
[x,ind] = max(rand(1,JHB));
Kromosom = [Kromosom HHbesar(ind(1))];
% 1 simbol huruf besar
[x,ind] = sort(rand(1,JHK));
Kromosom = [Kromosom HHkecil(ind(1:PKK))]; % 4 simbol huruf kecil
end
Populasi(pp,:) = Kromosom;
end
GEDekode.m
Bertujuan untuk mendekodekan suatu
kromosom menjadi sebuah individu yang berupa matriks 8x8.
function NNstruk =
GEDekode(Kromosom,JumGen,PBK,PKK,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
Xupper = [];
for ii=2:fix(PBK/2)+1,
ind = find(Kromosom(PBK+2:JumGen)==Kromosom(ii));
ind = ind + PBK + 1;
ind = [ind 0];
ind = ind(1);
if ind == 0,
ind = PBK + 2;
end
US = Kromosom(ind+1:ind+fix(PKK/2));
LS = Kromosom(ind+fix(PKK/2)+1:ind+PKK);
Lstring = [US ; LS];
Xupper = [Xupper Lstring];
end
Xlower = [];
for ii=fix(PBK/2)+2:PBK+1,
ind = find(Kromosom(PBK+2:JumGen)==Kromosom(ii));
ind = ind + PBK + 1;
ind = [ind 0];
ind = ind(1);
if ind == 0,
ind = PBK + 2;
end
US = Kromosom(ind+1:ind+fix(PKK/2));
LS = Kromosom(ind+fix(PKK/2)+1:ind+PKK);
Lstring = [US ; LS];
Xlower = [Xlower Lstring];
end
X = [Xupper ; Xlower];
NNstruk = [];
for ii=1:PKK,
NNrow = [];
for jj=1:PKK,
NNrow = [NNrow eval(X(ii,jj))];
end
NNstruk = [NNstruk ; NNrow];
end
GEEvaluasiIndividu.m
Bertujuan untuk mengevaluasi suatu
individu sehingga didapatkan nilai fitnessnya.
function Fitness = GEEvaluasiIndividu(NNstruk,NNtarget,BilKecil);
Nerror = sum(sum(abs(NNstruk-NNtarget)));
Fitness = 1 /
(Nerror+BilKecil);
Bertujuan untuk
memutasikan gen-gen dengan probabilitas sebesar Pmutasi.
function MutKrom =
GEMutasi(Kromosom,JumGen,HHbesar,HHkecil,JHB,JHK,PBK,Pmutasi)
GrammaticalEncoding.m
clc
clear all
HHbesar = ['ABCD']; %
Himpunan huruf besar
HHkecil = ['abcdefghijklmnop']; %
Himpunan huruf kecil
JHB = length(HHbesar); % Jumlah huruf besar dalam
himpunan
JHK = length(HHkecil); % Jumlah huruf kecil dalam
himpunan
PBK = 4; % Jumlah huruf besar dalam
satu grup setelah simbol start S
PKK = 4; % Jumlah huruf kecil dalam
satu grup setelah huruf besar
JumBesarKecil = 20; % Jumlah grup dalam
satu kromosom
JumGen = 1 + PBK
+ JumBesarKecil * (PKK+1); % Jumlah gen
BilKecil = 10^-1; % untuk menghindari pembagian dengan
0
Fthreshold = 1/BilKecil; %
Threshold untuk nilai Fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
UkPop = 100; % Jumlah
kromosom dalam populasi
Psilang = 0.8; % Probabilitas
pindah silang
Pmutasi = 0.01; % Probabilitas
mutasi
MaxG = 500; % Jumlah generasi
% Inisialisasi grafis
hfig = figure;
hold on
title('AG dengan gramatical encoding untuk
membangun struktur Neural Network')
set(hfig, 'position', [50,50,600,400]);
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG));
hbestplot2 = plot(1:MaxG,zeros(1,MaxG));
htext1 = text(0.6*MaxG,0.25*Bgraf,sprintf('Fitness terbaik: %7.6f', 0.0));
htext2 = text(0.6*MaxG,0.20*Bgraf,sprintf('Fitness rata-rata: %7.6f', 0.0));
htext3 = text(0.6*MaxG,0.15*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext4 = text(0.6*MaxG,0.10*Bgraf,sprintf('Prob. Pindah Silang: %4.3f', 0.0));
htext5 = text(0.6*MaxG,0.05*Bgraf,sprintf('Prob. Mutasi: %4.3f', 0.0));
xlabel('Generasi');
ylabel('Fitness');
hold off
drawnow;
% Bangkitkan NN target
NNtarget = BangkitkanNNtarget;
% Bangkitkan Matriks 2 x 2 untuk 16 simbol huruf kecil
[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p] = BangkitkanMatriks16simbol;
% Inisialisasi Populasi
Populasi = GEInisialisasiPopulasi(UkPop,HHbesar,HHkecil,JHB,JHK,PBK,PKK,JumGen);
for generasi=1:MaxG,
NNstruk = GEDekode(Populasi(1,:),JumGen,PBK,PKK,a,b,c,d,e,f,g,h,i,j,k,l,m,
n,o,p);
Fitness(1) =
GEEvaluasiIndividu(NNstruk,NNtarget,BilKecil);
MaxF = Fitness(1);
MinF = Fitness(1);
IndeksIndividuTerbaik = 1;
for ii=2:UkPop,
NNstruk =
GEDekode(Populasi(ii,:),JumGen,PBK,PKK,a,b,c,d,e,f,g,h,i,j,
k,l,m,n,o,p);
Fitness(ii) = GEEvaluasiIndividu(NNstruk,NNtarget,BilKecil);
if (Fitness(ii) > MaxF),
MaxF = Fitness(ii);
IndeksIndividuTerbaik = ii;
KromosomTerbaik = Populasi(ii,:);
NNstrukTerbaik = NNstruk;
end
if (Fitness(ii) <= MinF),
MinF = Fitness(ii);
end
end
FitnessRataRata = mean(Fitness);
plotvector1 = get(hbestplot1,'YData');
plotvector1(generasi) = MaxF;
set(hbestplot1,'YData',plotvector1);
plotvector2 = get(hbestplot2,'YData');
plotvector2(generasi) = FitnessRataRata;
set(hbestplot2,'YData',plotvector2);
set(htext1,'String',sprintf('Fitness terbaik: %7.6f', MaxF));
set(htext2,'String',sprintf('Fitness rata-rata: %7.6f', FitnessRataRata));
set(htext3,'String',sprintf('Ukuran populasi: %3.0f', UkPop));
set(htext4,'String',sprintf('Prob. Pindah Silang: %4.3f', Psilang));
set(htext5,'String',sprintf('Probabilitas Mutasi: %4.3f', Pmutasi));
drawnow
if MaxF >= Fthreshold,
break;
end
TemPopulasi = Populasi;
% Elitisme:
% - Buat satu kopi kromosom terbaik jika ukuran populasi ganjil
% - Buat dua kopi kromosom terbaik jika ukuran populasi genap
if mod(UkPop,2)==0, % ukuran populasi genap
IterasiMulai = 3;
TemPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
TemPopulasi(2,:) =
Populasi(IndeksIndividuTerbaik,:);
else % ukuran populasi
ganjil
IterasiMulai = 2;
TemPopulasi(1,:) =
Populasi(IndeksIndividuTerbaik,:);
end
LinearFitness = LinearFitnessRanking(UkPop,Fitness,MaxF,MinF);
for jj=IterasiMulai:2:UkPop,
IP1 = RouletteWheel(UkPop,LinearFitness);
IP2 = RouletteWheel(UkPop,LinearFitness);
if (rand <
Psilang),
Anak = PindahSilang(Populasi(IP1,:),Populasi(IP2,:),JumGen);
TemPopulasi(jj,:) = Anak(1,:);
TemPopulasi(jj+1,:) =
Anak(2,:);
else
TemPopulasi(jj,:) = Populasi(IP1,:);
TemPopulasi(jj+1,:) =
Populasi(IP2,:);
end
end
for kk=IterasiMulai:UkPop,
TemPopulasi(kk,:) =
GEMutasi(TemPopulasi(kk,:),JumGen,HHbesar,HHkecil,JHB,JHK,PBK,Pmutasi);
end
Populasi = TemPopulasi;
end
KromosomTerbaik
NNstrukTerbaik
save NNstrukTerbaik.mat NNstrukTerbaik
Hasil Running
Video 1.
Simulasi AG Optimasi
Video 2.
TSP
Video 3. FFNN Binary Encoding
Video 4.
FFNN Messy Encoding
Video 5. FFNN Sup Populasi
Video 6.
FFNN Grid Based Crossover
Video 7.
Grammatical Encoding
1. Source
Code Download
2. Video
Simulasi Download
Tidak ada komentar:
Posting Komentar