programación genética - java

5
A continuación presento un ejemplo de código utilizado para implementar programación genética por medio de la libreria JGAP echa en JAVA descargable en http://jgap.sourceforge.net , en sí sólo es el comienzo para entender la librería y cómo funciona, trataré de comentar lo mejor posible su función y traduciré sus comentarios: /* * Este archivo es parte de JGAP. * * JGAP oferta un modelo de doble licencia tanto licencia LGPL como la licencia MPL. * * Para información referente a la licencia favor de ver el archivo license.txt incluido con JGAP * o echar un vistazo a la parte superior de la clase org.jgap.Chromosome que representativamente * incluye la politica de licencia de JGAP aplicable para cualquier archivo desarrollado con JGAP. */ //A continuación se muestran los paquetes propios de la librería JGAP package examples.gp; import org.jgap.*; //La librería general import org.jgap.event.*; //Con sus eventos import org.jgap.gp.*; //Especificando las funciones, los métodos, atributos, valores, etc. de import org.jgap.gp.function.*; //Programación Genética import org.jgap.gp.impl.*; import org.jgap.gp.terminal.*; import org.jgap.util.*; //Utilidades del programa /** * Ejemplo simple de Programación Genética para descubrir la fórmula * (X > 0) OR (X == -8) OR (X == - 5) * dadas un conjunto de entradas que van desde -10 a 10 y salidas esperadas (verdadero o falso). * * La función de aptitud usada en el ejemplo toma en cuenta la variacón del resultado esperado * tanto como la complejidad de la solución (la solución más fácil es la mejor * mutatis mutandis). * * @author Klaus Meffert * @since 3.5 */ Galindo Cárdenas Enrique IA 1958 Comentarios a un programa de Programación Genética. martes 30/noviembre/2010 1 de 5

Upload: enrique-galindo

Post on 02-Apr-2015

1.810 views

Category:

Documents


0 download

DESCRIPTION

Un ejemplo de código para programación genética con una librería en JAVA

TRANSCRIPT

Page 1: Programación Genética - JAVA

A continuación presento un ejemplo de código utilizado para implementar programación genética por medio de la libreria JGAP echa en JAVA descargable en http://jgap.sourceforge.net, en sí sólo es el comienzo para entender la librería y cómo funciona, trataré de comentar lo mejor posible su función y traduciré sus comentarios:

/* * Este archivo es parte de JGAP. * * JGAP oferta un modelo de doble licencia tanto licencia LGPL como la licencia MPL. * * Para información referente a la licencia favor de ver el archivo license.txt incluido con JGAP * o echar un vistazo a la parte superior de la clase org.jgap.Chromosome que representativamente * incluye la politica de licencia de JGAP aplicable para cualquier archivo desarrollado con JGAP. */

//A continuación se muestran los paquetes propios de la librería JGAP

package examples.gp;

import org.jgap.*; //La librería generalimport org.jgap.event.*; //Con sus eventosimport org.jgap.gp.*; //Especificando las funciones, los métodos, atributos, valores, etc. deimport org.jgap.gp.function.*; //Programación Genéticaimport org.jgap.gp.impl.*;import org.jgap.gp.terminal.*;import org.jgap.util.*; //Utilidades del programa

/** * Ejemplo simple de Programación Genética para descubrir la fórmula * (X > 0) OR (X == -8) OR (X == - 5) * dadas un conjunto de entradas que van desde -10 a 10 y salidas esperadas (verdadero o falso). * * La función de aptitud usada en el ejemplo toma en cuenta la variacón del resultado esperado * tanto como la complejidad de la solución (la solución más fácil es la mejor * mutatis mutandis). * * @author Klaus Meffert * @since 3.5 */

Galindo Cárdenas Enrique IA 1958 Comentarios a un programa de Programación Genética. martes 30/noviembre/2010 1 de 5

Page 2: Programación Genética - JAVA

//Clase SimpleExample que hereda de GPProblem, es decir, de la clase problema de Programación//Genéticapublic class SimpleExample extends GPProblem {

protected static Variable vx; //Una variable auxiliar

//Función que crea el genotipo y cacha el error de configuración inválida public GPGenotype create() throws InvalidConfigurationException { GPConfiguration conf = getGPConfiguration(); //Se toma la configuración de la clase // El resultado de la Programación Genética retorna un booleano. // ------------------------------------------- Class[] types = {CommandGene.BooleanClass}; // Arreglo de clases que representa los booleanos Class[][] argTypes = { {} // resultados, y un arreglo de arreglos de clases }; // Los comandos y terminales permiten encontrar una solución. // ------------------------------------------------------ CommandGene[][] nodeSets = { { // Necesitamos una variable para la alimentación de los datos (ver la función fitness (aptitudes)). // ---------------------------------------------------------- vx = Variable.create(conf, "X", CommandGene.IntegerClass), // Define las terminales (aquí: numeros) para tratar: // De la manera más fácil: Define dos constantes // Más difícil: Define una terminal que pueda tener valores entre -10 a 10, por ejemplo:// new Constant(conf, CommandGene.IntegerClass, 0),// new Constant(conf, CommandGene.IntegerClass, -8), new Terminal(conf, CommandGene.IntegerClass,-10,10,true), // Operadores booleanos a utilizar. // ------------------------ new GreaterThan(conf, CommandGene.IntegerClass), // Mayor que new Or(conf), //Operador OR new Equals(conf, CommandGene.IntegerClass), //Igual a // Define operadores complejos. // ------------------------ new If(conf, CommandGene.BooleanClass), //Operador IF // Terminales booleanos a utilizar (estos no aparecen dentro de una solución opcional // y hacen la labor mas desafiante) --> dejar fuera si es necesario // -------------------------------------------------------------------// new True(conf, CommandGene.BooleanClass), new False(conf, CommandGene.BooleanClass)//Terminal con valor falso } };

