Baixe o app para aproveitar ainda mais
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);
Compartilhar