function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)
% x
- solusi terbaik yang ditemukan selama perjalanan
% endPop
- populasi terakhir
% bPop
- jejak populasi terbaik
% traceInfo
- matriks terbaik dan sarana ga untuk setiap generasi
%
% Input
Arguments:
% bounds
- matriks batas atas dan bawah pada variabel
% evalFN
- nama evaluasi .m function
% evalOps
- pilihan untuk lolos ke fungsi evaluasi ([NULL])
% startPop
- matriks solusi yang dapat diinisialisasi
%
from initialize.m
% opts
- [epsilon prob_ops display] perubahan diperlukan untuk
% mempertimbangkan dua
% solusi berbeda, prob_ops
0 jika Anda ingin menerapkan
% operator genetik secara
probabilistik untuk setiap solusi, 1 jika
% Anda menyediakan jumlah
operator deterministik
% aplikasi dan tampilan
adalah 1 untuk menghasilkan keluaran 0 untuk
% diam.
([1e-6 1 0])
% termFN
- nama dari .m termination function (['maxGenTerm'])
% termOps
- string opsi untuk diteruskan ke fungsi penghentian
% ([100]).
% selectFN
- name of the .m selection function (['normGeomSelect'])
% selectOpts
- string opsi yang akan dilewatkan untuk dipilih setelahnya
% select(pop,#,opts) ([0.08])
% xOverFNS
- string yang berisi nama kosong dipisahkan dari Xover.m
% files (['arithXover
heuristicXover simpleXover'])
%
xOverOps - Sebuah matriks opsi
untuk dilewatkan ke file Xover.m dengan
% kolom
pertama adalah jumlah yang akan dilakukan xOver
% serupa untuk
mutasi ([2 0;2 3;2 0])
% mutFNs
- string yang berisi nama kosong dipisahkan dari mutation.m
% files (['boundaryMutation
multiNonUnifMutation ...
% nonUnifMutation
unifMutation'])
%
mutOps - Sebuah matriks opsi
untuk dilewatkan ke file Xover.m dengan
% kolom
pertama adalah jumlah yang akan dilakukan xOver
% serupa untuk
mutasi ([4 0 0;6 100 3;4 100 3;4 0 0])
n=nargin;
if n<2 | n==6 | n==10 | n==12
disp('Insufficient arguements')
end
if n<3 % Pemilihan evalasi default.
evalOps=[];
end
if n<5
opts =
[1e-6 1 0];
end
if isempty(opts)
opts =
[1e-6 1 0];
end
if any(evalFN<48) % Tidak menggunakan a .m file
if
opts(2)==1 % Float ga
e1str=['x=c1; c1(xZomeLength)=', evalFN ';'];
e2str=['x=c2; c2(xZomeLength)=', evalFN ';'];
else % Biner ga
e1str=['x=b2f(endPop(j,:),bounds,bits); endPop(j,xZomeLength)=',...
evalFN
';'];
end
else % Sedang menggunakan file .m
if
opts(2)==1 %Float ga
e1str=['[c1 c1(xZomeLength)]=' evalFN '(c1,[gen evalOps]);'];
e2str=['[c2 c2(xZomeLength)]=' evalFN '(c2,[gen evalOps]);'];
else % Biner ga
e1str=['x=b2f(endPop(j,:),bounds,bits);[x v]=' evalFN ...
'(x,[gen
evalOps]); endPop(j,:)=[f2b(x,bounds,bits) v];'];
end
end
if n<6 % Informasi penghentian default
termOps=[100];
termFN='maxGenTerm';
end
if n<12 % Informasi mutasi default
if
opts(2)==1 %Float GA
mutFNs=['boundaryMutation multiNonUnifMutation nonUnifMutation
unifMutation'];
mutOps=[4 0 0;6 termOps(1) 3;4 termOps(1) 3;4 0 0];
else % GA Biner
mutFNs=['binaryMutation'];
mutOps=[0.05];
end
end
if n<10 % Binary GA% Informasi crossover default
if
opts(2)==1 %Float GA
xOverFNs=['arithXover heuristicXover simpleXover'];
xOverOps=[2 0;2 3;2 0];
else
%Binary GA
xOverFNs=['simpleXover'];
xOverOps=[0.6];
end
end
if n<9 % Pilih Default hanya memilih i.e. roullete wheel.
selectOps=[];
end
if n<8 %Default select info
selectFN=['normGeomSelect'];
selectOps=[0.08];
end
if n<6 % Informasi penghentian default
termOps=[100];
termFN='maxGenTerm';
end
if n<4 % Tidak ada populasi awal yang diberikan
startPop=[];
end
if isempty(startPop) % Hasilkan suatu populasi secara acak
%startPop=zeros(80,size(bounds,1)+1);
startPop=initializega(80,bounds,evalFN,evalOps,opts(1:2));
end
if opts(2)==0 % biner
bits=calcbits(bounds,opts(1));
end
xOverFNs=parse(xOverFNs);
mutFNs=parse(mutFNs);
xZomeLength
= size(startPop,2); % Panjang dari xzome=numVars+fittness
numVar
= xZomeLength-1; % Jumlah variabel
popSize
= size(startPop,1); % Jumlah individu dalam pop
endPop
= zeros(popSize,xZomeLength); % Matriks populasi sekunder
c1
= zeros(1,xZomeLength); % Seorang individu
c2
= zeros(1,xZomeLength); % Seorang individu
numXOvers
= size(xOverFNs,1); % Jumlah operator Crossover
numMuts
= size(mutFNs,1); % Jumlah operator Mutasi
epsilon
= opts(1); % Threshold untuk dua kebugaran
berbeda
oval
= max(startPop(:,xZomeLength)); % Nilai terbaik di mulai pop
bFoundIn
= 1; % Jumlah waktu terbaik telah
berubah
done
= 0; % Selesai dengan evolusi simulasi
gen
= 1; % Nomor Generasi Saat Ini
collectTrace = (nargout>3); %
Haruskah kami mengumpulkan info setiap gen
floatGA
= opts(2)==1; % Aplikasi probabilistik ops
display
= opts(3); % Kemajuan tampilan
while(~done)
%Elitist
Model
[bval,bindx] = max(startPop(:,xZomeLength)); % Terbaik dari pop saat ini
best
= startPop(bindx,:);
if
collectTrace
traceInfo(gen,1)=gen; % generasi saat ini
traceInfo(gen,2)=startPop(bindx,xZomeLength); %fitnes terbaik
traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %Avg fittness
traceInfo(gen,4)=std(startPop(:,xZomeLength));
end
if (
(abs(bval - oval)>epsilon) | (gen==1)) % Jika kita memiliki sol terbaik baru
if
display
fprintf(1,'\n%d %f\n',gen,bval);
% Perbarui layar
end
if
floatGA
bPop(bFoundIn,:)=[gen startPop(bindx,:)]; % Perbarui bPop Matrix
else
bPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)...
startPop(bindx,xZomeLength)];
end
bFoundIn=bFoundIn+1;
% Perbarui jumlah
perubahan
oval=bval;
% Perbarui val
terbaik
else
if
display
fprintf(1,'%d ',gen); % Atau hanya memperbarui gen num
end
end
endPop
= feval(selectFN,startPop,[gen selectOps]); %Select
if floatGA % Berjalan dengan model di mana parameter adalah jumlah
ops
for i=1:numXOvers,
for j=1:xOverOps(i,1),
a = round(rand*(popSize-1)+1); % Pilih orang tua
b = round(rand*(popSize-1)+1); % Pilih orang tua lain
xN=deblank(xOverFNs(i,:)); % Dapatkan nama fungsi crossover
[c1 c2] =
feval(xN,endPop(a,:),endPop(b,:),bounds,[gen xOverOps(i,:)]);
if
c1(1:numVar)==endPop(a,(1:numVar)) % Pastikan kami membuat yang baru
c1(xZomeLength)=endPop(a,xZomeLength); %solusi sebelum mengevaluasi
elseif
c1(1:numVar)==endPop(b,(1:numVar))
c1(xZomeLength)=endPop(b,xZomeLength);
else
[c1(xZomeLength) c1] = feval(evalFN,c1,[gen evalOps]);
eval(e1str);
end
if
c2(1:numVar)==endPop(a,(1:numVar))
c2(xZomeLength)=endPop(a,xZomeLength);
elseif
c2(1:numVar)==endPop(b,(1:numVar))
c2(xZomeLength)=endPop(b,xZomeLength);
else
[c2(xZomeLength) c2] = feval(evalFN,c2,[gen evalOps]);
eval(e2str);
end
endPop(a,:)=c1;
endPop(b,:)=c2;
end
end
for i=1:numMuts,
for j=1:mutOps(i,1),
a = round(rand*(popSize-1)+1);
c1 = feval(deblank(mutFNs(i,:)),endPop(a,:),bounds,[gen
mutOps(i,:)]);
if
c1(1:numVar)==endPop(a,(1:numVar))
c1(xZomeLength)=endPop(a,xZomeLength);
else
[c1(xZomeLength) c1] = feval(evalFN,c1,[gen evalOps]);
eval(e1str);
end
endPop(a,:)=c1;
end
end
else
%Kami menjalankan model
operator genetik probabilistik
for i=1:numXOvers,
xN=deblank(xOverFNs(i,:)); % Dapatkan nama fungsi crossover
cp=find(rand(popSize,1)<xOverOps(i,1)==1);
if rem(size(cp,1),2)
cp=cp(1:(size(cp,1)-1)); end
cp=reshape(cp,size(cp,1)/2,2);
for j=1:size(cp,1)
a=cp(j,1); b=cp(j,2);
[endPop(a,:) endPop(b,:)] =
feval(xN,endPop(a,:),endPop(b,:),...
bounds,[gen xOverOps(i,:)]);
end
end
for i=1:numMuts
mN=deblank(mutFNs(i,:));
for
j=1:popSize
endPop(j,:)
= feval(mN,endPop(j,:),bounds,[gen mutOps(i,:)]);
eval(e1str);
end
end
end
gen=gen+1;
done=feval(termFN,[gen termOps],bPop,endPop); % Lihat apakah ga selesai
startPop=endPop; % Tukar populasi
[bval,bindx] = min(startPop(:,xZomeLength)); % Simpan solusi terbaik
startPop(bindx,:) = best; % ganti dengan yang terburuk
end
[bval,bindx] = max(startPop(:,xZomeLength));
if display
fprintf(1,'\n%d %f\n',gen,bval);
end
x=startPop(bindx,:);
if opts(2)==0 %binary
x=b2f(x,bounds,bits);
bPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)...
startPop(bindx,xZomeLength)];
else
bPop(bFoundIn,:)=[gen startPop(bindx,:)];
end
if collectTrace
traceInfo(gen,1)=gen; % generasi saat ini
traceInfo(gen,2)=startPop(bindx,xZomeLength);
%fittnes terbaik
traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %Avg fittness
end