Está en la página 1de 4

Prctica 4b

Algoritmos Genticos

En esta prctica vamos a ver un algoritmo gentico implementado en MATLAB. Veremos cmo es capaz de resolver el problema de las n-Reinas.

1 Gentico 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 gentico % Necesita: % nReinas: nmero de reinas % NIND: nmero de individuos de cada generacin % MAXGEN: nmero mximo de generaciones % porcNewInd: porcentaje de nuevos individuos en la siguiente generacin % porcMutacion: porcentaje de mutacin % Produce: % FitnessMedio: vector con el fitness medio de cada generacin % mejorFitness: vector con el mejor fitness de cada generacin % mejorIndividuo: matriz que contiene la representacin del mejor % individuo de cada generacin % Representacin: % 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 grfico 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 grfico 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 pgina anterior se muestra la funcin principal del algoritmo gentico: 1. se crea la poblacin inicial 2. se evala dicha poblacin 3. se genera una nueva poblacin a partir de la anterior 4. se evala la nueva poblacin 5. se repiten los pasos 3 y 4 hasta que se alcanza el nmero mximo de generaciones o hasta que se alcanza el objetivo Las funciones que tienen en el nombre Poblacion son funciones genricas que podran utilizarse para resolver otro problema. El resto de funciones son especficas 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 funcin se encarga de generar la poblacin inicial. Para ello utiliza una funcin especfica del problema de las n-Reinas GeneraPosicion2, que se le pasa como parmetro. Podemos implementar otra funcin para generar una posicin y utilizarla:
Poblacion = GeneraPoblacionInicial(NIND,nReinas,'miPropiaFuncion');

Hay implementados dos mtodos de seleccin: 1. Ruleta 2. Torneo En la llamada a la funcin FormaNuevaPoblacion se debe indicar uno de los dos mtodos (si quieres puedes implementar ms mtodos). Para ejecutarlo:
[ FitnessMedio mejorFitness mejorIndividuo ] = GAnReinas2( 10 , 50, 250, 0.97,0.1);

Siendo los parmetros en orden: nmero de reinas, nmero de individuos de cada generacin, nmero mximo de generaciones, porcentaje de nuevos individuos en la siguiente generacin y porcentaje de mutacin. Produce: FitnessMedio: vector con el fitness medio de cada generacin mejorFitness: vector con el mejor fitness de cada generacin mejorIndividuo: matriz que contiene la representacin del mejor individuo de cada generacin Representacin: 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. Tambin genera un grfico que muestra la evolucin de las sucesivas generaciones (Figura 1).

Figura 1.- Ejemplo de grfico de salida [Trabajo] Jugar con los parmetros del algoritmo y con los mtodos de seleccin para estudiar la convergencia del algoritmo hacia la solucin

2 Mejorando la solucin
Piensa una manera de mejorar la convergencia del algoritmo cambiando la representacin de los individuos. Actualmente tenemos la siguiente representacin: [8 3 7 4 2 5 1 5]

Estamos permitiendo que dos reinas estn en la misma fila. Podramos pensar en no permitir eso, ya que los individuos (tableros) que estn en esa situacin son individuos con ataques. [Trabajo] Trata de modificar el gentico para que se adapte a la nueva representacin. 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 representacin. Descomprmelas en directorio en que ests trabajando.

También podría gustarte