Algoritma Genetika untuk Travelling Salesman Problem
Algoritma genetika (AG) merupakan algoritma pencarian yang didasarkan pada mekanisme seleksi alamiah dan genetika alamiah. Karena didasarkan pada teori-teori dalam ilmu biologi, banyak istilah dan konsep biologi yang digunakan dalam algoritma ini. AG telah banyak diterapkan pada beberapa kasus seperti optimasi, pemrograman otomatis, machine learning, pemodelan ekonomi, pemodelan sistem imunisasi, pemodelan ekologis, serta interaksi antara evolusi dan belajar (Suyanto, 2005).
Berikut ini merupakan contoh penerapan algoritma genetika untuk optimasi kombinasi dalam kasus Travelling Salesman Problem. Optimasi dilakukan untuk mencari jalur/rute terpendek yang menghubungkan antara dua titik lokasi. Langkah-langkah pemrogramannya adalah sebagai berikut:
1. Mempersiapkan dan menampilkan data koordinat dari beberapa titik lokasi
clc; clear; close all; load DataKoordinat % menampilkan plot masing2 titik figure, plot(XY(:,1),XY(:,2),'b.','MarkerSize',20) grid on text(XY(1,1),XY(1,2),' P01') text(XY(2,1),XY(2,2),' P02') text(XY(3,1),XY(3,2),' P03') text(XY(4,1),XY(4,2),' P04') text(XY(5,1),XY(5,2),' P05') text(XY(6,1),XY(6,2),' P06') text(XY(7,1),XY(7,2),' P07') text(XY(8,1),XY(8,2),' P08') text(XY(9,1),XY(9,2),' P09') text(XY(10,1),XY(10,2),' P10') text(XY(11,1),XY(11,2),' P11')
tampilan plot koordinat dari beberapa titik lokasi ditunjukkan pada gambar berikut
2. Melakukan pencarian jalur/rute terpendek yang menghubungkan antara dua titik lokasi
JumGen = length(XY(:,1)); % Jumlah gen
UkPop = 10; % Jumlah kromosom dalam populasi
Psilang = 0.8; % Probabilitas pindah silang
Pmutasi = 0.005; % Probabilitas mutasi
MaxG = 100; % Jumlah generasi
PanjJalHarp = 20; % Panjang Jalur yang diharapkan
Fthreshold = 1/PanjJalHarp; % Threshold untuk fitness
Bgraf = Fthreshold; % Untuk menangani tampilan grafis
hfig = figure;
hold on
set(hfig, 'DoubleBuffer', 'on');
axis([1 MaxG 0 Bgraf]);
hbestplot1 = plot(1:MaxG,zeros(1,MaxG),'r','LineWidth',2);
hbestplot2 = plot(1:MaxG,zeros(1,MaxG),'b','LineWidth',2);
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);
save Populasi Populasi
for generasi=1:MaxG,
MaxF = TSPEvaluasiIndividu(Populasi(1,:),JumGen,XY);
MinF = MaxF;
IndeksIndividuTerbaik = 1;
for ii=1:UkPop,
Fitness(ii) = TSPEvaluasiIndividu(Populasi(ii,:),JumGen,XY);
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
Grafik nilai fitness pada masing-masing generasi ditunjukkan pada gambar berikut
3. Menampilkan hasil pencarian jalur/rute terpendek
% menampilkan plot masing2 titik beserta jalur terbaik figure, plot([XY(JalurTerbaik(1),1);XY(JalurTerbaik(2),1)],... [XY(JalurTerbaik(1),2);XY(JalurTerbaik(2),2)],'r-','LineWidth',2) hold on plot([XY(JalurTerbaik(2),1);XY(JalurTerbaik(3),1)],... [XY(JalurTerbaik(2),2);XY(JalurTerbaik(3),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(3),1);XY(JalurTerbaik(4),1)],... [XY(JalurTerbaik(3),2);XY(JalurTerbaik(4),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(4),1);XY(JalurTerbaik(5),1)],... [XY(JalurTerbaik(4),2);XY(JalurTerbaik(5),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(5),1);XY(JalurTerbaik(6),1)],... [XY(JalurTerbaik(5),2);XY(JalurTerbaik(6),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(6),1);XY(JalurTerbaik(7),1)],... [XY(JalurTerbaik(6),2);XY(JalurTerbaik(7),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(7),1);XY(JalurTerbaik(8),1)],... [XY(JalurTerbaik(7),2);XY(JalurTerbaik(8),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(8),1);XY(JalurTerbaik(9),1)],... [XY(JalurTerbaik(8),2);XY(JalurTerbaik(9),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(9),1);XY(JalurTerbaik(10),1)],... [XY(JalurTerbaik(9),2);XY(JalurTerbaik(10),2)],'r-','LineWidth',2) plot([XY(JalurTerbaik(10),1);XY(JalurTerbaik(11),1)],... [XY(JalurTerbaik(10),2);XY(JalurTerbaik(11),2)],'r-','LineWidth',2) plot(XY(:,1),XY(:,2),'b.','MarkerSize',20) text(XY(1,1),XY(1,2),' P01') text(XY(2,1),XY(2,2),' P02') text(XY(3,1),XY(3,2),' P03') text(XY(4,1),XY(4,2),' P04') text(XY(5,1),XY(5,2),' P05') text(XY(6,1),XY(6,2),' P06') text(XY(7,1),XY(7,2),' P07') text(XY(8,1),XY(8,2),' P08') text(XY(9,1),XY(9,2),' P09') text(XY(10,1),XY(10,2),' P10') text(XY(11,1),XY(11,2),' P11') hold off grid on
tampilan hasil pencarian jalur/rute terpendek ditunjukkan pada gambar berikut
Source code lengkap dan data pada pemrograman di atas dapat diperoleh melalui halaman berikut ini: Source Code
Posted on February 6, 2020, in Data mining and tagged algoritma genetika, algoritma genetika untuk optimasi, Algoritma Genetika untuk Travelling Salesman Problem, algoritma genetika untuk TSP, contoh program algoritma genetika, optimasi menggunakan algoritma genetika, pemrograman matlab. Bookmark the permalink. 1 Comment.


















































Assalamualaikum
Pak adi, mau tanya kalo penerapan algoritma genetika untuk optimasi bobot pada jst learning vector quantization itu bagaimana ya..?apa pak adi punya artikel terkait..terimakasih
Salam