Você está na página 1de 2

%------------------------------------------------------------------------- bolsilloIndividuos2(:,:)=INDIVIDUOS(:,:,oo);

% ALGORITMO GENÉTICO % mejorFitness2=fitness(oo);


%-------------------------------------------------------------------------
clear all %Muestro los padres
clc PADRE1Original=mejorFitness
%------------------------------------------------------------------------- PADRE2Original=mejorFitness2
% GENERACIÓN DE LA PRIMERA POBLACIÓN (100 INDIVIDUOS)
%-------------------------------------------------------------------------
PADRE1=zeros(49,7);
PADRE2=zeros(49,7);
numiteraciones=100; %Número de iteraciones FitnessPadre1=0;
numIndiv=100;
filasOR= eye(7);
%--------------------------------------------------------------------------
% Reproduccion sexual
% creo un individuo a partir de la asignación de los vectores identidad %--------------------------------------------------------------------------
% a una matriz de 7 columnas 49 filas de forma aleatoria usando
% permutaciones de numeros entre el 0 y el 7. Los individuos se guardan en PADRE2=bolsilloIndividuos2;
% una matriz tridimensional de profundidad 100. PADRE1=bolsilloIndividuos1(:,:,1);

INDIVIDUOS=zeros(49,7,100); for it=1:numiteraciones


INDIV=zeros(49,7);
viabilidad=sum(INDIV);
FitnessPadre1=PADRE1Original;
for i=1:numIndiv
%inicializo las variables alelos: partes que se van a combinar de cada
%padre (Parto cada uno de los padres en porciones de 25/24 alelos) y
for f=1:1:49 %recorro filas %nuevopadre que representan los productos de la reproducción sexual
a=randperm(7);
numfila=a(1);
% Inicializo las variables de las Partes del padre 1 (mejor Fitness)
alelo1padre1=zeros(25,7);
num1=filasOR(numfila,1); alelo2padre1=zeros(24,7);
num2=filasOR(numfila,2);
num3=filasOR(numfila,3);
num4=filasOR(numfila,4); % Inicializo las variables de las partes del padre 2 (segundo mejor fitness)
num5=filasOR(numfila,5); alelo1padre2=zeros(25,7);
num6=filasOR(numfila,6); alelo2padre2=zeros(24,7);
num7=filasOR(numfila,7);
nuevopadre1=zeros(49,7);
fila=[num1, num2, num3, num4, num5, num6, num7]; nuevopadre2=zeros(49,7);

for c=1:7 %recorro columnas % Defino los 4 alelos de los padres


INDIV(f,c)=fila(c); for filaspadres=1:25 %recorro los padres para partir y hallar alelos1
end alelo1padre1(filaspadres,:)=PADRE1(filaspadres,:);
end alelo1padre2(filaspadres,:)=PADRE2(filaspadres,:);
end
INDIVIDUOS(:,:,i)=INDIV;
end w=1;

%------------------------------------------------------------------------- for filaspadres2=26:49 %recorro los padres para partir y hallar alelos2
% SE EMPIEZA EL ALGORITMO alelo2padre1(w,:)=PADRE1(filaspadres2,:);
%------------------------------------------------------------------------- alelo2padre2(w,:)=PADRE2(filaspadres2,:);
w=w+1;
end
% Evaluo el fitness de cada uno de los individuos
pesos=[122 177 135 199 178 121 183 101 115 117 160 107 198 170 176 193 143 176
119 107 104 135 120 175 183 166 156 165 126 152 156 107 192 150 167 187 128 % Se hace la reproducción sexual
110 150 167 185 153 119 101 192 156 194 188 177]; % HIJO 1
fitness=zeros(1,100); for filpadrep11=1:25
ftnss=zeros(49,7); nuevopadre1(filpadrep11,:)=alelo1padre1(filpadrep11,:);
end
%Creo dos bolsillos, uno en donde guardo los mejores fitness y el otro
%donde guardo el contenido del elemento w2=1;

bolsilloIndividuos1=zeros(49,7,numiteraciones); for filpadrep12=26:49


nuevopadre1(filpadrep12,:)=alelo2padre2(w2,:);
w2=w2+1;
bolsilloIndividuos2=zeros(49,7); end

