clear;
clc;
rand('seed',sum(100*clock)); %#ok<RAND>
graf=input('Desea Visualizar la funcion a optimizar? Si->1 No->0: ');
if graf==1
funcion=1;
graficas(funcion);
end
if graf==0
disp('Decidio no graficar, se Continua con el Algoritmo');
end
%% Solo Funcion F1;
corridas=input('Cuantas corridas desea hacer (iter)-Recomendado 1~10-: ');
n=input('Ingrese el tamano deseado de la poblacion: ');
pc=input('Ingrese la Probabilidad de Cruce (Pc)-Recomendado 0.5~1-: ');
pm=input('Ingrese la Probabilidad de Mutacion (Pm)-Recomendado 0~0.02-: ');
G=input('Ingrese el Numero de Generaciones (G)-Recomendado 20~100-: ');
nlong=input('Cual es la precision deseada? [0.00000... ~10^-n]: ');
xvar=input('Desea cambiar los limites de las variables?: Si->1, No->0: ');
%% Limites de Variables
if xvar==0 %#ok<ALIGN>
ai=-10;
aj=10;
bi=-10;
bj=10;
A=ai:0.01:aj;
B=bi:0.01:bj;
zmax=A.^2 + 2.*B.^2 - 0.3*cos(3.*pi.*A) - 0.4*cos(4.*pi.*B) + 0.7;
zmax=max(zmax);
zmax=zmax+1;
else
ai=input('ingrese el limite inferior de la variable 1 a tratar: ');
aj=input('ingrese el limite superior de la variable 1 a tratar: ');
bi=input('ingrese el limite inferior de la variable 2 a tratar: ');
bj=input('ingrese el limite superior de la variable 2 a tratar: ');
A=ai:0.01:aj;
B=bi:0.01:bj;
zmax=A.^2 + 2.*B.^2 - 0.3*cos(3.*pi.*A) - 0.4*cos(4.*pi.*B) + 0.7;
zmax=max(zmax);
zmax=zmax+1;
end
mejorfenotipoiter=zeros(corridas,1);
iteraciones=zeros(corridas,1);
mejorz=zeros(corridas,2);
xvar=zeros(G,1);
yvar=zeros(G,1);
zvar=zeros(G,1);
for iter=1:corridas
grafica1=zeros(G,1);
grafica2=zeros(G,1);
grafica3=zeros(G,1);
mejorfit=zeros(G,1);
mediofit=zeros(G,1);
ma=ceil(log(((aj-ai)*(10.^nlong))+1)./log(2));
mb=ceil(log(((bj-bi)*(10.^nlong))+1)./log(2));
cromo=ma+mb;
padres=zeros(n,cromo);
indnumero=zeros(n,1);
for i=1:n
for jp=1:cromo
padres(i,jp)=round(rand);
end
indnumero(i,1)=i;
end
%% Generaciones
for generaciones=1:G
%% Creacion del Fitnes Inicial
fitness=zeros(n,1);
fenotipo=zeros(n,1);
padresa=zeros(n,ma);
padresb=zeros(n,mb);
for i=1:n %#ok<ALIGN>
for ja=1:ma
padresa(i,ja)=padres(i,ja);
end
for jb=1:mb
padresb(i,jb)=padres(i,ma+jb);
end
end
for i=1:n %#ok<ALIGN>
cromopoba=padresa(i,:);
cromopobb=padresb(i,:);
decsuba=bin2dec(sprintf('%-1d',cromopoba));
decsubb=bin2dec(sprintf('%-1d',cromopobb));
aii=ai+(decsuba.*((aj-ai)./((2.^ma)-1)));
bii=bi+(decsubb.*((bj-bi)./((2.^mb)-1)));
fenotipo(i,1)=aii.^2 + 2.*bii.^2 - 0.3*cos(3.*pi.*aii) - 0.4*cos(4.*pi.*bii) + 0.7;
fitness(i,1)=1./(zmax+fenotipo(i,1));
end
%% Ruleta
%---------------seleccion de los padres por ruleta------------------------
PC=sum(fitness);
f=PC./n;
acumpc=fitness;
probseleccion=fitness;
numcopias=fitness;
pobfit=[padres probseleccion numcopias acumpc fitness];
[~,v]=size(pobfit);
pobord=pobfit;
pobord=sortrows(pobord,-v);
for i=1:n
pobord(i,v-3)=pobord(i,v)./PC;
pobord(i,v-2)=pobord(i,v)./f;
end
pobord(:,v-1)=cumsum(pobord(:,v-2));
padres=pobord;
for i=1:n %#ok<ALIGN>
probselec=rand*n;
j=1;
while probselec>pobord(j,v-1)
j=j+1;
end
padres(i,:)=pobord(j,:);
end
%% Cruce Y Mutacion
[~,vp]=size(padres);
padres(:,vp)=[];
[~,vp]=size(padres);
padres(:,vp)=[];
[~,vp]=size(padres);
padres(:,vp)=[];
[~,vp]=size(padres);
padres(:,vp)=[];
[~,vp]=size(padres);
cruce=0;
%while que entra a todo el cruce, hasta que sea el ind 99
i=1;
while i<=n-1 %#ok<ALIGN>
pcruce=rand;
%% Cruce
if pcruce<pc
mask1=zeros(1,vp);
a=round(rand*vp);
padrea=padres(i,:);
padreb=padres(i+1,:);
%---------------------------------que el cruce no sea en los extremos
if a==vp
a=vp-1;
else
if a==0
a=a+1;
end
end
for j=1:a
mask1(1,j)=1;
end
mask2=~mask1;
%---------------------------------------------------------------------
padreama1=and(padrea,mask1);
padrebma1=and(padreb,mask2);
padreama2=and(padrea,mask2);
padrebma2=and(padreb,mask1);
padres(i,:)=or(padreama1,padrebma1);
padres(i+1,:)=or(padreama2,padrebma2);
%-----------------------------------------------------cuenta del cruce
cruce=cruce+1;
%% Mutacion
%--------------------------------------------------------------Mutamos
nbits=round(rand*vp); %Cantidad de bits a mutar
padresmut=padres;
padresmut(i,:)=padres(i,:);
padresmut(i+1,:)=padres(i+1,:);
for imut=1:nbits %#ok<ALIGN>
pmut=rand/10;
if pmut<pm %#ok<ALIGN>
p=round(rand*vp);
if p==0
p=1;
end
if p==vp
p=vp-1;
end
padresmut(i,p)=~padres(i,p);
padresmut(i+1,p)=~padres(i+1,p);
end
end
padres(i,:)=padresmut(i,:);
padres(i+1,:)=padresmut(i+1,:);
else
padres(i,:)=padres(i,:);
padres(i+1,:)=padres(i+1,:);
end
i=i+2;
end
%% Evaluacion Final
for i=1:n
for ja=1:ma
padresa(i,ja)=padres(i,ja);
end
for jb=1:mb
padresb(i,jb)=padres(i,jb+ma);
end
end
for i=1:n
cromopoba=padresa(i,:);
cromopobb=padresb(i,:);
decsuba=bin2dec(sprintf('%-1d',cromopoba));
decsubb=bin2dec(sprintf('%-1d',cromopobb));
aii=ai+(decsuba.*((aj-ai)./((2.^ma)-1)));
bii=bi+(decsubb.*((bj-bi)./((2.^mb)-1)));
fenotipo(i,1)=aii.^2 + 2.*bii.^2 - 0.3*cos(3.*pi.*aii) - 0.4*cos(4.*pi.*bii) + 0.7; %valores del fenotipo
fitness(i,1)=1./(zmax+fenotipo(i,1));
end
[fenotipofin]=fenotipo;
[fitnessfin]=fitness;
%% Graficas
medio=mean(fenotipofin);
mejor=min(fenotipofin);
grafica1(generaciones,1)=generaciones;
grafica2(generaciones,1)=mejor;
grafica3(generaciones,1)=medio;
mejorfit(generaciones,1)=max(fitness);
mediofit(generaciones,1)=mean(fitness);
end
figure(iter);
subplot(1,2,1);
plot(grafica1,grafica2,'b-');
title('Generaciones vs Mejor Individuo');
subplot(1,2,2);
plot(grafica1,grafica3,'r-');
title('Generaciones vs Promedio');
figure(iter+50)
subplot(1,2,1);
plot(grafica1,mejorfit,'b-');
title('Generaciones vs Mejor Fitness');
subplot(1,2,2);
plot(grafica1,mediofit,'r-');
title('Generaciones vs Fitness Promedio');
mejorfenotipoiter(iter,1)=min(grafica2);
iteraciones(iter,1)=iter;
mejorz(iter,1)=iter;
mejorz(iter,2)=mejorfenotipoiter(iter,1);
end
figure(iter+20);
plot(iteraciones,mejorfenotipoiter,'ko:');
title('Mejor Individuo por Cada Corrida de los Mejores por Generacion');
clc;
disp('Mejores valores por Iteracion=[Iter Z]');
disp(mejorz);
disp('Recordar que en esta Funcion el Fitnes Varia entre fit=[1/(zmax+fenotipo+1)]:1/(zmax+1)]');
disp('Para el caso en estudio: ');
obsmin=1/(2*(zmax-1));
obsmax=1/zmax;
sprintf('El peor y mejor valor de fitness, respectivamente, son: %0.2e y %0.2e',obsmin,obsmax)