http://www.cs.us.es/~delia/sia/html98-99/pag-alumnos/web12/indice.html
2. PROGRAMACIÓN GENÉTICA CLÁSICA. 2.1. Orígenes. La Programación Genética (PG) es una materia de estudio bastante reciente, pese a que podemos hallar la idea de su origen ya en los años 50. Efectivamente, en esa década Arthur Samuel planteó la cuestión que ha llevado al desarrollo de la Computación Evolutiva: "¿Cómo pueden los ordenadores aprender a resolver problemas sin ser explícitamente programados?" La PG surgió como una evolución de los Algoritmos Genéticos (AGs). De forma resumida, los AGs son una forma de aprendizaje basada en una evolución simulada. Las hipótesis se describen como cadenas de bits (cuya interpretación depende de la aplicación), que van evolucionando siendo seleccionadas según ciertos criterios. Ya en la 1ª Conferencia sobre Algoritmos Genéticos, desarrollada en la Universidad de Carnegie Mellon, podemos encontrar dos artículos que, sin usar explícitamente el nombre de PG (que fue introducido por John R. Koza), pueden ser considerados como precursores en la materia: "A Representation for the Adaptive Generation of Simple Sequential Programs" [CRAM85] y "Using the Genetic Algorithm to Generate Lisp Source Code to solve the Prisoner’s Dilemma" [FUJI87]. El primero de estos artículos plantea un sistema adaptativo para la generación de pequeños programas secuenciales. Para ello, hace uso de dos lenguajes: JB (que representa los programas en forma de cadenas de números) y TB (versión evolucionada de JB, pero con estructura de árbol para representar programas). El objetivo principal del artículo es conseguir una forma de representar programas que, por un lado, permita la aplicación de los operadores genéticos clásicos (mutación, cruce, inversión) y que, por otro lado, produzca sólo programas "bien formados", incluso cuando se apliquen dichos operadores sobre los programas. No es importante que todos los programas que se puedan obtener sean útiles (de eso ya se encargarán los criterios de selección): sólo importa que estén dentro del espacio de programas sintácticamente correctos. La gran importancia de este artículo se halla en la constatación de la importancia que tiene la representación de los programas para su manipulación. Los problemas que plantea el lenguaje JB pueden ser eliminados si se usa TB y su estructuración en forma de árboles. Este hecho, que en principio puede ser considerado poco relevante, ha demostrado ser de gran utilidad en trabajos posteriores, y de hecho todo el material actual que hay sobre PG se basa en la representación arbórea. El segundo artículo trata sobre la resolución de un problema clásico: el dilema del prisionero. En él, dos prisioneros son interrogados por separado. Cada uno debe decidir si delatar o no al otro, y en función de la declaración de ambos obtienen puntos. Si ambos delatan al otro, obtienen cada uno 1 punto. Si ninguno delata al otro, obtienen
cada uno 3 puntos. Si uno delata y el otro no, el delator obtiene 4 puntos y el otro 0. Al cabo de un número determinado de interrogatorios (rondas) el que obtenga más puntos gana. Este problema ha sido usado como modelo en multitud de situaciones, desde el nivel de las relaciones personales hasta las negociaciones entre grandes corporaciones. Desde el punto de vista del presente trabajo, el interés del artículo se centra en el apartado dedicado a la representación del conocimiento. En teoría, el sistema debería ser lo suficientemente flexible como para encontrar una solución única y novedosa, aunque en la práctica suele ser necesario, e incluso deseable, proporcionar cierto tipo de conocimiento sobre la solución para agilizar el proceso de búsqueda. En el sistema de Hicklin, por ejemplo, este conocimiento es representado en forma de programa, generado por medio de una serie de producciones. El grado de flexibilidad del sistema y el grado de conocimiento incorporado dependerá en cómo sean definidas dichas producciones. Para el artículo, en concreto, se usó un conjunto restringido de expresiones LISP, que demostró ser de gran utilidad y funcionalidad. Aunque no sea explícitamente mencionado en el artículo, podemos constatar nuevamente como la forma de representación (LISP, con su facilidad para trabajar con estructuras en forma de árbol) es vital para conseguir resultados adecuados. Sin embargo, el considerado "padre" de la PG es John R. Koza. Él acuñó el término que da título a este trabajo con la publicación del libro "Programación Genética" (1992). Este libro es el que establece de modo formal las bases de la PG sobre la que se trabaja hoy en día. Posteriormente, el mismo autor ha publicado "Programación Genética II" (1994) y, muy recientemente, "Programación Genética III" (1999), que exploran nuevas posibilidades para la PG. 2.2. ¿Qué es la Programación Genética? A lo largo del período de evolución de los seres vivos, se han ido seleccionando conductas que son adecuadas para la supervivencia. Las especies y los individuos que sobreviven son aquellos que están mejor adaptados al ambiente que les rodea. En la lucha por sobrevivir, los individuos mejor adaptados sobreviven más fácilmente y por tanto pueden reproducirse y transferir a sus descendientes las cualidades beneficiosas que les permitieron estar mejor adaptados, lo cual constituye el proceso de selección natural explicado por Charles Darwin en su libro "El origen de las especies" (1859). Todos aquellos rasgos que faciliten la supervivencia del individuo tenderán a mantenerse, mientras que lo que constituya una dificultad o debilidad para la adaptación tenderá a desaparecer, pues su poseedor no tendrá oportunidad de legarlo a su descendencia. Según [MITC97], la PG es "una forma de Computación Evolutiva en la que los individuos de la población evolutiva son programas de ordenador en vez de cadenas de bits". Al igual que en los AGs, la población se selecciona siguiendo el principio darwiniano ya explicado de supervivencia del más fuerte. Los conceptos utilizados aquí son los mismos que en AGs, para mayor información se recomienda visitar la página de Algoritmos Genéticos. Como ya hemos comentado previamente, la representación del conocimiento es de gran importancia en la PG. En [KOZA92], por ejemplo, podemos encontrar un capítulo completo dedicado a ello. Generalmente, los programas manipulados en PG están
representados por árboles que corresponderían al árbol parse del programa. Cada llamada a función se representaría por un nodo en el árbol, y los argumentos de la función vendrían dados por sus nodos descendientes. En la siguiente figura podemos ver un ejemplo de esto:
En este caso, estamos representando por medio de un árbol la expresión 0,234*Z+X0,789 para su posterior utilización con PG. Para ello, deberemos definir previamente un conjunto de terminales y primitivas que nos permitan aplicar la búsqueda evolutiva sobre los programas que pueden ser descritos con dichos elementos. De forma similar a los AGs, el algoritmo de PG mantiene una población de individuos (programas representados por árboles), que en cada iteración producen una nueva generación por medio de selección, mutación y cruce. Las siguientes figuras muestran ejemplos de esta última operación genéticas aplicadas sobre programas. En la primera vemos los dos árboles que van a ser los padres en el cruce:
A continuación vemos los subárboles que van a ser intercambiados en el cruce:
En la tercera vemos a los padres despojados de dichos subárboles para que sean intercambiados:
La cuarta muestra los hijos generados con el intercambio de los subárboles anteriores:
En las pruebas realizadas por Koza y presentadas en [KOZA92], [KOZA94] y [KOZA99], el 10% de la población se mantenía de una generación a otra, seleccionándola probabilísticamente según su aptitud para resolver el problema planteado. El resto de la nueva generación se crea por cruce de pares de programas de la
generación actual, seleccionados también de forma probabilística, mientras que el operador de mutación no se utilizó. 2.3. Pasos previos. Para la ejecución de un algoritmo de PG es necesario, como ya hemos comentado, definir previamente una serie de aspectos relativos al funcionamiento del propio algoritmo. En primer lugar, debemos definir el conjunto de terminales, esto es, las entradas del programa que debe resolver nuestro problema. Las funciones primitivas deben ser apropiadamente definidas: operadores aritméticos, lógicos, de programación, etc. El conjunto de terminales más el conjunto de funciones primitivas deben cumplir el criterio de suficiencia, esto es, deben ser capaces de expresar la solución del problema. Por otro lado, cualquier función primitiva debe aceptar como argumento cualquier valor devuelto por cualquier función y cualquier valor que pueda ser usado como terminal. Esto es lo que se denomina requisito de clausura. La medida de aptitud nos permite evaluar cómo de bien funciona cada programa de la población en el entorno del problema. Esta medida debe estar completamente definida, debe ser capaz de evaluar cualquier programa de la población. Los parámetros de control de ejecución son varios, aunque básicamente establecen el tamaño de la población inicial (4000), el número de generaciones (50), el tanto por ciento de individuos que pasan directamente a la siguiente generación (10%), etc. Por último, el criterio de finalización debe indicar cuándo finalizar la ejecución del algoritmo de PG, lo cual puede ocurrir cuando transcurra el número de generaciones predeterminadas, o bien hallemos el programa que sea "perfecto" según la medida de aptitud que hemos proporcionado. La designación del resultado se hace generalmente utilizando el criterio de "mejor hasta el momento", esto es, se elige el mejor programa de todos los obtenidos hasta la finalización de la ejecución. El diagrama de flujo que muestra el funcionamiento del paradigma de la PG es el siguiente:
2.4. Ejemplo: bloques. El siguiente ejemplo, extraído de [KOZA92], es bastante ilustrativo sobre la forma en que trabaja la programación genética
La tarea a desarrollar consiste en desarrollar un algoritmo general para apilar bloques en una sola pila que forme la palabra "universal", independientemente de la configuración inicial de los bloques. Las acciones disponibles para manipular bloques permiten mover un solo bloque cada vez (el bloque superior de la pila a la superficie de la mesa o un bloque de la superficie de la mesa a la pila). Tal y como indica [MITC97], en la mayoría de las aplicaciones de PG la elección de la representación del problema tiene una importancia significativa en la facilidad para solucionar el problema. En concreto, la que se siguió para este ejemplo usaba un conjunto de tres terminales: CS (Current Stack, "pila actual"), referida al nombre del bloque que se halla en la cima de la pila, o F si no hay pila TB (Top correct Block, "bloque superior correcto"), que hace referencia al bloque superior de la pila tal que el y todos los que están por debajo de él mismo están en orden correcto NN (Next Necessary, "siguiente necesario"), que hace referencia al nombre del siguiente bloque necesitado sobre TB en la pila para formar la palabra "universal", o F si no se necesitan más bloques. Junto a este conjunto de terminales, se definió el lenguaje de programación de la aplicación, que poseería las siguientes funciones primitivas: (MS x) (Move to Stack), si el bloque x se halla en la mesa este operador mueve x a la cima de la pila y devuelve el valor T. En otro caso, no hace nada y devuelve el valor F. (MT x) (Move to Table), si el bloque x se halla en la pila, mueve el bloque que se halle en la cima de la pila a la mesa y devuelve el valor T. En otro caso, devuelve el valor F. (EQ x y) (Equal), devuelve T si x es igual a y, F en otro caso. (NOT x), devuelve T si x=F y F si x=T.
(DU x y) (Do Until), ejecuta la expresión x repetidamente hasta que la expresión y sea T. Para permitir al sistema evaluar la aptitud de cualquier programa, se suministró un conjunto de 166 ejemplos de entrenamiento representando una extensa variedad de configuraciones de bloques iniciales. La aptitud de cualquier programa generado se mediría como el numero de ejemplos resueltos por el algoritmo. La población inicial fue de 300 programas aleatorios, y apenas 10 generaciones después, el sistema descubrió el programa capaz de resolver los 166 ejemplos de entrenamiento. (EQ (DU (MT CS) (NOT CS)) (DU (MS NN) (NOT NN)) ) Como se puede observar, el programa tiene dos expresiones "Do Until". La primera mueve repetidamente los bloques de la pila a la mesa hasta que no queda ninguno en la pila. La segunda va moviendo repetidamente los bloques necesarios a la pila. En tan sólo unas generaciones la PG ha sido capaz de encontrar un programa que resolviese todos los ejemplos, aunque sabemos que la habilidad del sistema para hallar la solución depende en gran medida de los terminales y primitivas suministradas, así como en el conjunto de ejemplos de entrenamiento. Como ya se vio en [FUJI], es importante suministrar información sobre la posible solución del problema para agilizar la búsqueda de la misma.
La aplicación de pg Hay aplicaciones numerosas de programación genética. Tenemos particularmente interés en ejercer programación genética para “Boicotee a Art Problems, ” como la síntesis automatizada de analog circuitos eléctricos, los controladores, las antenas, las redes de reacciones químicas, sistemas ópticos, y otras áreas de diseño “Programando al Unprogrammable ” implicar la creación automática de computadora programa para dispositivos poco convencionales de computación como sistemas de autómatas celulares, del multiagente, igualan sistemas programadores, los conjuntos imponentes programables en campo de la portilla, la inteligencia del analog de programable en campo conjuntos imponentes, de la hormiga de colonias, del enjambre, los sistemas distribuidos, y algo semejante, y (PTU) Inventions (CUNI) comercialmente Nuevo Útil implicando el uso de programación genética como una "máquina" automatizada de "invención" para creando comercialmente invenciones nuevas utilizables. Andamos constantemente buscando que áreas nuevas de para dominio en las cuales ejerzan las técnicas de programación genética para lograr inteligencia competitiva en humano de la máquina.
QUE SON LOS ALGORTIMOS GENETICOS Los organismos vivos poseen destreza consumada en la resolución de problemas y se manifiesta una versatilidad capaz de avergonzar a los problemas más refinados. Una definición bastante completa de un Algoritmo Genético es la propuesta por Jhon Kosa [Coello 95]: Es un Algoritmo matemático altamente paralelo que transforma un conjunto de objetos matemáticos con respecto al tiempo usando operaciones modeladas de acuerdo al principio Darwiniano de reproducción y supervivencia del mas apto, y tras haberse presentado de forma natural una serie de operaciones genéticas de entre las que destaca la recombinación sexual. Cada uno de estos objetos matemáticos suele ser una cadena de caracteres (letras o números) de longitud fija que se ajusta al modelo de las cadenas de cromosomas, y se asocian con una cierta función matemática que refleja su aptitud. Los Algoritmos Genéticos utilizan una analogía directa del fenómeno de evolución en la naturaleza. Trabajan con una población de individuos, cada uno representado una posible solución a un problema dado. A cada individuo se le asigna una puntuación de adaptación, dependiendo de que tan buena fue la respuesta al problema. A los más adaptados se les da la oportunidad de reproducirse mediante cruzamientos con otros individuos de la población, produciendo descendientes con características de ambos padres. Los miembros menos adaptados poseen pocas probabilidades de que sean seleccionados para la reproducción, y desaparecen. El evaluar esta adaptación no es sencillo de hacer, pues el entorno esta modificándose constantemente por lo que nunca se llegara al superindividuo perfecto, sino que la naturaleza tendera a optimizar los individuos de cada especie en las circunstancias actuales. Existen varios tipos de Algoritmos Genéticos, cada uno basado en una metáfora distinta de la naturaleza.
CLASES DE ALGORITMOS GENÉTICOS Algoritmos Genéticos Generacionales Se asemejan a la forma de reproducción de los insectos, donde una generación pone huevos, se aleja geográficamente o muere y es substituida por una nueva. En este momento se realizan cruces en una piscina de individuos, los descendientes son puestos en otra, al final de la fase reproductiva se elimina la generación anterior y se pasa a utilizar la nueva. Este modelo también es conocido como Algoritmo Genético Canónico. Algoritmos Genéticos de estado Fijo. Utilizan el esquema generacional de los mamíferos y otros animales de vida larga, donde coexisten padres y sus descendientes, permitiendo que los hijos sean educados por sus progenitores, pero también que a la larga se genere competencia entre ellos. En este modelo, no solo se deben seleccionar los dos individuos a ser padres, si no también cuales de la población anterior serán eliminados, para dar espacio a los descendientes. La diferencia esencial entre el reemplazo generacional y el modelo de estado fijo es que las estadísticas de la población son recalculadas luego de cada cruce y los nuevos descendientes están disponibles inmediatamente para la reproducción. Esto permite al modelo utilizar las características de un individuo prometedor tan pronto como es creado. Algunos autores dicen que este modelo tiende a evolucionar mucho más rápido que el modelo generacional, sin embargo investigaciones de Goldberg y deb [GOLDBERG
93], encontraron que las ventajas parecen estar relacionadas con la alta tasa de crecimiento inicial, ellos dicen que los mismos efectos pueden ser obtenidos en rangos de adaptación exponencial o selección por competencia. No encontraron evidencia que este modelo sea mejor que el Generacional. Algoritmos Genéticos Paralelos. Parte de la metáfora biológica que motivo a utilizar la búsqueda genética consiste en que es inherentemente paralela, donde al evolucionar se recorren simultáneamente muchas soluciones, cada una representada por un individuo de la población. Sin embargo, es muy común en la naturaleza que no solo sea una población evolucionando, si no varias poblaciones, normalmente aisladas geográficamente, que originan respuestas diferentes a la presión evolutiva. Esto origina dos modelos que toman es cuenta esta variación, y utilizan no una población como los anteriores si no múltiples concurrentemente. Modelos de Islas. Si se tiene una población de individuos, esta se divide en subpoblaciones que evolucionan independientemente como un Algoritmo Genético normal. Ocasionalmente, se producen migraciones entre ellas, permitiéndoles intercambiar material genético. Con la utilización de la migración, este modelo puede explotar las diferencias en las subpoblaciones; esta variación representa una fuente de diversidad genética. Sin embargo, si un número de individuos emigran en cada generación, ocurre una mezcla global y se eliminan las diferencias locales, y si la migración es infrecuente, es probable que se produzca convergencia prematura en las subpoblaciones. Modelo Celular Coloca cada individuo en una matriz, donde cada uno sólo podrá buscar reproducirse con los individuos que tenga a su alrededor (mas cerca de casa) escogiendo al azar o al mejor adaptado. El descendiente pasara a ocupar una posición cercana. No hay islas en este modelo, pero hay efectos potenciales similares. Asumiendo que el cruce esta restringido a individuos adyacentes, dos individuos separados por 20 espacios están tan aislados como si estuvieran en dos islas, este tipo de separación es conocido como aislamiento por distancia. Luego de la primera evaluación, los individuos están todavia distribuidos al azar sobre la matriz. Posteriormente, empiezan a emerger zonas como cromosomas y adaptaciones semejantes. La reproducción y selección local crea tendencias evolutivas aisladas, luego de varias generaciones, la competencia local resultara en grupos mas grandes de individuos semejantes.
ELEMENTOS DE UN ALGORITMO GENETICO Como los Algoritmos Genéticos se encuentra basados en los procesos de evolución de los seres vivos, casi todos sus conceptos se basan en conceptos de biología y genética que son fáciles de comprender. Individuo Un individuo es un ser que caracteriza su propia especie. El individuo es un cromosoma y es el codigo de información sobre el cual opera el algoritmo. Cada solución parcial del problema a optimizar está codificada en forma de cadena o String en un alfabeto
determinado, que puede ser binario. Una cadena representa a un cormosoma, por lo tanto tambien a un individuo y cada posición de la cadena representa a un gen. Esto significa que el algoritmo trabaja con una codificación de los parametros y no con los parametros en si mismos. El genotipo, es el conjunto de genes ordenados y representa las caracteristicas del individuo. Cada individuo tinen una medida de su adecuación como solución al problema. Población A un conjunto de individuos (Cromosomas) se le denomina población. El método de A.G´s consiste en ir obteniendo de forma sucesiva distintas poblaciones. Por otra parte un Algoritmo Genético trabaja con un conjunto de puntos representativos de diferentes zonas del espacio de búsqueda y no con un solo punto (como lo hace Hillclimbing). Función Fitness. La única restricción para usar un algoritmo genético es que exista una función llamada fitness, que le informe de cuan bueno es un individuo dado en la solución de un problema. Esta función fitness o de evaluación es el principal enlace entre el Algoritmo Genético a un problema real, es la efectividad y eficiencia de la función fitness que se tome, por lo tanto debe procurarse que la función fitness sea similar, si no igual a la función objetivo que se quiere optimizar. Esta medida se utiliza como parámetro de los operadores y guía la obtención de nuevas poblaciones.
OPERADORES GENETICOS. Son los diferentes métodos u operaciones que se pueden ejercer sobre una población y que nos permite obtener poblaciones nuevas. Una vez que se ha evaluado cada individuo sobre una función fitness, se aplican los operadores genéticos. En Algoritmos Genéticos se destacan los siguientes operadores. Operador de Selección. El paso siguiente a la evaluación es escoger los miembros de la población que serán utilizados para la reproducción. Su meta es dar mas oportunidades de selección a los miembros más aptos de la población. Así funciona: se calcula el cociente entre el valor fitness de un individuo y la suma total de los valores fitness de todos los individuos de la población. Este resultado mide la probabilidad de selección Ps (i) de cada individuo.
Ecuación No. 1 Probabilidad de selección. Empezando desde la población P (t) de N individuos se obtiene una nueva población P(t+1) aplicando N veces el operador de selección. Los individuos se seleccionan de una especie de rueda de ruleta (como se muestra en la figura 1) donde cada uno tiene asignado un trozo en proporción a su probabilidad selección Ps.
Figura No.1 Operador de Selección Este mecanismo puede causar problemas de convergencia prematura, causada por la aparición de un individuo que es mucho mejor que los otros de la población aunque esta lejos de optimo; las copias de este individuo pueden dominar rápidamente a la población, sin poder escapar de este mínimo local. Operador de Cruce Consiste en unir en alguna forma los cromosomas de los padres que han sido previamente selecciónados de la generación anterior para formar dos descendientes. Existen diversas variaciones, dependiendo del número de puntos de división a emplear y la forma de ver el cromosoma. El operador cruce se aplica en dos pasos: en el primero los individuos se aparean (se seleccionan de dos a dos) aleatoriamente con una determinada probabilidad, llamada probabilidad de cruce Pc; en el segundo paso a cada par de individuos seleccionados anteriormente se le aplica un intercambio en su contenido desde una posición aleatoria K hasta el final, con K Î [1, m-1], donde m es la longitud de individuo. K es el denominado punto de cruce y determina la subdivisión de cada padre en dos partes que se intercambian para formar dos nuevos hijos, según podemos ver en la figura 2 Esto se conoce como cruce ordinario o cruce de un punto. El objetivo del operador de cruce es recombinar subcadenas de forma eficiente; esta gestión recibe el nombre de construcción de bloques.
Figura No. 2 Operador de Cruce Mutación. El operador de mutación consiste en la alteración aleatoria de cada uno de los genes del individuo con una probabilidad de mutación PM, como se puede ver en la figura 3. El objetivo de la mutación es producir diversidad en la población. Si al generar aleatoriamente la población inicial o después de varias generaciones, en la misma posición de todos los cromosomas sólo aparece un único elemento del alfabeto
utilizado, esto supondrá que con los operadores de reproducción y cruce, nunca cambiara dicho elemento, por lo que puede ocurrir que jamas se alcance la solución más optima a nuestro problema. La probabilidad de aparición del operador de mutación no debe ser grande para no perjudicar la correcta construcción de bloques. El operador de mutación origina variaciones elementales en la población y garantiza que cualquier punto del espacio de búsqueda pueda ser alcanzado.
Figura No. 3 Operador de Mutación
CICLO GENERAL DE UN ALGORITMO GENETICO ESTANDAR El AG estándar se puede expresar en pseudocodigo con el siguiente ciclo. [Coello 95]: 1. Generar aleatoriamente la población inicial de individuos P(0). Generación = 0: 2. Mientras ( numero _ generaciones <= máximo _ números _ generaciones) Hacer {
}
Evaluación; Selección; Reproducción; Generación ++;
3.Mostrar resultados; Fin de la generación Estas características de los AG, a su vez, describen las diferencias entre ellos, y otros métodos normales de optimización. 1. Un Algoritmo Genético trabaja con codificación de los parámetros que busca optimizar y no con los parámetros en sí mismo. 2. Un Algoritmo Genético trabaja con un conjunto de puntos representativos de diferentes zonas del espacio y no con un solo punto. Por el contrario necesita considerables recursos de computación. 3. La aplicación de AG no depende de ninguna propiedad de la función a optimizar (derivable, continua, ni siquiera conocida), o de que el conjunto de posibles soluciones sea finito o no lo sea. 4. Un AG utiliza reglas de transición probabilisticas, no deterministas, lo cual hace que dos aplicaciones consecutivas de un AG a un mismo problema puedan producir dos soluciones distintas. EL ejemplo siguiente nos da una pequeña ilustración de un Pseudocódigo de Algoritmo Genético. BEGIN /* Algoritmo Genético */ Generar una población inicial.
Computar la función de evaluación de cada individuo. WHILE NOT Terminado DO BEGIN /* Producir nueva Generación */ FOR Tamaño Población /2 DO BEGIN /* Ciclo Reproductivo */ Seleccionar dos individuos de la anterior generación El cruce (probabilidad de selección proporcional a la Función de evaluación de individuo). Cruzar con cierta probabilidad los dos individuos obtenida dos descendientes Mutar los dos descendientes con cierta probabilidad. Computar la función de evaluación de los dos descendientes Mutados. Insertar los dos descendientes mutados en la nueva generación. END IF La población ha convergido THEN Terminado =TRUE END END