MejoresFitness=zeros(1,numiteraciones); % HIJO 2
BolsilloGeneraciones1=zeros(49,7,numiteraciones); for filpadrep21=1:25
BolsilloGeneraciones2=zeros(49,7,numiteraciones); nuevopadre2(filpadrep21,:)=alelo1padre2(filpadrep21,:);
end
%----------------------Hallando el fitness--------------------------------
w3=1;
for fit=1:100 %recorro la posicion z del arreglo de individuos
for h=1:49 for filpadrep22=26:49
evalftnss=pesos(h)*INDIVIDUOS(h,:,fit); nuevopadre2(filpadrep22,:)=alelo2padre1(w3,:);
ftnss(h,:)=evalftnss; w3=w3+1;
end end
sumaftnss=sum(ftnss);
fitness(fit)=max(sumaftnss); %para los 100 individuos me da un fitness
end %---------------------Fitness de los nuevos hijos--------------------------
%--------------------------Fitness del Hijo 1------------------------------
%La poblacion inicial tiene solo 100 individuos, pero se pueden hacer
%muchas iteraciones acumulando así tantos fitness como queramos ftnssh1=zeros(49,7);
for h1=1:49
evalftnssh1=pesos(h1)*nuevopadre1(h1,:);
mejorFitness=min(fitness); %Mejor fitness poblacion inicial ftnssh1(h1,:)=evalftnssh1;
end
%-----------------------------Bolsillo------------------------------------ sumaftnssh1=sum(ftnssh1);
% Guardo los dos mejores individuos en el bolsillo teniendo los padres fitnessh1=max(sumaftnssh1); %Fitness del nuevo individuo 1
k=1;
%--------------------------Fitness del Hijo 2------------------------------
for bol=1:100
if fitness(bol)== mejorFitness ftnssh2=zeros(49,7);
bolsilloNumeroElementoFitness1=bol; for h2=1:49
end evalftnssh2=pesos(h2)*nuevopadre2(h2,:);
end ftnssh2(h2,:)=evalftnssh2;
bolsilloIndividuos1(:,:,1)=INDIVIDUOS(:,:,bolsilloNumeroElementoFitness1); end
sumaftnssh2=sum(ftnssh2);
MejoresFitness(1)=mejorFitness; %Guardo los mejores fitness fitnessh2=max(sumaftnssh2); %Fitness del nuevo individuo 2
o=randperm(100);
oo=o(50);
FIndividuoArio=min(MejoresFitness)
% Evalúo cual de los dos hijos es mejor
% Ubico la posición del mejor individuo de toda la evolución
if fitnessh1<fitnessh2
fitnessmejorhijo=fitnessh1; for t=1:numiteraciones
MejorHijo=nuevopadre1; if MejoresFitness(t)==FIndividuoArio
end PosicionIndividuoArio=t;
if fitnessh1>=fitnessh2 end
fitnessmejorhijo=fitnessh2; end
MejorHijo=nuevopadre2;
end %-------------------------------------------------------------------------%
% GRAFICA DE DESEMPEÑO %
%-------------------------------------------------------------------------% %-------------------------------------------------------------------------%
% ACTUALIZACIÓN DE BOLSILLOS %
%-------------------------------------------------------------------------% % Gráfica de desempeño del algoritmo
max=max(MejoresFitness);
% Guardo en el bolsillo el mejor individuo de esta generación y su fitness figure
bar(MejoresFitness,0.001,'k')
bolsilloIndividuos1(:,:,it+1)=MejorHijo; ylim([FIndividuoArio max])
MejoresFitness(it+1)=fitnessmejorhijo; xlim([0 numiteraciones])

%Creo un bolsillo donde se guardan todos los pares de padres que se tienen % Gráfica de los fitness de la población inicial
l=it+1; figure
bar(fitness,'r')
ylim([PADRE1Original 2500])
BolsilloGeneraciones1(:,:,l)=PADRE1; xlim([0 100])
BolsilloGeneraciones2(:,:,l)=PADRE2;
PosicionIndividuoArio
% Asigno los nuevos padres de los que se volverá a sacar una nueva
% generación
% ¿Quien tiene el mejor fitness entre padre1 y MejorHijo? Asigno nuevo IndividuoArio=bolsilloIndividuos1(:,:,PosicionIndividuoArio);
% PADRE1
%-------------------------------------------------------------------------%
if fitnessmejorhijo < FitnessPadre1 % Guardo los abuelos %
PADRE1=MejorHijo; %-------------------------------------------------------------------------%
end
abuelo11 = BolsilloGeneraciones1(:,:,PosicionIndividuoArio);
if fitnessmejorhijo > FitnessPadre1 abuelo12 = BolsilloGeneraciones1(:,:,PosicionIndividuoArio-1);
PADRE1=PADRE1; abuelo13 = BolsilloGeneraciones1(:,:,PosicionIndividuoArio-2);
end abuelo14 = BolsilloGeneraciones1(:,:,PosicionIndividuoArio-3);
abuelo15 = BolsilloGeneraciones1(:,:,PosicionIndividuoArio-4);
% Asigno PADRE2 --> individuo al azar de la población inicial
abuelo21 = BolsilloGeneraciones2(:,:,PosicionIndividuoArio);
abuelo22 = BolsilloGeneraciones2(:,:,PosicionIndividuoArio-1);
pad2=randperm(100); abuelo23 = BolsilloGeneraciones2(:,:,PosicionIndividuoArio-2);
PADRE2=INDIVIDUOS(:,:,pad2(60)); abuelo24 = BolsilloGeneraciones2(:,:,PosicionIndividuoArio-3);
abuelo25 = BolsilloGeneraciones2(:,:,PosicionIndividuoArio-4);
%---------------------------------------------------------------------%
% MUTACIÓN % %-------------------------------------------------------------------------%
%---------------------------------------------------------------------% % ¿Hago informe? %
%-------------------------------------------------------------------------%
% Con cierta probabilidad se realiza una mutacion aleatoria en el PADRE1
if FIndividuoArio <= 1080
if(mod(it,2)~=0) % Ver modulo de numero base 2 display('Perfecto');
mutaleat=randperm(100); else
mut=mutaleat(2); display('Muy mal');
PADRE1(2,:)=INDIVIDUOS(49,:,mut); end
end

Você também pode gostar