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