Buscar

Algoritimo Genetico

Prévia do material em texto

0001 //Algoritimo Genético 27/05/2015
0002 //Daniel de Lucena Flor
0003 
0004 clear;
0005 //START:Inicizaliza randomicamente matriz de binarios
0006 //com "m" partículas de "n" bits;
0001 function v=start(m, n) 
0002 for i=1:m
0003 for j=1:n 
0004 v(i,j)=round(rand());
0005 end
0006 end
0007 endfunction
0014 
0015 //B2D:Decodificação do valor em binário;
0001 function d=b2d(v, xmax, xmin, n)
0002 k=(xmax-xmin)/(2^n);
0003 a=0;
0004 for i=1:n
0005 a=a+v(i)*2^(n-i); 
0006 end
0007 d=xmin+a*k;
0008 endfunction
0024 
0025 //ROLETA:Utilizando o vetor de chances criado na função SORTE, sorteia uma
0026 //partícula para o cruzamento com base em sua aptidão;
0001 function [v]=roleta(m, chance)
0002 r1=rand();
0003 soma=0;
0004 for i=1:m
0005 soma=soma+chance(i);
0006 if r1 < soma then
0007 v=i;
0008 break;
0009 end
0010 end
0011 endfunction
0038 
0039 //SORTE:Normaliza a função no ponto de pior aptidão (maior valor)
0040 //e cria vetor de chances com base nas aptidiões de cada partícula;
0001 function v=sorte(apt, m, pior)
0002 soma=0;
0003 x=apt;
0004 for i=1:m
0005 x(i)=x(i) - pior-1;
0006 soma=soma + x(i);
0007 end
0008 
0009 for i=1:m
0010 v(i)=x(i)/soma
0011 end
0012 endfunction
0053 
0054 //APTIDAO:Avalia aptidão das posições fornecidas;
0001 function valor=aptidao(x, y)
0002 z=-x.*sin(sqrt(abs(x)))-y.*sin(sqrt(abs(y)));
0003 x=x/250;
0004 y=y/250;
0005 r=100*(y-x.^2).^2+(1-x).^2;
0006 r1=(y-x.^2).^2+(1-x).^2;
0007 r1=r1+1;
0008 
0009 w4=sqrt(r.^2+z.^2);
0010 w26=-w4./r1;
0011 w22=(x-y).*z;
0012 valor=w22+w26;
0013 endfunction
0068 
0069 //MUTACAO:Aplica uma mutação(inversão) em cada bit do individuo "v", para
0070 //os "n" bits com chance "t"; 
0001 function x=mutacao(v, n, t)
0002 for i=1:n
0003 a=rand();
0004 if a <= t then
0005 if v(i)==0 then
0006 x(i)=1;
0007 else
0008 x(i)=0;
0009 end
0010 else
0011 x(i)=v(i);
0012 end 
0013 end
0014 x=x';
0015 endfunction
0086 
0087 //CROSSOVER:Realiza o crossover (cruzamento) entre os indivíduos "v" e "w"
0001 function [a, b]=crossover(v, w, n)
0002 l=round((n-1)*rand())+1;
0003 
0004 for i=1:l
0005 aux=v(i);
0006 v(i)=w(i);
0007 w(i)=aux;
0008 end
0009 b=v;
0010 a=w;
0011 endfunction
0099 
0100 it=100; //Iteração;
0101 taxamut=0.004; //Taxa de mutação;
0102 taxacro=0.8; //Taxa de crossover;
0103 m=30; //Numero de cromossomos (população);
0104 n=30; //Numero de bits;
0105 
0106 popx= start(m,n); //Inicializa as populações;
0107 popy= start(m,n);
0108 filhox=zeros(m,n); //Inicializa os filhos;
0109 filhoy=zeros(m,n);
0110 
0111 for k=1:it //Início das iterações;
0112 
0113 for i=1:m //Decodifica a população, avalia
0114 //sua aptidão e a salva no vetor 
0115 x=b2d(popx(i,:),500,-500,n); //"apt";
0116 y=b2d(popy(i,:),500,-500,n);
0117 
0118 apt(i)=aptidao(x,y);
0119 
0120 end
0121 
0122 piorapt=max(apt); //Acha a pior aptidao e 
0123 vetorchance=sorte(apt,m,piorapt); //calcula o vetor de chances;
0124 
0125 for i=1:2:m 
0126 pai=roleta(m,vetorchance); //Sorteia o pai e a mae para o cruzamento;
0127 mae=roleta(m,vetorchance);
0128 
0129 if rand()<=taxacro then //Testa se haverá ou não crossover;
0130 [filhox(i,:),filhox(i+1,:)]=crossover(popx(pai,:),popx(mae,:),n);
0131 [filhoy(i,:),filhoy(i+1,:)]=crossover(popy(pai,:),popy(mae,:),n);
0132 else //Caso não haja, clona os pais;
0133 filhox(i,:)=popx(i,:);
0134 filhox(i+1,:)=popx(i+1,:);
0135 filhoy(i,:)=popy(i,:);
0136 filhoy(i+1,:)=popy(i+1,:);
0137 end
0138 
0139 end
0140 
0141 for i=1:m //Aplica a mutação sobre os filhos;
0142 filhox(i,:)=mutacao(filhox(i,:),n,taxamut);
0143 filhoy(i,:)=mutacao(filhoy(i,:),n,taxamut);
0144 end
0145 
0146 popx=filhox; //Atualiza a próxima geração;
0147 popy=filhoy;
0148 end
0149 
0150 for i=1:m //Decodifica os valores para a exibição
0151 x(i)=b2d(popx(i,:),500,-500,n);
0152 y(i)=b2d(popy(i,:),500,-500,n);
0153 z(i)=aptidao(x(i),y(i)); 
0154 end
0155 
0156 disp('X:')
0157 disp(x);
0158 disp('Y:')
0159 disp(y);
0160 disp('Z:')
0161 disp(z);

Continue navegando