function y=f(x)
    y=n+sum(x.^2-cos(2*%pi*x));
endfunction
////////parametres/////////////////
Npop=40;
Ngen=20;
n=2;
CR=0.2// 
F=0.8// 
////////////////////////////////////
//
A=zeros(Npop,n+1); // matrice de population 
//
A=10*rand(Npop,n+1)-5*ones(Npop,n+1);
//
//evaluation
y=[];
for j=1:Npop
    y(j)=f(A(j,1:n));
end  
A(:,n+1)=y; 
bestpop=[];
/////////////////////////////////////////////
for i=1:Ngen     
//
[u,v]=gsort(A(:,n+1));
A=A(v,:); // rangement du plus mauvais au meilleur
disp('meilleur element'),disp(A(Npop,1:n))
disp('meilleure valeur'),disp(A(Npop,n+1))
bestpop=[bestpop;A(Npop,n+1)];
//
  for k=1:Npop
    i1=1;i2=1;i3=1;
    while (i1==i2)| (i1==i3)|(i2==i3)| (i1==k)| (i2==k)| (i3==k)
     i1=int(Npop*rand())+1;
     i2=int(Npop*rand())+1;
     i3=int(Npop*rand())+1;
    end  
    a=A(i1,1:n);b=A(i2,1:n);c=A(i3,1:n);x=A(k,1:n);
    j0=int(n*rand())+1;
    y=[];
    for j=1:n
     if (rand()<CR)| (j==j0)
       y(j)=a(j)+F*(b(j)-c(j)) 
     else
       y(j)=x(j) 
     end
     val1=f(y);val2=f(x);
     if (val1<val2) then
       A(k,1:n)=y';A(k,n+1)=val2;   
     end
    end
  end
end
clf()
plot2d(Npop*(1:Ngen),bestpop)
