Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Escribir los scripts que modifiquen la población P0 durante 100 iteraciones aplicando:
> Un operador de mutación en un solo bit con Pm = 10%.
> Un operador de inversión en 2 bits aleatorios con PI = 10%.
> Un tercer operador, diseñado por el usuario, a partir de un solo progenitor y un solo
descendiente, con una probabilidad Px = 10%.
Requerimientos:
Hacer un estudio por separado para cada operador. En todos los casos utilizar la misma
población aleatoria inicial.
Para cada aplicación de cada operador, y para mantener fija la cantidad de la población, se
elimina al progenitor. No hay control del individuo generado, que pasa directamente a la
siguiente población.
Determinar, en cada generación (iteraciones) y para cada operador:
Nota 1: se recomienda generar la población en una matriz de 50 x 10, para puede estar
contenida en un vector columna.
Nota 2: La función randi(Vmin,Vmáx,m,n) de Matlab® genera una matriz m n de valores
enteros aleatorios que se encuentran en el rango [Vmin , Vmáx]; ¡cuidar el signo!.
Nota 3: el mismo algoritmo/script podría usarse para todas las variantes, cambiando el
método de aplicación del operador.
Scripts
p0=randi([0,1],50,10)%poblacion inicial
Pobmut=p0;%poblacion mutada
cont=zeros(1,100);
cont_out=0;
cs=0;
for k=1:100
v=zeros(50,1);
Pmut=rand(50,1);
sprintf('iteracion n° %d',k)
cont_out=0;
cs=0;
for i=1:50
if Pmut(i)<=0.1
cont(k)=cont(k)+1;
j=randi([1,10],1,1);
Pobmut(i,j)=~Pobmut(i,j);
if j==1
cs=cs+1;
end
aux=Pobmut(i,2:10);
aux=num2str(aux);
if bin2dec(aux)>400
cont_out=cont_out+1;
end
sprintf('mutado bit %d de individuo %d con Pmut=%3.1f %%',j,i,Pmut(i)*100)
end
end
Y(k)=cont_out;% cantidad de ind. que salieron del espacio
Z(k)=cs;%numeros que cambiaron de signo
for m=1:50
if Pobmut(m,1)==1
v(m)=-1*bin2dec(num2str(Pobmut(m,2:10)));
else
v(m)=bin2dec(num2str(Pobmut(m,2:10)));
end
if v(m)>400 | v(m)<-400
v(m)=0;
end
end
maximos(k)=max(v);
minimos(k)=min(v);
promedio(k)=mean(v);
end
subplot(2,2,1);
bar(Y)
title('individuos que salen del espacio de datos')
subplot(2,2,2);
bar(Z)
title('individuos que cambian de signo')
X=linspace(1,100,100);
subplot(2,2,[3,4]);
plot(X,maximos,X,minimos,X,promedio)
axis ([0 100 -500 500])
disp('Población mutada despues de 100 iteraciones Pmut');
disp(Pobmut);
Scripts
p0=randi([0,1],50,10)%poblacion inicial
Pobmut=p0;%poblacion mutada
cont=zeros(1,100)
cont_out=0;
cs=0;
for k=1:100
valores=zeros(50,1);
Pmut=rand(50,1); %PROBABILIDAD DE CONJUNCION
sprintf('CONJUNCION EN ITERACION NUMERO %d',k)
cont_out=0;
cs=0;
for i=1:50
if Pmut(i)<=0.1
cont(k)=cont(k)+1; % individuos mutados en la gen K
p1=randi([1,10],1,1);
p2=randi([1,10],1,1);
p3=randi([1,10],1,1);
aux=and(Pobmut(i,p1),Pobmut(i,p2));
Pobmut(i,p3)=aux;
if p1==1 | p2==1
cs=cs+1;
end
aux=Pobmut(i,2:10);
aux=num2str(aux);
if bin2dec(aux)>400
cont_out=cont_out+1;
end
sprintf('conjuncion de bit %d operado con bit %d y bit %d de individuo %d con
Pmut=%3.1f %%',p3,p1,p2,i,Pmut(i)*100)
end
end
Y(k)=cont_out; %cantidad de ind. que salieron del espacio
Z(k)=cs; %de los individuos que cambiaron de signo
for m=1:50
if Pobmut(m,1)==1
valores(m)=-1*bin2dec(num2str(Pobmut(m,2:10)));
else
valores(m)=bin2dec(num2str(Pobmut(m,2:10)));
end
if valores(m)>400 | valores(m)<-400
valores(m)=0;
end
end
maximos(k)=max(valores);
minimos(k)=min(valores);
promedio(k)=mean(valores);
end
subplot(2,2,1);
bar(Y)
title('individuos que salen del espacio de datos')
subplot(2,2,2);
bar(Z)
title('individuos que cambian de signo')
X=linspace(1,100,100);
subplot(2,2,[3,4]);
plot(X,maximos,X,minimos,X,promedio)
axis ([0 100 -500 500])
disp('Población inicial P0');
disp(p0);
disp('Población mutada');
disp(Pobmut);
2. Estudio de operador
Considerar un espacio de datos sobre un plano X-Y, en el entorno
-5555 ≤ X,Y ≤ +5555
> Generar 25 iteraciones para cada variante del OG, partiendo en cada caso de la misma
población inicial.
> Utilizar para cada variante del OG de cruza, la selección aleatoria sobre toda la población,
generando 50 parejas en cada iteración.
> Para cada aplicación del OG de cruza aplicar una probabilidad de cruza monopunto entre
el 75% y el 95%, elegida por el usuario y que se mantendrá fija para todo el estudio y todas
las variantes. El punto de cruce debe cambiar aleatoriamente en cada iteración.
> Los individuos que salgan del espacio de datos, luego de cada aplicación del OG, deben
ser reemplazados por el progenitor que presente el menor valor absoluto.
Nota 1: se recomienda generar la población en una matriz de 100 x 10 para trabajar sin
perder información. Para trabajar con números completos, debe recordarse que el cero a la
izquierda (signo) no se preserva; en tal caso se puede redefinir el signo a la derecha.
Nota 2: la función randi(Vmin,Vmax,m,n) de Matlab® genera una matriz m n de valores
enteros aleatorios que se encuentran en el rango [Vmin , Vmax]; ¡cuidar el signo!.
Nota 3: el mismo algoritmo/script puede usarse para todas las variantes, cambiando el
método de cálculo de la cruza.
Creación de la población
Función
Función
Función
for i=1:m
%SI ES MAYOR A LA PROBABILIDAD ARROJADA SE CRUZA
if p(i)>= probabilidad
for j=1:n
maximo = max(x(i,j),y(i,j));
pm(i,j)= x(i,j)-y(i,j)+ maximo ;
end
%SI NO LO ES CONSERVA EL LOS ALELOS DEL PADRE
pm(i,:)=x(i,:);
else
end
end
end
Operador genético (OG) de cruza para cromosomas decimales por media geométrica
Función
Función
Función
for i=1:25
% SELECCION ALEATORIA POBLACION A MUTAR Y LA POBLACION NO
SELECCIONADA X
[selx,resultx] = seleccion_alet(x);
% SELECCION ALEATORIA POBLACION A MUTAR Y LA POBLACION NO
SELECCIONADA Y
[sely,resulty] = seleccion_alet(y);
% OPERADOR DE CRUZA POBLACION SELECCIONADA X y Y - PROBABILIDAD
mutados = cruza_ma(selx,sely,Pc);
% LOS MUTADOS SE INTEGRAN A LA POBLACION NO SELECCIONADA
resultx(51:100,:)= mutados;
resulty(51:100,:)= mutados;
% SE ELIMINA POBLACION GENERACION PASADA
x = resultx ;
y = resulty ;
end
Función
x = pobx ;
y = poby ;
for i=1:25
[selx,resultx] = seleccion_alet(x);
[sely,resulty] = seleccion_alet(y);
mutados = cruza_mg(selx,sely,Pc);
resultx(51:100,:)= mutados;
resulty(51:100,:)= mutados;
x = resultx ;
y = resulty ;
end
Función
for i=1:25
% SELECCION ALEATORIA POBLACION A MUTAR Y LA POBLACION NO
SELECCIONADA X
[selx,resultx] = seleccion_alet(x);
% SELECCION ALEATORIA POBLACION A MUTAR Y LA POBLACION NO
SELECCIONADA Y
[sely,resulty] = seleccion_alet(y);
% OPERADOR DE CRUZA POBLACION SELECCIONADA X y Y - PROBABILIDAD
mutados = cruza_ex(selx,sely,Pc);
% LOS MUTADOS SE INTEGRAN A LA POBLACION NO SELECCIONADA
resultx(51:100,:)= mutados;
resulty(51:100,:)= mutados;
% SE ELIMINA POBLACION GENERACION PASADA
x = resultx ;
y = resulty ;
end
> Graficar sobre un plano, por separado, la primera, intermedia y última generación.
Comentar al respecto.
En el gráfico de la primer generación se puede observar cómo los distintos individuos están
dispersos y a medida que se ha diversificado la población, cómo se observa en la
generación intermedia, los individuos están más próximos al valor (0 , 0) y más ordenados.
Esto a su vez es más notable en la última generación donde los puntos están más
concentrados .
> Emitir conclusiones respecto del funcionamiento de cada OG.
Debido a que los cromosomas con los que se trabajó en este problema son no binarios (es
decir decimales), se aplicó 3 variantes de operadores de cruza:
Media aritmética , que en este caso está representado por la función cruza_ma, y tiene la
característica de que a partir de dos progenitores se obtiene un descendiente.
Media geométrica: que se basa en el mismo funcionamiento del operador anterior pero en
vez de calcular el promedio entre los genes se calcula la raiz cuadrada.
Operador de cruza por extensión: en donde se restan cada uno de los genes de los
progenitores y a esa expresión se le suma el mayor.
En este problema los 3 operadores arrojaron resultados satisfactorios
x=linspace(-20,20,100)
y=fn_ajuste(x)
>> [x fval exitflag]=ga(@fn_ajuste,1)
x=
0.0044
fval =
1.0044
exitflag =
1
b) Escribir un script de Matlab, para encontrar el máximo de la función (B). Incluir allí
los parámetros que se estimen convenientes.
Scrips
x=linspace(-10,10,100);
>> y=((x.^2+x).*cos(x));
>> plot(x,y)
function funcionajuste_b()
op=gaoptimset;
op=gaoptimset(op,'CrossoverFcn',@crossoverheuristic);
op=gaoptimset(op,'CrossoverFraction',0.90);
op=gaoptimset(op,'CreationFcn',{'gacreationuniform'});
op=gaoptimset(op,'Display','off');
op=gaoptimset(op,'EliteCount',3);
op=gaoptimset(op,'Generations',100);
op=gaoptimset(op,'mutationFcn',@mutationuniform);
op=gaoptimset(op,'PopulationSize',30);
op=gaoptimset(op,'PopulationType','doubleVector');
op=gaoptimset(op,'PopInitRange',[-10;10]);
op=gaoptimset(op,'SelectionFcn',@selectiontournament);
op=gaoptimset(op,'Tolfun',1e-12);
[x,f_sal]=ga(@(x)(400-(x.^2+x).*cos(x)),1,op);
fprintf('x: %f\n',x);
fprintf('f_sal: %f\n',f_sal);
end
funcionajuste_b
x: 6.560540
f_sal: 352.294379
c) Con la ayuda del GUI optimtool de Matlab, encontrar el mínimo de la función (C)
x=linspace(0,10,100);
>> y=linspace(0,10,100);
function z = fn_ajuste_c(x)
z=x(1).*sin(4*x(1))+1.1*x(2).*sin(2*x(2));
end
4. Entrenamiento de red Neuronal
Aplicando Algoritmos Genéticos, entrenar la red neuronal feed-forward 2+2+1 (figura), para
realizar la operación XOR. Las funciones de salida de las neuronas ocultas son sigmoides
bivaluadas y para la neurona de salida es función escalón. Orientación: Las variables a
considerar serían los pesos. La función de salida puede ser reemplazada por otra durante el
entrenamiento. Como el proceso minimiza, se puede utilizar la función de error como
función de ajuste.
Scripts