Bab 3

 

Implementasi Algoritma Genetika dalam MATLAB


                                        


1. Sekilas tentang MATLAB [BACK] 
    Matlab merupakan singkatan dari MATrix LABoratory adalah suatu bahasa pemrograman untuk komputasi numerik yang berorientasi pada matriks. Aplikasi ini akan memudahkan dalam mengumplementasian GA.
Tampilan lingkungan Matlab. Ada 2 komponen yaitu commad window dan workspace

           Didalam Matlab ada beberapa hal yang diperhatikan:
  1. Setiap variabel dipandang sebagai matriks.
  2. Pembuatan program atau fungsi dilakukan di dalam suatu file berekstensi.m dan dapat dieksekusi melalui command window dengan cara mengetikkan nama file atau fungsi.
  3. Matlab membedakan huruf besar dan huruf kecil (case sensitive) dan i dan j menunjukkan bagian imajiner dari suatu bilangan kompleks. Untuk menghindari kesalahan, sebaiknya tidak menggunakan i dan j sebagai nama variabel. Sebaiknya gunakan ii dan jj.

         - Matriks
          Matriks adalah kumpulan angka berbentuk persegi. Bilangan skalar dinyatakan dalam matriks 1x1 sedangkan vektor dinyatakan oleh matriks baris atau matriks kolom.