Galindo Cárdenas Enrique IA 1958 Comentarios a un programa de Programación Genética. miercoles 27/octubre/2010 2 de 5

Page 3: Programación Genética - JAVA

// Inicializa el GPGenotype, es decir, el Genotipo de Programación Genética. // -------------------------- return GPGenotype.randomInitialGenotype(conf, types, argTypes, nodeSets, 100, true); //100 genes }

//Función de inicio que cacha el error de excepción public void start() throws Exception { GPConfiguration config = new GPConfiguration(); //Se inicializa la configuración config.setMaxInitDepth(5); //Profundidad de 5 niveles config.setPopulationSize(80); //Tamaño de la población de 80 individuos config.setFitnessFunction(new SimpleFitnessFunction()); //Tipo de función para obtener aptitud config.setStrictProgramCreation(false);// No se requiere una estricta creación del programa config.setProgramCreationMaxTries(5);//Intentos maximos de creación 5 config.setMaxCrossoverDepth(5);//Profundidad máxima de cruza 5 // El valor más bajo de aptitud es mejor que el valor de aptitud que indica tasa de error. // -------------------------------------------------------------------- config.setGPFitnessEvaluator(new DeltaGPFitnessEvaluator()); //Tipo de evaluador de aptitud super.setGPConfiguration(config); //Se coloca la configuración GPGenotype geno = create(); //Se crea el genotipo // Simple implementación de dirigir la evolución en un hilo. A continuación se agrega un evento. // ------------------------------------------------------- //Esta parte tal ves hace referencia a parar el proceso si se estanca durante mucho tiempo config.getEventManager().addEventListener(GeneticEvent. GPGENOTYPE_EVOLVED_EVENT, new GeneticEventListener() { public void geneticEventFired(GeneticEvent a_firedEvent) { GPGenotype genotype = (GPGenotype) a_firedEvent.getSource(); int evno = genotype.getGPConfiguration().getGenerationNr(); double freeMem = SystemKit.getFreeMemoryMB(); if (evno % 100 == 0) { IGPProgram best = genotype.getAllTimeBest(); System.out.println("Evolving generation " + evno); genotype.outputSolution(best); } if (evno > 3000) { System.exit(1); } } });

Galindo Cárdenas Enrique IA 1958 Comentarios a un programa de Programación Genética. miercoles 27/octubre/2010 3 de 5

Page 4: Programación Genética - JAVA

//Esta parte tal vez hace referencia a regresar el resultado cuando se encuentre el mejor individuo config.getEventManager().addEventListener(GeneticEvent. GPGENOTYPE_NEW_BEST_SOLUTION, new GeneticEventListener() { /** * New best solution found. * * @param a_firedEvent GeneticEvent */ public void geneticEventFired(GeneticEvent a_firedEvent) { GPGenotype genotype = (GPGenotype) a_firedEvent.getSource(); IGPProgram best = genotype.getAllTimeBest(); double bestFitness = genotype.getFittestProgram(). getFitnessValue(); if (bestFitness < 0.1) { // Sale, cuando la solución se muestra perfecta. // --------------------------------------- genotype.outputSolution(best); System.exit(0); } } }); geno.evolve(10000); }

//función principal y maneja excepciones public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); //Se inicializa el ejemplo simple example.start(); //Inicia el proceso }

Galindo Cárdenas Enrique IA 1958 Comentarios a un programa de Programación Genética. miercoles 27/octubre/2010 4 de 5

Page 5: Programación Genética - JAVA

//Case de función de aptitud simple que hereda de funcion de aptitud class SimpleFitnessFunction extends GPFitnessFunction { //función de evaluación de los individuos protected double evaluate(final IGPProgram ind) { int error = 0; //Variable que indica el error Object[] noargs = new Object[0]; //Declaración de un objeto int maxDepth = ind.getChromosome(0).getDepth(0); //Se obtiene la profundidad máxima if (maxDepth > 2) { //Se controla la profundidad error += maxDepth - 2; } for (int i = -10; i < 10; i++) {//Se inicia con la búsqueda del resultado vx.set(new Integer(i));//Se aplica un nuevo valor a vx boolean y; //Se manejan los casos respuesta con la variable y if (i > 0) {// si es mayor a cero y = true; } else { if (i != -8 && i != - 5) { y = false; } else { y = true; //o si es -8 o -5 } } try { boolean result = ind.execute_boolean(0, noargs); //Se obtiene la aptitud if (result != y) { error += 10; //Si el resultado del booleano comparado con y es diferente, se incrementa el error } } catch (ArithmeticException ex) { // Alguna operación ilegal ocurrió. System.out.println("x = " + i); //Se muestra el estado en el que se encontraba al ocurrir System.out.println(ind);//y el individuo que lo produjo throw ex; } } return error;//Regresa el error que representa el nivel de aptitud } }}

Galindo Cárdenas Enrique IA 1958 Comentarios a un programa de Programación Genética. miercoles 27/octubre/2010 5 de 5