from Calculating Minimun value on Function Genetic Algorithms by Daniel
Calculus of function min value

Solo_F1.m
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)

Contact us