Encuentra los parámetros
Contents
- Definición del problema
- Parámetros iniciales
- Población inicial
- Iteraciones
- Orden aleatorio de parejas
- Cruza
- Mutacion
- Cálculo de la aptitud (o viabilidad)
- Seleccion
- Resultados
Definición del problema
Se genera un conjunto de datos sintéticos
x=linspace(1,100); % dominio de 1 a 100
y=rand(1,100); % números aleatorios en el intervalo de 0 a 1
Parámetros iniciales
Se configua el Algoritmo definiendo parámetros análogos en la Genética
generaciones = 800; % iteraciones del algoritmo
n = 200; % tamaño de la población de soluciones
probabilidad = 0.6; % probabilidad de que cada gen mute
mutacion = [1 1]; % máximo valor que puede mutar
Población inicial
Se genera aleatoriamente una población inicial de posibles soluciones. La primer columna representa el gen que define la pendiente
poblacion = rand(n,2);
Iteraciones
La población de soluciones evoluciona mediante la cruza y mutación
s = n;
hw = waitbar(0,'Evolucionando...');
for i = 1:generaciones
Orden aleatorio de parejas
poblacion(:,3) = rand(s,1);
poblacion = sortrows(poblacion,+3);
Cruza
poblacion=[poblacion; poblacion(1:2:end-1,1) poblacion(2:2:end,2) zeros(fix(s/2),1); poblacion(2:2:end,1) poblacion(1:2:end-1,2) zeros(fix(s/2),1)];
Mutacion
s = size(poblacion,1);
poblacion=[poblacion; poblacion+[(rand(s,3)<probabilidad).*(rand(s,3)*2-1).*repmat([mutacion 0],s,1)]];
Cálculo de la aptitud (o viabilidad)
La tercer columna de poblacion representa la aptitud (viabilidad) de la solución, menor es mejor.
s = size(poblacion,1);
m = repmat(poblacion(:,1),1,100);
b = repmat(poblacion(:,2),1,100);
X = repmat(x,s,1);
Y = repmat(y,s,1);
Y2=m.*X+b;
poblacion(:,3)=sum(abs(Y-Y2),2);
Seleccion
poblacion = unique(poblacion,'rows');
poblacion = sortrows(poblacion,+3);
s = min([size(poblacion,1),n]);
poblacion = poblacion(1:s,:);
waitbar(i/generaciones,hw)
end
close(hw)
Resultados
Se compara el resultado obtenido con AG contra el obtenido con mínimos cuadrados
error_ag = poblacion(1,3);
p = polyfit(x,y,1);
y3 = polyval(p,x);
error_mc = sum(abs(y3-y));
plot(x,y,'.',x,polyval(poblacion(1,1:2),x),x,y3,':')
axis([0 100 -0.5 1.5])
legend('Datos Sintéticos','Algoritmos Genéticos (AG)','Mínimos Cuadrados (MC)')
text(1,-.167,['AG: Error = ' num2str(error_ag) ', m = ' num2str(poblacion(1,1)) ', b = ' num2str(poblacion(1,2))])
text(1,-.333,['MC: Error = ' num2str(error_mc) ', m = ' num2str(p(1)) ', b = ' num2str(p(2))])
Código fuente de esta entrada