Anda di halaman 1dari 9

SCRIPT PROGRAM GA UNTUK PENYELESAIAN TSP

A. Inisialisasi
%===============================================================================
% Fungsi Inisialisasi berfungsi untuk Membangkitkan sejumlah UkPop kromosom, masing-
masing kromosom berisi bilangan
% 1 sampai JumGen (jumlah kota)
%
% Masukan
% UkPop : ukuran populasi atau jumlah kromosom dalam populasi
% JumGen: jumlah gen dalam kromosom (jumlah kota)
%
% Keluaran
% Populasi : kumpulan kromosom, matriks berukuran UkPop x JumGen
%
%===============================================================================

function Populasi = Inisialisasi(UkPop,JumGen)

for ii=1:UkPop;
[Xval,Ind] = sort(rand(1,JumGen));
Populasi(ii,:) = Ind

%ind = randi([2,JumGen],ii,JumGen);

end
end
B. Evaluasi Kromosom
%===============================================================================
% Mengevaluasi kromosom sehingga didapatkan nilai fitness-nya
%
% Masukan
% Kromosom : kromosom, matriks berukuran 1 x JumGen
% JumGen : jumlah gen
% XYkota : posisi-posisi koordinat kota, matriks berukuran UkPop x 2
%
% Keluaran
% fitness : nilai fitness
%===============================================================================

function fitness = Evaluasikromosom(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;
C. Linier Fitness Ranking
%===============================================================================
% Men-skala-kan nilai fitness ke dalam ranking sehingga diperoleh
% nilai-nilai fitness baru yang berada dalam rentang [MaxF,MinF]
%
% Masukan
% UkPop : ukuran populasi atau jumlah kromosom dalam populasi
% Fitness: nilai fitness, matriks ukuran 1 x UkPop
% MaxF : nilai fitness maximum
% MinF : nilai fitness minimum
%
% Keluaran
% LFR : Linear Fitness Ranking
%
%===============================================================================

function LFR = LinierFitnessRanking(UkPop,Fitness,MaxF,MinF)

% NFit = berisi nilai fitness yang terurut dari kecil ke besar (ascending)
% IndFit = berisi index dari nilai fitness yang menyatakan nomor urut kromosom

[NFit,IndFit] = sort(Fitness);

% LinearFitness = nilai fitness baru hasil pen-skala-an


for Rk =1:UkPop,
LFR(IndF(UkPop-Rk+1)) = MaxF-(MaxF-MinF)*((Rk-1)/(UkPop-1));
end
D. Rouletee Wheel Selection
%===============================================================================
% Memilih orang tua dengan menggunakan LinearFitness, yaitu nilai fitness
% hasil pen-skala-an. Pemilihan dilakukan secara proporsional sesuai dengan
% nilai fitness-nya.
%
% Masukan
% UkPop : ukuran populasi atau jumlah kromosom dalam populasi
% LinearFitness : nilai fitness yang sudah di-skala-kan
%
% Keluaran
% Pindex : indeks dari kromosom yang terpilih (bernilai 1 sampai UkPop)
%
%===============================================================================

function Pindex = SeleksiRodarolet(UkPop,LinearFitness);

JumFitness = sum(LinearFitness); %total nilai fitness


KumFitness = 0; %kumulatif jumlah nilai fitness
Bcak = rand; %bilangan acak yang dibangkitkan
ii = 1;
while ii <= UkPop,
KumFitness = KumFitness + LinearFitness(ii);
if (KumFitness /JumFitness) > Bcak,
Pindex = ii;
break;
end
ii = ii + 1;
end
E. Crossover
%===============================================================================
% One Point Crossover (OPX)
% Memindah-silangkan bagian kromosom Bapak dan Ibu yang dipotong
% secara random, sehingga dihasilkan dua buah kromosom Anak
%
% Masukan
% Bapak : kromosom, matriks berukuran 1 x JumGen
% Ibu : kromosom, matriks berukuran 1 x JumGen
% JumGen : jumlah gen
%
% Keluaran
% Anak : kromosom hasil pindah silang, matriks berukuran 1 x JumGen
%
%===============================================================================

function Anak = Crossover(Bapak,Ibu,JumGen);

% Membangkitkan satu titik potong (TP bernilai antara 1 sampai JumGen-1)


TP = 1 + fix(rand*(JumGen-1));

% Anak 1 berisi bagian depan Bapak dan bagian belakang Ibu


Anak(1,:) = [Bapak(1:TP) Ibu(TP+1:JumGen)];
Anak(2,:) = [Ibu(1:TP) Bapak(TP+1:JumGen)];
F. Mutasi
%===============================================================================
% Mutasi gen dengan probabilitas sebesar Pmutasi
% Gen-gen yang terpilih diubah nilainya: 0 menjadi 1, dan 1 menjadi 0
%
% Masukan
% Kromosom : kromosom, matriks berukuran 1 x JumGen
% JumGen : jumlah gen
% Pmutasi : Probabilitas mutasi
%
% Keluaran
% MutKrom : kromosom hasil mutasi, matriks berukuran 1 x JumGen
%
%===============================================================================

function MutKrom = Mutasi(Kromosom,JumGen,Pmutasi);

MutKrom = Kromosom;
for ii=1:JumGen,
if (rand < Pmutasi),
if Kromosom(ii)==0,
MutKrom(ii) = 1;
else
MutKrom(ii) = 0;
end
end
end
G. Program Utama
%===============================================================================
% Algoritma Genetika untuk Travelling Salesman Problem
%
% Memanggil fungsi-fungsi berikut
% 1. Inisialisasi
% 2. Evaluasikromosom
% 3. LinearFitnessRanking
% 4. SeleksiRodarolet
% 5. Crossover
% 6. Mutasi
%
%===============================================================================

clc
clear all

XYkota = input('masukkan titik koordinat X dan Y = ');

JumGen = length(XYkota(:,1)) % Jumlah gen


(jumlah kota)

UkPop = input('masukkan Jumlah kromosom dalam populasi = ') % Jumlah kromosom


dalam populasi

Psilang = input('masukkan probabilitas crossover = ') % Probabilitas


pindah silang

Pmutasi = input('masukkan probabilitas mutasi = ') % Probabilitas


mutasi

MaxG = input('Batasan Jumlah Generasi yang dibuat = ') % Jumlah generasi

PanjJalHarp = input('Masukkan Panjang Jalur yang diharapkan = ') % 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 = Inisialisasi(UkPop,JumGen);

for generasi=1:MaxG,
MaxF = Evaluasikromosom(Populasi(1,:),JumGen,XYkota);
MinF = MaxF;
IndeksIndividuTerbaik = 1;
for ii=1:UkPop,
Fitness(ii) = Evaluasikromosom(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 = LiniearFitnessRanking(UkPop,Fitness,MaxF,MinF);

% Roulette-wheel selection dan pindah silang


for jj=IterasiMulai:2:UkPop,
IP1 = SeleksiRodarolet(UkPop,LinearFitness);
IP2 = SeleksiRodarolet(UkPop,LinearFitness);
if (rand < Psilang),
Anak = Crossover(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

Populasi = TempPopulasi;

end

% Tanpa tanda ';' berarti menampilkan nilai dari variabel 'JalurTerbaik'


JalurTerbaik

% Simpan variabel 'JalurTerbaik' ke dalam file JalurTerbaik.mat


save JalurTerbaik.mat JalurTerbaik

Anda mungkin juga menyukai