Bonsoir,
Dans le cas de mon travail, je dois élaborer un algorithme génétique pour optimiser la masse d'un pont en treillis métallique.
Pour cela, je crée de manière presque aléatoire des chromosomes ayant deux gènes. L'un de ces gènes possède les coordonnées de tous les nœuds du pont. Or initialement, les coordonnées de ces nœuds sont des réels. J'ai donc effectué un code pour coder ces réels en binaire pour ensuite remplir mon chromosome.
voilà mon programme en scilab:
je pense que mon code n'est pas trop faux. Cependant, pour connaître le nombre de bits minimum occupé par un réel x appartenant à l'intervalle[a,b] est: l>=log(b-a)/e) avec e la précision souhaitée.Code://code en binaire la partie réelle d'un nombre réel. a=10.8;//nombre réel à coder. X=[]; b=abs(fix(a));// je prends la valeur absolue de a. i=1; q=1; while q<>0 & b<>0 q=fix(b/2);// q= quotient r=pmodulo(b,2);//r=reste X(1,i)=r; b=q; i=i+1; end m=size(X,"c");//renvoi le nombre de colonne de X. X_arrangée=zeros(1,m); for i=1:1:m// Je remets dans l'ordre la matrice X. X_arrangée(1,i)=X(1,m+1-i); end if a>=0//Je rajoute un bit=0 si a<0 et 1 si a>0. X_arrangée=[zeros(1,1),X_arrangée]; else X_arrangée=[ones(1,1),[X_arrangée]]; end // //code la partie décimale d'un nombre réel. d=abs(a-fix(a));//je récupère la partie décimale de a. e=2*d; j=1; J=[]; Eps=10^-2; while e>Eps if e<1 J(1,j)=0; e=2*e; elseif e>=1 J(1,j)=1; e=e-1; end j=j+1; end X_concaténée=[X_arrangée,J];// j'ajoute à la partie réelle de a la partie décimale. disp(X_concaténée,'X_concaténée')
Donc si je prends in intervalle I=[-2,2] et que je veux coder x=1.82 avec une precision de 10-2 alors il faudra réserver l=9 bits pour coder 1.82 en binaire.
Malheureusement, mon programme me renvoi pour le codage de 1.82:
soit l=82 et non pas 9!!!!Code:X_concaténée column 1 to 14 0. 1. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0. 1. 0. column 15 to 28 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 0. column 29 to 42 1. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 0. column 43 to 56 1. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. column 57 to 70 1. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. column 71 to 81 0. 0. 1. 0. 1. 0. 1. 0. 1. 0. 1.
Vous avez un peu des idées sur ce qui ce passe?
merci de votre aide.
Cdt
-----