////////////////////////////////////////
// The historical GA
// /////////////////////////////////////
//
Npop=100;   
L=30;       
Ngen=30;  
pc=0.6;   
pm=0.02;    
// 
//cost function
//
function y=J(x)
  y=sum(x)  
endfunction  
/////////////////////////////////////////////
// 
A=int(2*rand(Npop,L+1));
//
//
//////////////////////////////////////////////
//
for i=1:Ngen
//
// evaluation
//
  for j=1:Npop
    A(j,L+1)=J(A(j,1:L));
  end  
//
//
//////////////////////////////////////////
//
// rank selection (creation of the mating pool)
//
//
[s,p]=gsort(A(:,L+1));
A=A(p,:);
//
Asel=[];
p=(1:Npop)/sum(1:Npop);ps=cumsum(p);
for i=1:Npop
  u=rand();isel=1;
  while (u>ps(isel)) 
     isel=isel+1;
  end
Asel=[Asel;A(isel,:)];
end  
///////////////////////////////////////////////
// crossover
//
Acros=Asel;
//
for k=1:Npop/2
  //
  u1=int(Npop*rand())+1;
  u2=int(Npop*rand())+1;
  cut=int((L-1)*rand())+1;
  Acros(2*k-1,:)=Asel(u1,:);
  Acros(2*k,:)=Asel(u2,:);  
  if (rand()<pc) then
  Acros(2*k-1,cut+1:L)=Asel(u2,cut+1:L);
  Acros(2*k,1:cut)=Asel(u1,1:cut);
 end 
end
//////////////////////////////////////////////////
// mutation 
//
Amut=Acros;
for i=1:Npop
  for j=1:L
    if (rand()<pm) then
      Amut(i,j)=1-Amut(i,j);
    end
  end 
end
A=Amut;
//
end
/////////////////////////////////////////////
// Results display
//
  for j=1:Npop
    A(j,L+1)=J(A(j,1:L));
  end  
//
[s,p]=gsort(A(:,L+1));
A=A(p,:);
disp('best element'); disp(A(Npop,1:L))