Rabu, 04 September 2024

BAB VI


BAB VI

6.1. Optimasi Fungsi [BACK] 


    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,
    Terdapat 2 jenis TSP:
    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(SisaGenbapak));

Anak(2,cpd+1:JumGen) = SisaGenIbu(1:JumGen-cpd);
Anak(2,1:cps) = SisaGenIbu(1+JumGen-cpd:length(SisaGenIbu));

    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,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('Panjang jalur terbaik: %7.3f', 0.0));
htext4 = text(0.6*MaxG,0.10*Bgraf,sprintf('Ukuran populasi: %3.0f', 0.0));
htext5 = text(0.6*MaxG,0.05*Bgraf,sprintf('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

BangMatrixIT.m
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

BinaryEvalInd.m
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*SumWIb));
    end
    
    SumWXb = 0;
    for jj=1:JumMasukan,
        SumWXb = SumWXb + (Who(jj) * Xih(jj) + bho);
    end
    Xho = 1 / (1+exp(-c*SumWXb));
    RMSE = RMSE + (TM(evaluasi)-Xho)^2;
end

Delta = sqrt(1/JPmasukan * RMSE);
fitness = 1/Delta;   

FFNBinaryLatih.m
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

FFNNtes.m
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*SumWIb));
    end
    
    SumWXb = 0;
    for jj=1:n,
       SumWXb = SumWXb + Who(jj) * Xih(jj) + bho;
    end
    Xho = 1 / (1+exp(-c*SumWXb));

    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

Hasil Running




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 kasus 3-parity, parameter FFNN adalah 16, dan panjang kromosom messy encoding = 16 x 20 x 2 x 5 = 3200.

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

MessyEvalInd.m
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*JumWIb));
    end
    
    SumWXb = 0;
    for jj=1:JumMasukan,
        SumWXb = SumWXb + (Who(jj) * Xih(jj) + bho);
    end
    Xho = 1 / (1+exp(-c*SumWXb));
    RMSE = RMSE + (TM(evaluasi)-Xho)^2;
end

Delta = sqrt(1/JPmasukan * RMSE);
fitness = (1/Delta) * exp(-JGHilang);

MessyPindahSilang.m
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)];

MessyMutasi.m
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)

JumMasukan  = 3;                     % Jumlah masukan
JPmasukan   = 2^JumMasukan;          % Jumlah pola masukan
JumGen      = Nbit*(JumMasukan+1)^2; % Jumlah gen
Nvar        = JumGen/Nbit;           % Jumlah variabel
Rb          = -10;                   % Batas bawah dari rentang yang ditentukan  
Ra          = 10;                    % Batas atas dari rentang yang ditentukan

UkPop       = length(Populasi(:,1)); % Jumlah kromosom dalam satu sub populasi

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=1: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);
   
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   
   
PopulasiBaru = TemPopulasi;
 
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-(JumSubPop-1)*JumIndSubPop));
                else
                    % Pilih satu kromosom pada sub poppulasi yang lain
                    ind2 = fix(1+rand*JumIndSubPop);
                end
                KromTemp = Populasi((ISP-1)*JumIndSubPop+ind1,:);
                Populasi((ISP-1)*JumIndSubPop+ind1,:) = Populasi((Itt-1)*JumIndSubPop+ind2,:);
                Populasi((Itt-1)*JumIndSubPop+ind2,:) = KromTemp;
            end
        end
    end
end

FFNNterbaik
save FFNNterbaik.mat FFNNterbaik





> 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*(UkTour-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)

Fbapak = Fitness(IP1);
Fibu = Fitness(IP2);

if Fbapak > Fibu,
    if FA1 > FA2,
        if FA2 > Fibu,
            TemPop(IP2,:) = Anak2;
            if FA1 > Fbapak,
                TemPop(IP1,:) = Anak1;
            end
        else
            if FA1 > Fibu,
                TemPop(IP2,:) = Anak1;
            end
        end
    else
        if FA1 > Fibu,
            TemPop(IP2,:) = Anak1;
            if FA2 > Fbapak,
                TemPop(IP1,:) = Anak2;
            end
        else
            if FA2 > Fibu,
                TemPop(IP2,:) = Anak2;
            end
        end
    end
else
    if FA1 > FA2,
        if FA2 > Fbapak,
            TemPop(IP1,:) = Anak2;
            if FA1 > Fibu,
                TemPop(IP2,:) = Anak1;
            end
        else
            if FA1 > Fbapak,
                TemPop(IP1,:) = Anak1;
            end
        end
    else
        if FA1 > Fbapak,
            TemPop(IP1,:) = Anak1;
            if FA2 > Fibu,
                TemPop(IP2,:) = Anak2;
            end
        else
            if FA2 > Fbapak,
                TemPop(IP1,:) = Anak2;
            end
        end
    end
end
        
PopBaru = TemPop;

FFNNGridLatih.m
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:



BangkitkanMatriks16simbol.m
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);

GEMutasi.m
Bertujuan untuk memutasikan gen-gen dengan probabilitas sebesar Pmutasi.
function MutKrom = GEMutasi(Kromosom,JumGen,HHbesar,HHkecil,JHB,JHK,PBK,Pmutasi)

MutKrom = Kromosom;
for ii=2:JumGen,
  if (rand < Pmutasi),
    if (ii <= PBK+1) | (mod(ii,PBK+1)==1),
       [x,IC] = max(rand(1,JHB));
       MutKrom(ii) = HHbesar(IC(1));
    else
       [x,IL] = max(rand(1,JHK));
       MutKrom(ii) = HHkecil(IL(1));
    end
  end
end

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

Entri yang Diunggulkan

UAS Fuzzy

Referensi : Sitti Amalia. (2021). Pemodelan Sistem Pengontrolan Suhu Ruangan Berbasis Logika Fuzzy Mamdani . Jurnal Teknik Elektro, 10(1), 3...