clear
lines(0)
//exemple de LaBarre
L=4; //longueur d'un chromosome, i.e. que les entiers de 0 à 15 sont representes sur 4 bits
N1=3;N=2*N1; //taille de la population (nombre pair)
//grand("setsd",1)

function y=decode1(x)
    //donne la version decimale d'un entier represente par un vecteur de 0 et 1 en binaire
    s=strcat(string(x));
    y=bin2dec(s);
endfunction

ytest=decode1([1 0 1 1 0 1])




function Y=decode2(X)
    //fonction de decodage des entiers
    N=size(X,1);
    Y=zeros(N,1);
    for i=1:N
        Y(i)=decode1(X(i,:));
        //        s=strcat(string(X(i,:)));
        //       Y(i)=bin2dec(s);
    end
endfunction

function Y=decode(X)
    //fonction de decodage des entiers
    s=strcat(string(X),"","c");
    Y=bin2dec(s);
endfunction


function M=bitrandunif(N,L)
    //produit une matrice aleatoire Nxp de 0 ou 1 de distribution uniforme
    M=floor(2*rand(N,L));
endfunction
X=bitrandunif(N,L);//matrice Nxp de 0 ou 1 (population initiale)

Y=decode(X)

//fonction à maximiser (mesure de qualité, fonction POSITIVE)
function y=f(x)
    y=0.25*abs(15*x.^2-x.^3)+4;
    //y=((-2+x*4/15).^2-1).^2+4;
endfunction

//

function i=selectionne(P)
    u=rand(1,1);
    q=[0,cumsum(P')];
    i=max(find(u>q));
endfunction

Ngenerationmax=100;
for Ngeneration=1:Ngenerationmax
    Q=f(decode(X));//qualité de chaque individu
    Qmean=mean(Q);//qualité moyenne de la population
    P=Q/sum(Q);//chances de reproduction
   // Pourcentages=P*100;
    Xnew=[];
    //selection des couples (hermaphrodites...)
    for k=1:N1
        parent1=selectionne(P);
        parent2=selectionne(P);
        Xnew=[Xnew ; X(parent1,:)];
        Xnew=[Xnew ; X(parent2,:)];
    end
    //enjambement
    for k=1:N1
        for j=1:L
            if bitrandunif(1,1)==1 then
                aux=Xnew(2*k,j);
                Xnew(2*k,j)=Xnew(2*k-1,j);
                Xnew(2*k-1,j)=aux;
            end          
        end
    end
    //mutation
    pmut=0.03;//probabilite de mutation
    for i=1:N
        for j=1:L
            if selectionne([pmut 1-pmut]')==1 then
                Xnew(i,j)=bool2s(~Xnew(i,j));
            end
        end
    end
    X=Xnew;
end
//Valeurs finales apres Ngenerationmax
X
Y=decode(X)
Qmean=mean(f(Y))