Tanda '>>' adalah command prompt pada commond window.
         - SumTranspose, dan diag
    • Sum : Penjumlahan matriks berdasarkan kolom direpresentasikan oleh operasi.
    • Transpose : Mengubah baris menjadi kolom dan sebaliknya, dinyatakan dalam tanda petik satu (')
    • Diag : Elemen matrikspada posisi - posisi diagonal 

         - Indeks Matriks
           Penunjukan elemen matriks dapat dolakukan berdasarkan indeksnya. Penunjukan dilakukan dengan menggunakan aturan A (baris, kolom). Kedua indeks, baris, dan kolom adalah bilangan positif.
Contoh kasus :

         - Operator ":" (titik dua)
          ": " perintah di bawah ini menyatakan deretan bilangan bulat dengan kelipatan 1.
           ":" perintah dibawah ini menyatakan deretan bilangan bulat dengan kelipatan -5
            Penunjukan elemen vektro ataupun matriks bisa menggunakan operator ":". Perintah di bawah menyatakan C berisi elemen - elemen vektro B baris ke 1 sampai ke 3
            Perintah dibawah, D diisi dengan matriks A semua baris kolom 1 sampai 2. A adalah sebuah matriks yang telah didefenisikan diatas.
         - Membangkitkan Matriks
           Sebuah matriks dapat dibangkitkan dengan cara berikut:
    • zeros (semua nol)
    • ones (semua satu)
    • rand (random dalam distribusi uniform)
    • randn (random dalam distribusi normal)

         - Concatenation
           Concatenation adalah penggabungan beberapa matriks kecil menjadi matriks besar. Jika menggunakan titik komas (;), maka kedua matriks digabungkan berdasarkan kolomnya. Jika matriks yang digabungkan memiliki jumlah baris atau jumlah kolom yang berbeda, penggabungan tidak bisa dilakukan, sehingga keluar pesan kesalahan '??? Error using ==> vertacat'

         - Operasi-operasi Matriks
           Operator operator yang digunakan matlab untuk memanipulasi variabel (matriks) adalah sebagai berikut: 
                + (penjumlahan)
                - (pengurangan)
                * (perkalian matriks)
                .*(perkalian elemen per elemen)
                ./ (pembagian elemen per elemen, variabel kiri dibagi kanan)
                .\ (pembagian elemen per elemen, variabel kanan dibagi kiri)
               .^ (perpangkatan elemen per elemen)

            contoh: 

           Operator - operator yang lain dapat dicari di help. Atau dengan mengetikkan kata kunci yang ada pada commond window.
            contoh:

2. Implementasi Algoritma Genetika [BACK] 
    
    Pada penjelasan berikut akan diterapkan GA untuk mencari nilai dari fungsi h:

  • Tujuan fungsi ini untuk membangkitkan populasi yang berisi sejumlah kromosom.
          


          Bertujuan untuk mengodekan sebuah kromosom yang berisi bilangan biner menjadi individu x yang bernilai real dalam interval yang diinginkan, berdasarkan persamaan berikut:



          Fungsi ini bertujuan untuk menghitung nilai fitness dari suatu individu x


            Untuk menjaga individu dengan nilai fitness terbaik, maka dilakukan elitisme,

          Untuk menghindari kecenderungan konvergen pada optimum lokal, maka digunakaan penskalaan nilai fitness yang bertujuan untuk mendapatkan nilai fitness yang lebih baik, bervariansi tinggi.


          

          


          


          Untuk menampilkan grafis 2D dari AG.
          Syntax-nya sebagai berikut :



           








     
    Terdapat tiga variabel utama yang harus ditentukan oleh user, yaitu: 
  1. UkPop (30-1000)
  2. Psilang (0,6-0,9)
  3. Pmutasi (1/jumlah gen)
Nvar        = 2;              % Jumlah variabel pada fungsi yang dioptimasi
Nbit        = 10;             % Jumlah bit yang mengkodekan satu variabel
JumGen      = Nbit*Nvar;      % Jumlah gen dalam kromosom
Rb          = -5.12;          % Batas bawah interval
Ra          = 5.12;           % Batas atas interval

Psilang     = 0.8;            % Probabilitas pindah silang
MaxJumInd   = 60000;          % Jumlah individu maksimum yang dievaluasi

BilKecil    = 10^-1;          % Digunakan untuk menghindari pembagian dengan 0
Fthreshold  = 1/BilKecil;     % Threshold untuk nilai Fitness
Bgraf       = Fthreshold;     % Untuk menangani tampilan grafis

ObUkPop = [50 100 200 400];       % Ukuran populasi yang diobservasi
ObPmutasi = [0.01 0.05 0.1 0.2];  % Probabilitas mutasi yang diobservasi

ObData = [];                  % Data hasil observasi

for ukp=1:length(ObUkPop),
    UkPop = ObUkPop(ukp);
    MaxG = fix(MaxJumInd/UkPop);
    for pm=1:length(ObPmutasi),
        Pmutasi = ObPmutasi(pm);
        for observasi=1:10,
            UkPop, Pmutasi, observasi
            
            % Inisialisasi populasi
            Populasi = InisialisasiPopulasi(UkPop,JumGen);

            % Loop evolusi
            for generasi=1:MaxG,
               x = DekodekanKromosom(Populasi(1,:),Nvar,Nbit,Ra,Rb);
               Fitness(1) = EvaluasiIndividu(x,BilKecil);
               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,BilKecil);
                 if (Fitness(ii) > MaxF),
                    MaxF = Fitness(ii);
                    IndeksIndividuTerbaik = ii;
                    BestX = x;
                 end
                 if (Fitness(ii) < MinF),
                    MinF = Fitness(ii);
                 end
               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;

               if MaxF >= Fthreshold,
                  JumIndData(observasi) = generasi*UkPop;
                  MaxFData(observasi) = MaxF;
                  break;
               else
                  if generasi == MaxG,
                     JumIndData(observasi) = MaxG*UkPop;
                     MaxFData(observasi) = MaxF;
                  end
               end
               
            end  % loop evolusi
        end % loop observasi
        ObData = [ObData ; [UkPop Pmutasi mean(MaxFData) mean(JumIndData)]];
    end
end

save ObData.mat ObData

clc  % me-refresh layar

disp(['Mencari nilai optimal: Ukuran Populasi dan Prob. Mutasi ']);
disp(['Jumlah maksimum individu yang dievaluasi adalah ', num2str(MaxJumInd)]);
disp(['                                                        ']);
disp(['--------------------------------------------------------']);
disp(['Ukuran      Probabilas      Rata-rata      Rata-rata    ']);
disp(['Poulasi      mutation        Fitness     Jumlah individu']);
disp(['--------------------------------------------------------']);

for ii=1:length(ObData(:,1)),
  disp(['   ', num2str(ObData(ii,1)),'          ', num2str(ObData(ii,2)), ... 
  '            ', num2str(ObData(ii,3)),'           ', num2str(ObData(ii,4))]);
end

disp(['--------------------------------------------------------']);
    






Tidak ada komentar:

Posting Komentar