Download Práctica 4b - Universidad de Oviedo

Document related concepts
no text concepts found
Transcript
Práctica 4b
Algoritmos Genéticos
En esta práctica vamos a ver un algoritmo genético implementado en MATLAB.
Veremos cómo es capaz de resolver el problema de las n-Reinas.
1 Genético para resolver las n-Reinas
Puede descargarse en: http://www.aic.uniovi.es/ssii/P4b/N-Reinas.zip
function [ FitnessMedio mejorFitness mejorIndividuo ] = GAnReinas2( nReinas ,...
NIND, MAXGEN, porcNewInd,pMutacion)
%GAnReinas2 Resulve el problema de las n-reinas con un genético
% Necesita:
%
nReinas: número de reinas
%
NIND: número de individuos de cada generación
%
MAXGEN: número máximo de generaciones
%
porcNewInd: porcentaje de nuevos individuos en la siguiente generación
%
porcMutacion: porcentaje de mutación
% Produce:
%
FitnessMedio: vector con el fitness medio de cada generación
%
mejorFitness: vector con el mejor fitness de cada generación
%
mejorIndividuo: matriz que contiene la representación del mejor
%
individuo de cada generación
% Representación:
%
Se utiliza un vector con tantas posiciones como columnas tiene el
%
tablero. Cada valor del vector indica la fila en la que se encuentra
%
la reina en esa columna.
%
% Implementado en 2005 para la asignatura Sistemas Inteligentes de Telecomunicaciones
% de E.P.S.I. de Gijon (universidad de Oviedo)
ValorObjetivo = sum(1:nReinas-1);
fprintf('ValorObjetivo: %d\n',ValorObjetivo);
% poblacion inicial
Poblacion = GeneraPoblacionInicial(NIND,nReinas,'GeneraPosicion2');
ObjV = EvaluaPoblacion(Poblacion,'EvaluaPosicion2');
% para el gráfico
close;
grid;
hold on;
axis([1 MAXGEN ValorObjetivo/2 ValorObjetivo]);
% inicializaciones
FinessMedio = zeros(MAXGEN,1);
mejorFitness = zeros(1,1);
mejorIndividuo = zeros(MAXGEN,nReinas);
gen = 0;
while ((gen < MAXGEN) & (max(mejorFitness) ~= ValorObjetivo)),
Poblacion = FormaNuevaPoblacion(Poblacion,ObjV,porcNewInd,'Ruleta',...
'CruzaPosicion2', 'MutaPosicion2',pMutacion);
ObjV = EvaluaPoblacion(Poblacion,'EvaluaPosicion2');
%Almacenar media del fitness y mejor individuo
mejor = find(ObjV==max(ObjV));
mejorFitness(gen+1) = ObjV(mejor(1));
mejorIndividuo(gen+1,:) = Poblacion(mejor(1),:);
FitnessMedio(gen+1) = mean(ObjV);
%incrementar el numero de generaciones
gen = gen + 1;
%actualizar gráfico
plot(mejorFitness,'-b');
plot(FitnessMedio,'-r');
if gen == 1
legend('Mejor Fitness', 'Media de la Poblacion');
end
drawnow;
end
hold off
val = PintaTablero( mejorIndividuo(gen,:),'EvaluaPosicion2')
En la página anterior se muestra la función principal del algoritmo genético:
1. se crea la población inicial
2. se evalúa dicha población
3. se genera una nueva población a partir de la anterior
4. se evalúa la nueva población
5. se repiten los pasos 3 y 4 hasta que se alcanza el número máximo de
generaciones o hasta que se alcanza el objetivo
Las funciones que tienen en el nombre “Poblacion” son funciones genéricas que
podrían utilizarse para resolver otro problema. El resto de funciones son específicas
para el problema de las n-Reinas.
Como todas las funciones tienen un comportamiento similar comentaremos únicamente
una de ellas:
Poblacion = GeneraPoblacionInicial(NIND,nReinas,'GeneraPosicion2');
Esta función se encarga de generar la población inicial. Para ello utiliza una función
específica del problema de las n-Reinas “GeneraPosicion2”, que se le pasa como
parámetro. Podemos implementar otra función para generar una posición y utilizarla:
Poblacion = GeneraPoblacionInicial(NIND,nReinas,'miPropiaFuncion');
Hay implementados dos métodos de selección:
1. Ruleta
2. Torneo
En la llamada a la función FormaNuevaPoblacion se debe indicar uno de los dos
métodos (si quieres puedes implementar más métodos☺).
Para ejecutarlo:
[ FitnessMedio mejorFitness mejorIndividuo ] = GAnReinas2( 10 , 50, 250, 0.97,0.1);
Siendo los parámetros en orden: número de reinas, número de individuos de cada
generación, número máximo de generaciones, porcentaje de nuevos individuos en la
siguiente generación y porcentaje de mutación.
Produce:
FitnessMedio: vector con el fitness medio de cada generación
mejorFitness: vector con el mejor fitness de cada generación
mejorIndividuo: matriz que contiene la representación del mejor individuo de cada
generación
Representación:
Se utiliza un vector con tantas posiciones como columnas tiene el tablero. Cada valor
del vector indica la fila en la que se encuentra la reina en esa columna.
También genera un gráfico que muestra la evolución de las sucesivas generaciones
(Figura 1).
Figura 1.- Ejemplo de gráfico de salida
[Trabajo] Jugar con los parámetros del algoritmo y con los métodos de selección para
estudiar la convergencia del algoritmo hacia la solución
2 Mejorando la solución
Piensa una manera de mejorar la convergencia del algoritmo cambiando la
representación de los individuos. Actualmente tenemos la siguiente representación:
[8
3 7 4 2 5 1 5]
Estamos permitiendo que dos reinas estén en la misma fila. Podríamos pensar en no
permitir eso, ya que los individuos (tableros) que están en esa situación son individuos
con ataques.
[Trabajo] Trata de modificar el genético para que se adapte a la nueva representación.
Crea las funciones que consideres necesarias
Si no eres capaz de adaptarlo, en http://www.aic.uniovi.es/ssii/P4b/N-Reinas-Mejor.zip
puedes descargarte las funciones necesarias para adaptarse a esta nueva representación.
Descomprímelas en directorio en que estás trabajando.