UNIVERSIDAD NACIONAL ABIERTA MATEMÁTICA CENTRO LOCAL METROPOLITANO APLICACIÓN DE LOS ALGORITMOS GENÉTICOS SIMPLES EN LA OPTIMIZACIÓN DE FUNCIONES REALES (presentado para optar al título de Licenciado en Matemática Mención Análisis Numérico) Raúl Inés Barrera Núñez Caracas, junio de 2006 UNIVERSIDAD NACIONAL ABIERTA i Aprobación del Profesor Tutor Luego de haber leído detenidamente el presente Trabajo de Grado, le doy mí aprobación tanto en lo referente a forma como a contenido. ______________________ José Ramón Gascón UNIVERSIDAD NACIONAL ABIERTA ii INDICE GENERAL Página APROBACIÓN DEL PROFESOR TUTOR VEREDICTO DEL JURADO II ¡ERROR! MARCADOR NO DEFINIDO. LISTA DE ILUSTRACIONES V RESUMEN VI GLOSARIO DE TÉRMINOS VII INTRODUCCIÓN IX CAPÍTULO I 1 LOS ALGORITMOS GENÉTICOS 1 1.1. Breve acercamiento a la biología genética 1 1.2. Historia furtiva 1.2.1. De la teoría de la evolución 1.2.2. De los algoritmos genéticos 4 4 5 1.3. Aspectos básicos de los algoritmos genéticos 7 1.4. Operacionalidad de los algoritmos genéticos simples 1.4.1. Características de los algoritmos genéticos simples 1.4.2. Ejecución del proceso de los algoritmos genéticos simples 1.4.3. Operadores genéticos 9 9 11 13 1.4.4. Ejemplo manual de optimización numérica mediante el AGS 15 1.4.5. Código fuente de un algoritmo genético simple 23 CAPÍTULO II 25 MÉTODOS CLÁSICOS DE OPTIMIZACIÓN NUMÉRICA 25 2.1. Algoritmo del gradiente con paso constante 2.1.1. Ejemplo manual del algoritmo del gradiente con paso constante UNIVERSIDAD NACIONAL ABIERTA 25 27 iii 2.2. Algoritmo de Newton con paso constante 2.2.1. Ejemplo manual del algoritmo de Newton con paso constante 29 31 CAPÍTULO III 32 ENSAYOS DE APLICACIÓN DEL ALGORITMO GENÉTICO SIMPLE Y DE LOS MÉTODOS CLÁSICOS EN LA OPTIMIZACIÓN NUMÉRICA 32 3.1. Evaluación de la función Y = x 2 sen 2 (10πx) + 1 en el dominio [0,2] 32 3.1.1. Aplicación del algoritmo genético simple 3.1.2. Aplicación de los métodos clásicos de optimización numérica 3.2. Evaluación de la función Z = 0,5 + sen 2 ( ) x 2 + y 2 − 0,5 (1 + 0,001(x 2 + y2 )) 2 33 39 , en el dominio [-200, 200] X [- 200, 200] 3.2.1. Aplicación del algoritmo genético simple 3.2.2. Aplicación de los métodos clásicos de optimización numérica 40 41 42 CAPÍTULO IV 43 POSIBLES MODIFICACIONES AL ALGORITMO GENÉTICO SIMPLE Y CONCLUSIONES 43 4.1 Modificaciones sobre los operadores genéticos 4.1.1. Selección (Elitismo) 4.1.2. Cruce (Varios tipos) 4.1.1. Mutación 43 44 45 45 4.2 45 Conclusiones ANEXO 1 ARTÍCULO DE PRENSA PUBLICADO EN EL CUERPO 4-8 DEL UNIVERSAL, EL 09/04/2006 47 ANEXO 2 CÓDIGO FUENTE DEL ALGORITMO GENÉTICO SIMPLE 50 A.2.1. Para funciones reales de una variable 50 A.2.2. Para funciones reales de dos variables 56 ANEXO 3 HERRAMIENTAS COMPUTACIONALES UTILIZADAS 62 REFERENCIA BIBLIOGRÁFICA 63 UNIVERSIDAD NACIONAL ABIERTA iv LISTA DE ILUSTRACIONES GRÁFICO Página 1. Diagrama de flujos del proceso del algoritmo genético simple 12 2. Figura Nº 1 gráfica de la función Y = x 2 sen 2 (10πx) + 1 35 3. Figura Nº 2 Valores regulares de la función para distintas generaciones 39 4. Figura Nº 3 Número de mutaciones y cruces para distintas generaciones 40 5. Figura Nº 4 Función de aptitud acumulada distintas generaciones 40 6. Figura Nº 5 Valores regulares de la función en la población inicial 41 7. Figura Nº 6 Valores regulares de la función en la población final 41 8. Figura Nº 7 gráfica de la función [-10, 10] X [-10-, 10] 9. Figura Nº 8 gráficas de la función [-5, 5] X [0, 2,5] Z = 0,5 + ⎛ ⎞ sen 2 ⎜⎜ x 2 + y 2 ⎟⎟ − 0,5 ⎝ ⎠ 2 ⎛ ⎛ x 2 + y2 ⎞ ⎞ + 1 0,001 ⎜ ⎜ ⎟⎟ ⎝ ⎠⎠ ⎝ ⎛ sen 2 ⎜⎜ x 2 + y 2 ⎝ Z = 0,5 + ⎛ ⎛ 2 ⎜ 1 + 0,001 ⎜ x + ⎝ ⎝ ⎞ ⎟ − 0,5 ⎟ ⎠ 2 ⎞ y 2 ⎞⎟ ⎟ ⎠⎠ en el dominio 42 en el dominio 43 TABLAS I. Tabla N° 1 Resumen de resultados empíricos UNIVERSIDAD NACIONAL ABIERTA 37 v RESUMEN El objeto del presente trabajo de grado es utilizar el concepto de algoritmo genético simple aplicado a la optimización de funciones de variable real (una y dos variables), siguiendo como referencia el libro intitulado Genetic Algorithms in Search, Optimization, and Machine Learning, cuyo autor es D. E. Golberg (1989), en cuanto al aspecto conceptual y al uso de las rutinas algorítmicas que en el mencionado texto se describen (modificadas brevemente por el autor). Los resultados de los ensayos experimentales realizados aplicando esta novedosa herramienta se compararon con los obtenidos mediante los métodos tradicionales de optimización numérica permitiendo evidenciar la potencialidad del algoritmo genético simple en un escenario donde las funciones presentan en su dominio de definición: oscilaciones moderadas y la existencia de varios máximos locales. El campo de aplicación de esta herramienta se encuentra en el conjunto de las funciones para las cuales las técnicas tradicionales especializadas fallan o no aplican. El tema de la convergencia del algoritmo genético no fue revisado en ninguno de sus aspectos. Aunque los resultados provenientes del algoritmo genético son incuestionablemente mejores no pretendemos demostrar que el mismo sea siempre más eficiente para resolver problemas de optimización. Palabras claves: algoritmo, genético, optimización, funciones, reales. UNIVERSIDAD NACIONAL ABIERTA vi GLOSARIO DE TÉRMINOS ADN (ácido desoxirribonucleico): Es el compuesto contenido en el cromosoma, responsable de la transmisión del material genético de la célula en el proceso de división celular conducente a la reproducción de un organismo. Alelo: Variantes o formas alternativas de un gen. Algoritmo: Procedimiento iterativo utilizado para resolver un problema matemático. Convergencia: Se dice que un objeto matemático posee la característica de convergencia (o converge), si tiende o se dirige a un objeto (o al mismo objeto) en la medida que sus elementos independientes varían en una dirección y sentido específicos. Cromosoma: Es una diminuta estructura filiforme compuesta por ácidos nucleicos y proteínas, presente en todas las células vegetales y animales. Error: Diferencia que existe entre un objeto matemático y otro mediante el cual intentamos representarlo. Evolución: Consiste en el proceso de transitar, en inmensos lapsos de tiempo, por una serie progresiva de transformaciones conducentes a una cúspide habitada por mentes supremas. Evolucionismo: Doctrina filosófica o científica basada en la evolución. Evolucionista: Ente partidario del evolucionismo. Fenotipo: Conjunto de características hereditarias comunes a una determinada especie vegetal o animal debido a la existencia de genes semejantes. Gen: Cada una de las partículas que en el núcleo de la célula condicionan la transmisión de los caracteres hereditarios. Genética: Es la ciencia que estudia la herencia biológica y la variación, apoyándose en las leyes y principios que gobiernan las semejanzas y diferencias entre los individuos de una misma especie. Genotipo: Conjunto de factores hereditarios legítimos de un individuo o de una especie. UNIVERSIDAD NACIONAL ABIERTA vii Gradiente: Sea f una función diferenciable sobre un abierto de un espacio vectorial euclídeo E de dimensión finita. La diferencial de f se identifica a un campo de vectores, → ⎛ ⎛→⎞ →⎞ ⎝ ⎝ ⎠ ⎠ llamado gradiente de f y notado grad f, gracias a la relación d → f , h = ⎜ grad f ⎜⎜ x ⎟⎟ / h ⎟ . ⎜ ⎟ x Herencia: Tendencia de la naturaleza a reproducir en los seres los caracteres de sus antepasados. Mecánica molecular: Estudio de los movimientos de las moléculas y de sus átomos. Optimización: Acción y efecto de buscar el objeto de mejor desempeño, calificado mediante una función de aptitud o métrica. Promedio: Término medio o representante de un conjunto de objetos numéricos. UNIVERSIDAD NACIONAL ABIERTA viii INTRODUCCIÓN El objeto de esta monografía es introducir el concepto de algoritmo genético e ilustrar alguna de sus aplicaciones. El algoritmo genético simple fue desarrollado por John Holland profesor de la Universidad de Michigan en Ann Arbor en los años setenta aunque las ideas de programas que usan técnicas evolutivas fueron desarrolladas en años anteriores. Se trata de un mecanismo de búsqueda de soluciones para diversos problemas basado en las ideas de la evolución de las especies de Darwin. Forma parte de un conjunto de técnicas computacionales que simulan procesos biológicos o naturales, entre estos se encuentran las redes neuronales, el recocido simulado y los propios algoritmos genéticos. Debemos señalar que desarrollamos en este trabajo de grado el algoritmo genético simple tal como aparece explicado en el libro de Goldberg (1989) (ver bibliografía). No nos ocupamos en detalle de la extensa gama de variaciones del algoritmo genético y sólo al final revisamos algunas de las posibilidades. Cabe señalar que actualmente diversas investigaciones se desarrollan en el campo de los algoritmos genéticos pero no vamos a detenernos en ellas. En cambio explicaremos en detalle el algoritmo genético simple y lo aplicaremos en el proceso de optimización de funciones de variable real (una y dos variables); también compararemos nuestros resultados con los que se obtienen con el clásico método del gradiente, el cual asume la regularidad de la función objetivo. La monografía en su capítulo primero, empieza explicando las nociones básicas del mecanismo de la herencia desde el punto de vista de la biología, así como la estructura en detalle del algoritmo genético simple. Una corrida del mismo es realizada prácticamente a mano, para ilustrar los diversos operadores genéticos y su implementación. UNIVERSIDAD NACIONAL ABIERTA ix En el siguiente capítulo se exponen algunos métodos de optimización del análisis numérico, tales como el algoritmo del gradiente con paso constante y el algoritmo de Newton con paso constante. En el capítulo tercero se exponen los resultados numéricos, que arroja el algoritmo genético simple al optimizar funciones de una y dos variables, que oscilan moderadamente y comparamos estos resultados con los que se obtiene aplicando el algoritmo del gradiente con paso constante. Aunque los resultados provenientes del algoritmo genético simple son incuestionablemente mejores, no pretendemos demostrar que el mismo sea siempre más eficiente para resolver problemas de optimización. En el último capítulo exponemos las conclusiones del trabajo y mencionamos brevemente algunas de las posibles modificaciones del algoritmo genético. Debemos señalar que no hemos tocado el problema de la convergencia del algoritmo genético, en particular no presentamos el “Teorema Fundamental” de Holland que carece de rigurosidad matemática y que ha motivado el uso de cadenas de Markov para presentar los aspectos de convergencia con una base sólida (ver Rudolph (1994) en la bibliografía). En una serie de anexos se presenta el código fuente del programa del algoritmo genético simple en lenguaje pascal y las características técnicas del computador y del compilador donde se realizaron los experimentos. Debemos señalar que el programa fue modificado del original del libro de Goldberg (1989), traduciendo al idioma castellano las salidas y declaraciones del mismo e incluyendo la posibilidad de trabajar con varias variables. Por último, esperamos que este trabajo pueda servir de apoyo a los ingenieros, matemáticos y profesionales en general que busquen en el algoritmo genético una UNIVERSIDAD NACIONAL ABIERTA x herramienta para resolver problemas, presentando una exposición auto contenida y concisa del mismo UNIVERSIDAD NACIONAL ABIERTA xi CAPÍTULO I Los algoritmos genéticos 1.1. Breve acercamiento a la biología genética Se denomina gen la porción o sección particular de un cromosoma 1 que contiene las instrucciones o el material necesario para que un ser vivo presente un rasgo específico (por ejemplo: color del cabello, estatura, color de los pétalos, producción de las proteínas, color de la piel, etc.). Un gen está siempre localizado en la misma parte de un cromosoma determinado, y a este sitio se le denomina locus (del latín “lugar”). Debido a que los cromosomas están ubicados en parejas, en cada uno de los cromosomas homólogos están presentes los mismos genes, pero cada cromosoma puede presentar una variante de estos genes. A cada una de las variantes o formas alternativas de un gen se le llama alelo, y cada alelo se ubica siempre en el mismo locus dentro del cromosoma. La evolución se puede definir como los cambios en el pool o conjunto genético de una población. Según los informáticos evolucionistas, la evolución optimiza a la naturaleza, puesto que va creando seres cada vez más perfectos, cuya cumbre es el hombre. Indicios adicionales de esta optimización se encuentran en el organismo de los animales, desde el tamaño y tasa de ramificación de las arterias, diseñados para maximizar el flujo de sangre, hasta el conjunto de reacciones del metabolismo, diseñado para maximizar la cantidad de energía extraída de los alimentos. 1 Cromosoma: Elemento que existe en el núcleo de las células en el momento de su división o mitosis. UNIVERSIDAD NACIONAL ABIERTA 1 Los mecanismos de cambio en la evolución alteran la proporción de un tipo determinado de alelos en una población específica, bien sea disminuyendo la variabilidad de los mismos o aumentándola. Los principales mecanismos que disminuyen la variabilidad son los siguientes: Selección natural: Mecanismo mediante el cual los individuos que tengan algún rasgo que los haga menos válidos para realizar su tarea de seres vivos, no llegan a reproducirse, y, por tanto, su patrimonio genético desaparece del pool; incluso algunos de ellos ni siquiera llegan a nacer. Deriva génica: El simple hecho de que un alelo sea más común que otro en la población, causa que la proporción de alelos de esta población vaya aumentando en una población aislada (efecto fundador). Los más importantes mecanismos que aumentan la variabilidad, los cuales suceden generalmente en el ámbito molecular, son los siguientes: Mutación: Es una alteración del código genético que puede suceder por múltiples razones y que se presenta en la naturaleza con una probabilidad muy baja de ocurrencia. Por generar nuevos individuos, es considerada el motor de la evolución. En el proceso de formación del ser humano, la enzima ADN polimerasa es la sustancia motivadora de cambios. Poliploidía: Las células normales poseen dos copias de cada cromosoma (diploide) y las células reproductivas una copia (haploides), sin embargo, puede suceder por accidente que alguna célula reproductiva tenga dos copias cada una, en tal caso, si se lograra combinar con otra célula diploide o haploide dará lugar a un ser vivo con varias copias de cada cromosoma (poliploide). La mayoría de las veces, la poliploidía da lugar a individuos con algún defecto genético (por ejemplo, el tener 3 copias del cromosoma 21 da lugar al Síndrome de Down), aunque en algunos casos se crean individuos viables. Un caso conocido de mutación fue el producido en el mosquito culex pipiens, en el cual se duplicó un gen que generaba una enzima que rompía los organofosfatos, componentes habituales de los insecticidas. UNIVERSIDAD NACIONAL ABIERTA 2 Recombinación: Cuando dos células sexuales o gametos 2 , una masculina y otra femenina se combinan, los cromosomas de cada una de ellas también lo hacen, intercambiándose genes, que a partir de ese momento pertenecerán a un cromosoma diferente. A veces también se produce traslocación dentro de un cromosoma: una secuencia de código se elimina de un sitio y aparece en otro sitio del cromosoma, o en otro cromosoma. Flujo genético: Es un intercambio de material genético entre seres vivos de diferentes especies que suelen ser virus o bacterias. Normalmente este intercambio se produce a través de un vector mediante el cual incorporan a su material genético genes procedentes de una especie a la que infectan y a su vez cuando infectan a un individuo de otra especie pueden transmitirle sus genes a los tejidos generativos de gametos. De este conjunto de mecanismos, la selección natural actúa sobre el fenotipo y suele disminuir la diversidad, haciendo que sobrevivan sólo los individuos más aptos; los mecanismos que generan diversidad al combinar características actúan habitualmente sobre el genotipo. Aunque los detalles de la evolución no han sido completamente comprendidos, incluso hoy, existen algunas premisas en los que se fundamentan: ♦ La evolución es un problema que opera a nivel de cromosomas, y no a nivel de individuos. Cada individuo es codificado como un conjunto de cromosomas. ♦ La selección natural es el mecanismo mediante el cual los individuos mejor adaptados son los que tienen mayores posibilidades de reproducirse. ♦ El proceso evolutivo tiene lugar en la etapa de la reproducción. Sin embargo, los genetistas y los biólogos evolucionistas afirman que la evolución no sólo optimiza, sino que también adapta localmente en el espacio y en el tiempo; en cierto sentido, evolución significa progreso. Un organismo más evolucionado puede estar en desventaja competitiva con uno de sus antepasados, si se colocan en el ambiente de estos últimos. 2 Gameto: Célula reproductiva, masculina o femenina, cuyo núcleo sólo contiene n cromosomas UNIVERSIDAD NACIONAL ABIERTA 3 1.2. Historia furtiva 1.2.1. De la teoría de la evolución La hipótesis de la teoría de la evolución, la cual se basa en que pequeños cambios heredables en los seres vivos y la selección natural son los dos hechos que provocan los cambios en la naturaleza y la generación de nuevas especies; fue descrita, aun desconociendo cual era la base de la herencia, por Charles Darwin (1859) en su libro “El Origen de las Especies” y presentada junto con Wallace, quien llegó a las mismas conclusiones de forma independiente. El señor Darwin pensaba que los rasgos de un ser vivo eran como un fluido, y que los elementos de los dos padres se mezclaban de manera continua en la descendencia; la debilidad de esta hipótesis estaba en que al cabo de cierto tiempo una población determinada tendría los mismos rasgos intermedios. En estudio publicado en la revista estadounidense Science (2006), se confirma que la reconstrucción del proceso de evolución de la mecánica molecular por etapas satisface los principios de la teoría de la evolución de Charles Darwin, lo cual demuestra la validez actual de este planteamiento (Véase Anexo 1). Quien descubrió que los caracteres se heredaban en forma discreta, y que se tomaban del padre o de la madre, dependiendo de su carácter dominante o recesivo, fue el monje agustino Gregor Mendel (1864) a través de experimentos realizados con arvejas para intentar responder algunas interrogantes del problema de la herencia. Las teorías de Mendel, quien trabajó en total aislamiento, se olvidaron y no se volvieron a redescubrir hasta principios del siglo XX. En 1902 el norteamericano Walter Sutton y el alemán Theodor Boverí, cada uno por su cuenta, advirtieron que el comportamiento de los cromosomas durante la meiosis 3 tenía una conducta paralela con la de los factores mendelianos en la transmisión de la herencia. 3 Meiosis: División celular mediante la cual una célula reproductora diploide (con cromosomas homólogos) se divide en cuatro células haploides (los cromosomas no tienen parejas y la información genética no está por UNIVERSIDAD NACIONAL ABIERTA 4 W. Sutton y T. Boverí (1902) concluyeron que los factores hereditarios de que hablaba Mendel se encuentran localizados en los cromosomas, en el interior del núcleo celular. Este es el enunciado fundamental de la teoría cromosómica de la herencia. A partir de este hallazgo, se consideró que los factores hereditarios tenían una localización muy específica en el cromosoma y que al separarse cada uno de los cromosomas homólogos, se estaban separando por consiguiente los dos factores encargados de un rasgo determinado. 1.2.2. De los algoritmos genéticos El inicio de los estudios de lo que hoy podría llamarse algoritmos genéticos se presentó a finales de los años 50 y principios de los 60, en manos de biólogos evolucionistas que buscaban la explicación de los modelos de comportamiento de la evolución natural, mediante la optimización. En 1965; Ingo Rechenberg, profesor de la Universidad Técnica de Berlín, introdujo una técnica que llamó estrategia evolutiva, en la que no había población ni cruzamiento: cada padre mutaba para producir un descendiente y se conservaba el mejor de los dos, convirtiéndose en el padre de la siguiente ronda de mutación. Versiones posteriores de esta técnica introdujeron la idea de población. En 1966; L.J. Fogel, A.J. Owens y M.J. Walsh introdujeron en Norte América una técnica que se llamó programación evolutiva. En este método, las soluciones candidatas para los problemas se representaban como máquinas de estado finito sencillas; y al igual que en la estrategia evolutiva de Rechenberg, el algoritmo funcionaba mutando aleatoriamente dos máquinas simuladas y conservando la mejor de las dos. A finales de la década de los años 60; John Holland, siendo investigador de la Universidad de Michigan, desarrolló una técnica que permitió incorporar la selección natural a un programa. Luego de estudios a través de los cuales comprendió que la evolución es una forma de adaptación más potente que el aprendizaje, tomó Holland la decisión de duplicado). Durante tal proceso, cada par de cromosomas homólogos presentes originalmente en la célula reproductora se separan y cada célula hija resultante contiene sólo uno de cada dos cromosomas homólogos. UNIVERSIDAD NACIONAL ABIERTA 5 aplicar sus ideas sobre el tema para desarrollar programas adaptados a un fin específico. En el curso que dictaba en la mencionada universidad, denominado Teoría de Sistemas Adaptativos, con la participación de los estudiantes surgieron las ideas embrionarias de lo que se convertiría definitivamente en los algoritmos genéticos. Los objetivos de la investigación de John Holland fueron los siguientes: a. Imitar los procesos adaptativos de los sistemas naturales y b. Diseñar sistemas artificiales (normalmente programas) que retengan los mecanismos más importantes de los sistemas naturales. Más tarde David Goldberg (1989), alumno de Holland, fue pionero en tratar de aplicar los algoritmos genéticos a problemas industriales, logrando resultados favorables. El gran objetivo de Holland era lograr que las computadoras aprendieran por sí mismas, técnica que él inventó y denominó originalmente “planes reproductivos”, conocida de manera popular bajo el nombre de “algoritmo genético” después de la publicación de su libro en 1975. Como se observa, el motor de todos los elementos relacionados con los algoritmos genéticos se haya alimentado en la simple y poderosa idea de Charles Darwin: “El azar en la variación, junto con la ley de selección, es una técnica de resolución de problemas de gran complejidad y de aplicación casi ilimitada.” Por último, es importante señalar que los algoritmos genéticos se utilizan para abordar una amplia variedad de problemas en un conjunto de campos sumamente diversos, demostrando claramente su capacidad y potencialidad. Dentro de sus múltiples aplicaciones en diversas áreas, una pequeña muestra de éstas, se encuentra en los siguientes ejemplos: 1) Diseño de salas de concierto con propiedades acústicas óptimas (Acústica). 2) Diseño de la forma del ala de un avión supersónico (Ingeniería aeroespacial). 3) Producción de curvas ajustadas a los datos en el problema de la curva de rotación galáctica (Astronomía y Astrofísica). 4) Diseños de fármacos, en la llamada química combinatoria (Química). UNIVERSIDAD NACIONAL ABIERTA 6 5) Construcción de placas especiales de circuitos reconocedores de voz (Ingeniería eléctrica). 6) Predicción del rendimiento futuro de acciones (Mercados financieros). 7) Evolución de redes neuronales que pudieran jugar damas (Juegos). 8) Utilización para los hipocentros de los terremotos, basándose en datos sismológicos (Geofísica). 9) Diseño de polímeros conductores de electricidad basados en el carbono, conocidos como polianilinas (Ingeniería de materiales). 10) Descubrimiento de una regla para el problema de clasificación por mayoría en autómatas celulares de una dimensión (Matemática y algoritmia). 11) Evolución de planes tácticos para las batallas militares (Ejército y cumplimiento de la ley). 12) Detección de la presencia de ciertas sustancias en el exterior de la célula o transportarla hacia el interior de ésta (Biología nuclear). 13) Evolución de un complejo sistema de reconocimiento de patrones con una amplia variedad de usos potenciales (Reconocimiento de patrones y explotación de datos). 14) Promoción de nuevas tecnologías en el campeonato anual de fútbol entre equipos de robots autónomos (Robótica). 15) Diseño de horarios de los exámenes universitarios (Diseño de rutas y horarios). 16) Diseño de molinos eólicos para generar energía eléctrica, mediante tarea multiobjetivos (Ingeniería de sistema). 1.3. Aspectos básicos de los algoritmos genéticos Se presenta en este aparte, un conjunto de factores básicos requeridos para poder abordar la técnica de optimización mediante la aplicación de los algoritmos genéticos, los cuales irán acompañados de ejemplos sencillos que permitan comprender su proceso. UNIVERSIDAD NACIONAL ABIERTA 7 Los algoritmos genéticos son métodos de búsqueda y optimización basados en la teoría de la evolución de Charles Darwin, los cuales constituyen uno de los focos de mayor atractivo para los investigadores de las diversas ramas del saber. El método de búsqueda está basado en los mecanismos de selección que utiliza la naturaleza para que los individuos más aptos de una población sobrevivan, debido a su capacidad para adaptarse más fácilmente a los cambios que se producen en su entorno. Estos cambios que se efectúan en los genes de un individuo y cuyos atributos son transmitidos a sus descendientes cuando éstos se reproducen sexualmente. John Koza (1992), profesor de la Universidad de Stanford, propone la siguiente definición de algoritmo genético: “Es un algoritmo matemático altamente paralelo que transforma un conjunto de objetos matemáticos individuales con respecto al tiempo usando operaciones modeladas de acuerdo al principio Darwiniano de reproducción y supervivencia del más apto, y tras haberse presentado de forma natural una serie de operaciones genéticas de entre las que se destaca la recombinación sexual. Cada uno de estos objetos matemáticos suelen ser una cadena de caracteres (letras o números) de longitud fija que se ajusta al modelo de las cadenas de cromosomas, y se les asocia con una cierta función matemática que refleja su aptitud.” Los algoritmos genéticos están enmarcados junto con la programación evolutiva, las estrategias evolutivas, los sistemas clasificadores y la programación genética dentro una rama de la computación denominada computación evolutiva. Las bases biológicas de estos algoritmos y sus diferencias se centran en los operadores que utilizan en sus procesos. En la lista siguiente indican de las técnicas mencionadas anteriormente y sus respectivos objetivos: Nombre de la técnica Objetivo Algoritmo genético Individuo óptimo Programación genética Programa óptimo Programación evolutiva Operador genético óptimo Estrategia Evolutiva Aprendizaje óptimo Sistema clasificador Población óptima UNIVERSIDAD NACIONAL ABIERTA 8 1.4. Operacionalidad de los algoritmos genéticos simples 1.4.1. Características de los algoritmos genéticos simples La aplicación más común de los algoritmos genéticos simples (AGS) ha sido la solución de problemas de optimización, donde han mostrado alta eficiencia y gran confiabilidad. Sin embargo no todos los problemas son apropiados para ser resueltos por esta técnica; las siguientes características son fundamentales para su aplicación: ♦ El espacio de búsqueda (sus posibles soluciones) debe estar delimitado dentro de un cierto rango. ♦ Se debe definir una función de aptitud que indique qué tan buena o mala es la adaptación de los individuos. ♦ Las posibles soluciones se codifican utilizando el código binario (0’s y 1’s). El espacio de búsqueda debe ser siempre discreto (aunque sea muy grande). Sin embargo, también podrá intentarse usar la técnica con espacios de búsqueda continuos, cuando exista un rango relativamente pequeño. La función de aptitud (o alguna modificación de ésta) es la función objetivo del problema de optimización tratado. El resultado que produce ésta es un número real, preferiblemente no negativo que a mayor resultado es mejor la solución. El algoritmo genético únicamente maximiza, pero la minimización puede realizarse fácilmente utilizando el reciproco de la función maximizante, siempre que el mismo esté determinado. Una característica que debe presentar la función es que tiene que ser capaz de castigar a las malas soluciones y de premiar a las buenas, de forma que sean estas últimas las que se propaguen con mayor rapidez. Dentro del conjunto de ventajas y desventajas manifiestas en la técnica de búsqueda y optimización mediante el uso de los algoritmos genéticos simples, podemos mencionar las siguientes: Ventajas: UNIVERSIDAD NACIONAL ABIERTA 9 a. No necesitan conocimientos específicos sobre el problema que intentan resolver, en particular si la función es “regular”. b. Operan de forma simultánea con varias soluciones, en vez de trabajar de forma secuencial como las técnicas tradicionales. c. Cuando se usan para problemas de optimización (maximizar una función objetivo) resultan menos afectadas por los máximos locales (aparentes soluciones) que las técnicas tradicionales. Esta importante ventaja servirá de plataforma para el desarrollo de las pruebas empíricas, que permitirán demostrar su potencialidad, la cual constituirá el objetivo principal de esta monografía. d. Resulta sumamente fácil ejecutarlos en las modernas arquitecturas masivamente paralelas. e. Usan operadores probabilísticos, en vez de los típicos operadores determinísticos de las otras técnicas. Desventajas: a. Es difícil determinar la velocidad de convergencia (o aún la convergencia), dependiendo en cierta medida de los parámetros que se utilicen (tamaño de la población, número de generaciones, nivel de precisión deseado, etc.). b. Pueden converger prematuramente debido a una serie de problemas relacionados con los valores de sus parámetros. Dado un problema específico a resolver, la entrada del algoritmo genético simple representa un conjunto de soluciones potenciales del mismo, codificadas mediante el alfabeto binario y una métrica llamada función de aptitud que permite evaluar cuantitativamente a cada candidata. Estas candidatas pueden ser soluciones factibles, con el objetivo de que el AGS las mejore, pero se suelen generar aleatoriamente. UNIVERSIDAD NACIONAL ABIERTA 10 1.4.2. Ejecución del proceso de los algoritmos genéticos simples Los pasos que se ejecutan en el proceso de aplicación de los algoritmos genéticos simples para la simulación sucinta de la evolución natural, se presentan en el siguiente diagrama: UNIVERSIDAD NACIONAL ABIERTA 11 Diagrama de flujos del proceso del algoritmo genético simple Codificar el dominio del problema Generar un conjunto aleatorio de N soluciones factibles Calificar cada solución factible (aplicar la función de aptitud) A Seleccionar dos individuos de acuerdo a su calificación B Cruzar o mezclar los códigos genéticos de los dos individuos seleccionados Mutar algunos elementos del código genético de ciertos individuos Incluir a los dos nuevos en una nueva población Condición de finalizar? si Fin no A La nueva Población tiene N individuos? si Denominarla población actual no B UNIVERSIDAD NACIONAL ABIERTA 12 1.4.3. Operadores genéticos Los operadores genéticos de mayor uso en la aplicación de los algoritmos genéticos simples son descritos brevemente y además utilizados en los casos prácticos a desarrollar el siguiente capítulo. a. Selección Dado el conjunto de individuos de la población actual con una probabilidad proporcional a su calificación, la operación de selección consiste en elegir dentro del mencionado conjunto, a los individuos mejor adaptados al medio en términos del resultado de la función de aptitud. Entre las múltiples formas de selección comúnmente utilizadas cabe mencionar a las siguientes: selección proporcional a la aptitud, selección por rueda de ruleta, selección elitista, selección escalada, selección por torneo, selección por rango, selección generacional, selección por estado estacionario, selección jerárquica. Para el caso del algoritmo genético simple, la selección de mayor popularidad es la selección proporcional a la aptitud equivalente a la selección por rueda de ruleta. b. Cruce Cruzar o mezclar los códigos genéticos de dos individuos seleccionados como padres para generar hijos que posean códigos mixtos. Este operador genético también tiene varias acepciones, debido a que existen muchas formas de hacerlo, sin embargo, para nuestro caso utilizaremos el cruzamiento de un punto (1-point crossover) el cual se escoge al azar. 1. Mediante el Proceso de Bernoulli 4 (con probabilidad pc de éxito). 2. Si ocurre un éxito cruzar o mezclar los códigos de los dos individuos seleccionados para formar dos sujetos mixtos, a los que llamaremos nuevos individuos. 4 Un experimento de Bernoulli es aquel en el que pueden ocurrir exclusivamente dos eventos posibles, uno con probabilidad de éxito pc y otro con probabilidad de fracaso 1-pc). UNIVERSIDAD NACIONAL ABIERTA 13 3. Si ocurre un fracaso llamamos a los individuos seleccionados nuevos individuos. Gráficamente el operador genético de cruzamiento de un punto (1-point crossover), con punto de cruce en la tercera posición del cromosoma, es como sigue: Puntos de Cruce Padres 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 Descendientes 1 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 c. Mutación Mutar o alterar deliberadamente algunos elementos del código de ciertos individuos, los cuales se seleccionan aleatoriamente, para así generar nuevos individuos ubicados en regiones del problema no exploradas aún. 1. Por cada bit de cada nuevo individuo, mediante el Proceso de Bernoulli (con probabilidad pm de éxito). 2 Si ocurre un éxito cambiar el bit en turno por su complemento. 3 Si ocurre un fracaso el bit permanece inalterado. Gráficamente el operador genético de mutación como sigue: 1 1 1 0 1 0 1 0 0 1 1 0 Descendiente 1 1 1 0 1 1 1 0 0 1 1 0 Descendiente mutado Los gen mutado parámetros del algoritmo genético que deben ser tomados en cuenta al realizar un ensayo empírico son: los valores de probabilidad para los operadores reproducción, cruce y mutación, el tamaño de la población, el número de generaciones, la precisión deseada y el UNIVERSIDAD NACIONAL ABIERTA 14 tipo de selección a utilizar. Además, es necesario establecer el rango o el intervalo de búsqueda y la codificación de la función objetivo. Los parámetros empíricos recomendables para el algoritmo genético simple se señalan a continuación: Número de generaciones 57 Tamaño de la población 47 Probabilidad de cruce 0,60 Probabilidad de mutación 0,03 Selección ruleta La convergencia del algoritmo genético simple, se apoya en el siguiente enunciado “Siendo que el algoritmo genético simple opera con una población en cada iteración, es de esperarse que el método, al final del proceso, de cómo resultado que la mayoría de los individuos de la población sean muy similares, y que en el infinito todos sean iguales.” La teoría para estudiar la convergencia de estos algoritmos en caso de cadenas binarias, se basa principalmente en considerar que una cadena es un representante de una clase de equivalencia o esquema. John Holland, con el Teorema los Esquemas, intenta dar respuesta a que si existe una manera matemática que indique como se afectará a la siguiente generación en el proceso evolutivo, el cual depende de la selección, cruce y mutación. A partir de los resultados, el Teorema de los Esquemas (Teorema Fundamental), prueba que la población converge a unos esquemas que cada vez son más parecidos, y en el límite a una cadena única. El mencionado teorema ha sido cuestionado por muchos matemáticos, sin embargo el tiempo ha permitido avances importantes al respecto, lo cual da robustez al mismo. 1.4.4. Ejemplo manual de optimización numérica mediante el AGS UNIVERSIDAD NACIONAL ABIERTA 15 Para la función f ( x ) = x 2 Usando un algoritmo genético simple con probabilidad de cruce pC = 0,60 y probabilidad de mutación pM = 0.03333, para 5 generaciones, con selección por torneo (este mecanismo de selección es distinto al utilizado en el Anexo 2, se indica sólo a manera de ilustración). Se desea encontrar el valor de x que hace que la función f(x) alcance su valor máximo, siendo el rango de la variable x los valores enteros comprendidos entre 0 y 31. Sabemos que el máximo se alcanza en x = 31, donde f vale 961. Lo primero que debemos hacer es codificar las posibles soluciones (posibles valores de x). Lo haremos con la codificación binaria. Esto es (0,0,0,0,0) equivale a x = 0 y que (1,1,1,1,1) equivale a x = 31. Cada posible valor de la variable x en representación binaria se le denomina individuo. Una colección de individuos constituye lo que se denomina población y el número de individuos que la componen es el tamaño de la población. Una vez que tenemos codificada la solución, debemos escoger un tamaño de población. Para este ejemplo vamos a escoger 6 individuos. Debemos partir de una población inicial. Una manera de generarla aleatoriamente, puede ser lanzando una moneda al aire; si sale cara, la primera componente del primer individuo es un 0 y en caso contrario es un 1. Se repite el lanzamiento de la moneda y tendremos la segunda componente del primer individuo (un 0 si sale cara y un 1 si sale sello). Así hasta 5 veces y se obtendrá el primer individuo. Se repite la secuencia anterior para generar los individuos restantes de la población. En total se realizan 5 * 6 = 30 lanzamientos de la moneda. Iteración 1 UNIVERSIDAD NACIONAL ABIERTA 16 El siguiente paso es hacer competir a los individuos entre sí. Que utilizaremos en nuestro caso como un proceso de selección. En la tabla 1 se resume este paso. Tabla 1.- SELECCIÓN N° del individuo Población inicial Valor de X Valor de F(x) Pareja asignada 1 (0,1,1,0,0) 12 144 6 2 (1,0,0,1,0) 18 324 3 3 (0,1,1,1,1) 15 225 2 4 (1,1,0,0,0) 24 576 5 5 (1,1,0,1,0) 26 676 4 6 (0,0,0,0,1) 1 1 1 Como de observa en la tabla precedente, el mejor individuo es el 5 (f(5) = 676). Al Calcular la media de f resulta fmed = 324,33. Ahora bien, una manera de realizar el proceso de selección es mediante un torneo entre dos. A cada individuo de la población se le asigna una pareja y entre ellos se establece un torneo: el mejor genera dos copias y el peor se descarta. En la última columna se indica la pareja asignada a cada individuo, lo cual se ha realizado aleatoriamente. Es importante resaltar, como se dijo anteriormente, que existen muchas variantes de este proceso de selección. Después de realizar el proceso de selección, la población que tenemos es la mostrada en la columna 2 de la tabla 2. Observamos, por ejemplo, que en el torneo entre el individuo 1 y el 6 de la población inicial, el primero de ellos ha recibido dos copias, mientras que el segundo no es tomado en cuenta. Este proceso se repite hasta completar la tabla 2 que sigue: Tabla 2.- CRUCE N° del individuo Población 1 Pareja asignada 1 (0,1,1,0,0) 5 2 (1,0,0,1,0) 3 3 (1,0,0,1,0) 2 4 (1,1,0,1,0) 6 5 (1,1,0,1,0) 1 6 (0,1,1,0,0) 4 Tras realizar la selección, se realiza el cruce. Que en este caso lo haremos mediante el cruce de un punto, esto es: se forman parejas entre los individuos aleatoriamente de UNIVERSIDAD NACIONAL ABIERTA 17 forma similar a la selección. Dados dos individuos pareja, que se van ha cruzar, se establece un punto de cruce aleatorio, que no es más que un número aleatorio entre 1 y 4 (la longitud del individuo menos 1). Por ejemplo, en la pareja 2-3 el punto de cruce es 3, lo que significa que un hijo de la pareja conserva los tres primeros bits de la pareja 2 y hereda los dos últimos de la pareja 3, mientras que el otro hijo de la pareja conserva los tres primeros bits de la pareja 3 y hereda los dos últimos de la pareja 2. La población resultante se muestra en la columna (2) de la tabla 3. Cabe destacar que en el ensayo en todas las parejas se efectuó el cruce y el individuo 2 sufrió una mutación en el bit 3. Tabla 3.- POBLACION TRAS EL CRUCE Y DE LA MUTACIÓN N° del individuo Población 1 Valor de X Valor de F(x) 1 (0,1,1,1,0) 14 196 2 (1,0,1,1,0) 22 484 3 (1,0,0,1,0) 18 324 4 (1,1,0,0,0) 24 576 5 (1,1,0,0,0) 24 576 6 (0,1,1,1,0) 14 196 Ahora el valor máximo de f es 576 (para los individuos 4 y 5), mientras que antes de la selección, el cruce y la mutación era de 676. Aunque el máximo individual disminuyó, se observa que fmed ha escalado de 324,3 a 392, significa que la población después de la selección, el cruce y la mutación es mejor que antes de estas transformaciones. El siguiente paso es volver a realizar la selección, el cruce y la mutación tomando como población inicial la de la tabla 3. Esta manera de proceder se repetirá hasta construir 5 generaciones y como el resultado será la mejor solución de la última iteración, aunque también se puede ir guardando la mejor solución de todas las iteraciones anteriores y al final tomar la mejor solución. En realidad un algoritmo genético no garantiza la obtención del óptimo pero, si está bien construido, proporcionará una solución razonablemente buena. Puede ocurrir también que se obtenga el óptimo, pero el algoritmo no tiene capacidad para, en ese momento, detener el proceso y dar información del resultado. Iteración 2 UNIVERSIDAD NACIONAL ABIERTA 18 Repitiendo todo el proceso indicado para la construcción de la pareja asignada, nos resulta la siguiente tabla poblacional donde aplicaremos el operador de selección tal como se hizo en la iteración 1: Tabla 1.- SELECCIÓN N° del individuo Población 2 Valor de X Valor de F(x) Pareja asignada 1 (0,1,1,1,0) 14 196 3 2 (1,0,1,1,0) 22 484 2 3 (1,0,0,1,0) 18 324 4 4 (1,1,0,0,0) 24 576 5 5 (1,1,0,0,0) 24 576 6 6 (0,1,1,1,0) 14 196 1 Después del proceso de selección tenemos a continuación la tabla de cruce para la iteración 1: Tabla 2.- CRUCE N° del individuo Población 2 Pareja asignada 1 (1,0,0,1,0) 5 2 (1,0,1,1,0) 6 3 (1,1,0,0,0) 3 4 (1,1,0,0,0) 4 5 (1,1,0,0,0) 1 6 (0,1,1,1,0) 2 Aplicando los operadores genéticos de cruce y mutación, nos resulta la siguiente tabla poblacional. Cabe destacar que en el ensayo en todas las parejas se efectuó el cruce y ningún individuo sufrió una mutación. Tabla 3.- POBLACION TRAS EL CRUCE Y DE LA MUTACIÓN N° del individuo Población 2 Valor de X Valor de F(x) 1 (1,0,0,0,0) 16 256 2 (1,0,1,1,0) 22 484 3 (1,1,0,1,0) 26 676 4 (1,1,0,0,0) 24 576 5 (1,1,0,1,0) 26 676 6 (0,1,1,1,0) 14 196 Ahora el valor máximo de f es 676 (para los individuos 3 y 5), que era el máximo en la población inicial, se observa que fmed ha aumentado de 392 a 473,33, nuevamente se UNIVERSIDAD NACIONAL ABIERTA 19 evidencia que la población va mejorando a medida que se le aplican los operadores genéticos a sus individuos. Repitiendo el proceso anterior, los resultados de las iteraciones restantes son los siguientes: Iteración 3 Tabla 1.- SELECCIÓN N° del individuo Población 3 Valor de X Valor de F(x) Pareja asignada 1 (1,0,0,0,0) 16 256 3 2 (1,0,1,1,0) 22 484 6 3 (1,1,0,1,0) 26 676 2 4 (1,1,0,0,0) 24 576 5 5 (1,1,0,1,0) 26 676 4 6 (0,1,1,1,0) 14 196 1 Tabla 2.- CRUCE N° del individuo Población 3 Pareja asignada 1 (1,1,0,1,0) 5 2 (1,0,1,1,0) 4 3 (1,1,0,1,0) 3 4 (1,1,0,1,0) 2 5 (1,1,0,0,0) 1 6 (1,0,0,0,0) 6 Tabla 3.- POBLACION TRAS EL CRUCE Y DE LA MUTACIÓN N° del individuo Población 3 Valor de X Valor de F(x) 1 (1,1,0,0,0) 24 576 2 (1,0,1,1,0) 20 400 3 (1,1,0,1,0) 26 676 4 (1,1,0,1,0) 24 576 5 (1,1,0,1,0) 26 676 6 (1,0,0,0,0) 16 256 En las parejas 3 y 6 se efectuó el cruce y ningún individuo sufrió una mutación. El valor máximo de f es 676 (individuos 3 y 5) y fmed ha aumentado de 473,33 a 500. UNIVERSIDAD NACIONAL ABIERTA 20 Iteración 4 Tabla 1.- SELECCIÓN N° del individuo Población 4 Valor de X Valor de F(x) Pareja asignada 1 (1,1,0,0,0) 24 576 2 2 (1,0,1,0,0) 20 400 1 3 (1,1,0,1,0) 26 676 6 4 (1,1,0,0,0) 24 576 5 5 (1,1,0,1,0) 26 676 3 6 (1,0,0,1,0) 18 196 4 Tabla 2.- CRUCE N° del individuo Población 4 Pareja asignada 1 (1,1,0,0,0) 6 2 (1,1,0,0,0) 4 3 (1,1,0,1,0) 5 4 (1,1,0,1,0) 2 5 (1,1,0,1,0) 3 6 (1,1,0,0,0) 1 Tabla 3.- POBLACION TRAS EL CRUCE Y DE LA MUTACIÓN N° del individuo Población 4 Valor de X Valor de F(x) 1 (1,1,0,0,0) 24 576 2 (1,1,0,0,0) 24 576 3 (1,1,0,1,0) 26 676 4 (1,1,0,0,0) 26 676 5 (1,1,0,1,0) 26 676 6 (1,0,0,1,0) 18 324 En todas las parejas se efectuó el cruce y ningún individuo sufrió una mutación. El valor máximo de f es 676 (individuos 3, 4 y 5) y fmed ha aumentado de 500 a 584. Iteración 5 Tabla 1.- SELECCIÓN N° del individuo Población 5 UNIVERSIDAD NACIONAL ABIERTA Valor de X Valor de F(x) Pareja asignada 21 1 (1,1,0,0,0) 24 576 5 2 (1,1,0,0,0) 24 576 4 3 (1,1,0,1,0) 26 676 1 4 (1,1,0,0,0) 26 676 3 5 (1,1,0,1,0) 26 676 6 6 (1,0,0,1,0) 18 324 2 Tabla 2.- CRUCE N° del individuo Población 5 Pareja asignada 1 (1,1,0,1,0) 3 2 (1,1,0,1,0) 6 3 (1,1,0,1,0) 1 4 (1,1,0,1,0) 5 5 (1,1,0,1,0) 4 6 (1,1,0,0,0) 2 Tabla 3.- POBLACION TRAS EL CRUCE Y DE LA MUTACIÓN N° del individuo Población 5 Valor de X Valor de F(x) 1 (1,1,0,1,0) 26 676 2 (1,1,0,0,0) 24 576 3 (1,1,0,1,0) 26 676 4 (1,1,0,1,0) 26 676 5 (1,1,0,1,0) 26 676 6 (1,0,1,1,0) 22 484 En todas las parejas se efectuó el cruce y el individuo 6 sufrió una mutación en el bit 3. El valor máximo de f es 676 (individuos 1, 3, 4 y 5) y fmed ha aumentado de 584 a 627,33. Como la condición del proceso es finalizar en la quinta generación, el algoritmo genético en este caso nos da como resultado que el máximo de la función para el intervalo estudiado es 676; se evidencia la necesidad de seguir iterando, en este caso, porque conocemos el valor máximo de la función. He aquí un problema real del algoritmo, que es la tendencia a la homegeinización de la población, es decir a que todos los individuos de la misma sean idénticos. Esto impide que el algoritmo siga explorando nuevas soluciones, con lo que podemos quedar estancados en un máximo local no muy bueno. Existen técnicas UNIVERSIDAD NACIONAL ABIERTA 22 para contrarrestar esta situación. El mecanismo más elemental, aunque no siempre suficientemente eficaz, es introducir una mutación tras la selección y el cruce. Una vez que se ha realizado la selección y el cruce se selecciona un número determinado de bits de la población y se alteran aleatoriamente. 1.4.5. Código fuente de un algoritmo genético simple Existen varios paquetes y bibliotecas de algoritmos genéticos en el mercado, sin embargo, de acuerdo a las características específicas de algún problema, se hace necesario reimplementar todo el algoritmo, en vez de emplear algún paquete preexistente. Algunos de esos paquetes son: • GALOPPS: Su dirección primaria en Internet es GARAGe.cps.msu.edu/software/software-index.html, y su dirección para descargarlo vía FTP es garage.cps.msu.edu/pub/GA/galopps/ • GAGS: Generador de aplicaciones basadas en algoritmos genéticos, escrito en C++. Desarrollado por el grupo de J.J. Melero. Excelente. Su dirección Web es kalel.ugr.es/gags.html, y su dirección para descargarlo vía FTP es kal-el.ugr.es/GAGS/. • FORTRAN GA: Desarrollo de algoritmos genéticos para Fortran. Su dirección Web es www.staff.uiuc.edu/~ carroll/ga.html. • Galib: Biblioteca de algoritmos genéticos de Matthew. Conjunto de clases en C++ de algoritmos genéticos. Su dirección Web es lancet.mit.edu/ga/, y su dirección para descargarlo vía FTP es lancet.mit.edu/pub/ga/. Podemos registrarlo en http://lancet.mit.edu/ga/Register.html. • GAS: Paquete para desarrollar aplicaciones de algoritmos genéticos en Python. Su dirección Web es starship.skyport.net/crew/gandalf, y su dirección para descargarlo vía FTP es ftp.coe.uga.edu/users/jae/ai. • GECO: Conjunto de herramientas para Lisp. Su dirección para descargarlo vía FTP es ftp://ftp.aic.nrl.navy.mil/pub/galist/src/. UNIVERSIDAD NACIONAL ABIERTA 23 • GPdata: Para desarrollar algoritmos genéticos en C++. Su dirección para descargarlo vía FTP es ftp.cs.bham.ac.uk/pub/authors/W.B.Langdon/gp-code/, y su documentación -GPdata-icga-95.ps- la podemos encontrar en el site de Internet cs.ucl.ac.uk/genetic/papers/. • gpjpp: Bibliotecas de clases para desarrollar algoritmos genéticos en Java Su dirección Web es www.turbopower.com/~ kimk/gpjpp.asp. • GP Kernel: Biblioteca de clases para programación genética en C++. Su dirección Web es www.emk.e-technik.th-darmstadt.de/~ thomasw/gp.html. • lil-gp: Herramientas para programación genética en C. Su dirección Web es isl.msu.edu/GA/software/lil-gp/index.html, y su dirección para descargarlo vía FTP es isl.cps.msu.edu/pub/GA/lilgp/. Podemos encontrar los parches para Linux en www.cs.umd.edu/users/seanl/patched-gp. • PGAPack: Parallel Genetic Algorithm Library. Biblioteca de algoritmos genéticos paralelos. Podemos encontrarlo en la dirección de Internet con un navegador en www.mcs.anl.gov/home/levine/PGAPACK/index.html, y su dirección para descargarlo vía FTP es ftp.mcs.anl.gov/pub/pgapack/. • Sugal: SUnderland Genetic ALgorithm system. Para hacer experimentos con algoritmos genéticos. Podemos encontrarlo en la dirección de Internet con el navegador en www.trajan-software.demon.co.uk/sugal.htm. • ADATE: Automatic Design of Algorithms Through Evolution. Programación evolutiva. Su dirección Web es www-ia.hiof.no/~ rolando/adate_intro.html. • GPsys: Sistema de programación genética en Java. Podemos encontrarlo en la dirección de Internet www.cs.ucl.ac.uk/staff/A.Qureshi/gpsys.html. En el Anexo 2 de esta monografía, se presenta el código fuente del algoritmo genético simple, en lenguaje pascal, aplicado a la optimización de las funciones reales de una y dos variables que fueron elegidas para ser estudiadas mediante esta herramienta. UNIVERSIDAD NACIONAL ABIERTA 24 CAPÍTULO II Métodos clásicos de optimización numérica En el conjunto de métodos clásicos de optimización numérica, existen dos grandes grupos, que lo podemos denominar algoritmos para problemas con restricciones (que requieren los valores de la función objetivo y el conjunto de restricciones) y algoritmos para problemas sin restricciones (que requieren los valores de la función objetivo y los valores de la o las derivadas de la función objetivo); en el primer grupo cabe mencionar el Método Simplex y en el segundo grupo, se ubican el Algoritmo del Gradiente con paso constante y el Algoritmo de Newton con paso constante, éstos, en nuestra opinión, es una buena representación de los métodos de optimización clásicos considerados no heurísticos, debido a que la búsqueda de los puntos óptimos se realiza mediante estrategias que no dependen de eventos aleatorios, lo cual los hace distintos al Algoritmo Genético Simple, en cuanto a sus mecanismos de funcionamiento. Procederemos en las líneas subsiguientes a indicar y a describir brevemente la rutina de los dos métodos antes mencionados, que utilizan los algoritmos para problemas sin restricciones, el cual es el tema que nos ocupa, a fin de tener una panorámica de estas alternativas de optimización numérica para comparar sus resultados con los obtenidos con la aplicación del algoritmo genético simple. 2.1. Algoritmo del gradiente con paso constante Este algoritmo es del tipo: { } Ω = x ∈ IR n / x verifica una condición necesaria de optimalidad , dado k x , en la iteración k se calcula un punto x k +1 = x k + t k d k , donde t k ∈ IR, d k ∈ IR n . Se ha demostrado que si d ∈ IR n , entonces ∇ f (x ), d > 0 UNIVERSIDAD NACIONAL ABIERTA por lo tan to existe T > 0 / f (x + td ) > f (x ), 0 < t < T . 25 Visto que el problema matemático consiste en maximizar f(x) para x ∈ IR , con f n continuamente diferenciable, es natural escoger en cada iteración una dirección dk tal ( ) ∇f x k , d k > 0 y la manera más sencilla de hacerlo es tomando que d k = ∇f (x k ). Los algoritmos del gradiente escogen así dk en cada iteración y por lo tanto difieren entre sí sólo en la manera de determinar el número tk llamado paso, el cual junto con dk define x k +1 = x k + t k d k . Para todos los algoritmos del gradiente se tiene Ω ={x ∈ IR n / ∇f ( x ) = 0}. Δ El algoritmo del gradiente con paso constante, es un algoritmo de búsqueda del valor óptimo de una función objetivo, el cual tiene la siguiente estructura: Inicio: Escoger x 0 ∈ IR n tal que { ( )} x0 = x / f ( x ) ≥ f x 0 es acotado, β ∈ (0,1) , hacer k=0, ir a la iteración k Iteración K paso 1: Calcular paso 2: Si ∇f (x k ) ∇f (x k ) = 0 parar si no, hacer ( d k = ∇f (x k ), λ = 1, ir al paso 3 ) ( Δ paso 3: Calcular Δ x , λ = f x + λd ( k k k ) − f (x ) − λ2 k ( ) ∇f x k 2 ) paso 4: Si Δ x , λ ≥ 0, hacer t k = λ ir al paso 5 k si no, hacer UNIVERSIDAD NACIONAL ABIERTA λ = βλ ir al paso 3 26 paso 5: x k +1 = x k + t k d k , k = k + 1, ir a la iteración k La siguiente proposición se apoya en un supuesto vital para la operatividad de este algoritmo: Proposición: Si f es dos veces continuamente diferenciable, si existen M>0, m>0 tales que − M y ≤ y, H ( x ) y ≤ − m y , 2 2 para todo y ∈ IR n , para todo x ∈ x0 , donde H es la matriz hessiana de f, entonces cualquier sucesión infinita generada por el algoritmo a partir x0 de converge ( ) ( ) linealmente ( ( ) ( )) f x − f x ≤q f x − f x , y * k q = 1− m 2M k * 0 hacia x − x ≤ Cq k * un k 2 punto x* Ω. de Además 1 ⎛ Mq ⎞ 2 0 * con C = ⎜ ⎟ x −x ⎝ m ⎠ m⎞ ⎛ ⎜1 + ⎟. ⎝ M⎠ 2.1.1. Ejemplo manual del algoritmo del gradiente con paso constante Aplicar el AGPC para obtener algunos términos de la sucesión que converge al valor óptimo de f ( x ) = − 3 x12 x1 x2 x22 + − , con β = 4 2 4 2 y x 0 = (1,0 ) . ( ) = − 12 Tenemos que f es cóncava y dos veces continuamente diferenciable. Como f x la curva de nivel f (x ) = − 1 es una elipse, el conjunto 2 { 0 ( )} X 0 = x / f (x ) ≥ f x 0 convexo y compacto. 1⎤ ⎡ ⎢− 1 4 ⎥ Además H ( x ) = ⎢ ⎥ , los autovalores son -3/4 y -5/4 1 − 1 ⎢ ⎥ ⎣4 ⎦ UNIVERSIDAD NACIONAL ABIERTA 27 y es Por lo tanto de − 5 2 3 2 y ≤ y, H ( x ) y ≤ − y , se deduce que la sucesión generada a partir 4 4 x 0 = (1,0) converge hacia un punto de Ω . A continuación se calculan algunos términos de esta sucesión Iteración 0: ⎛ −1 ⎞ ⎛0⎞ ∇f x 0 = ⎜ 1 ⎟ ≠ ⎜⎜ ⎟⎟, d 0 = ∇f x 0 , ⎜ − ⎟ ⎝0⎠ ⎝ 4⎠ ( ) λ = 1, ( ) ( ) ∇f x 0 2 = ( ) 17 , 16 f x0 = − 1 2 ⎛0⎞ 1 y = x 0 + λd 0 = ⎜ 1 ⎟, f ( y ) = − ⎜ ⎟ 32 ⎝4⎠ 1 1 1 ⎛ 17 ⎞ Δ x 0 ,1 = − + − ⎜ ⎟ < 0 32 2 2 ⎝ 16 ⎠ ( ) λ = βλ = 3 , 4 ⎛1⎞ ⎜ ⎟ y = x 0 + λd 0 = ⎜ 4 ⎟, ⎜⎜ 3 ⎟⎟ ⎝ 16 ⎠ f ( y ) # 0,037 3⎞ ⎛ Δ⎜ x 0 , ⎟ # 0,065, 4⎠ ⎝ ⎛1⎞ ⎜ ⎟ 3 x1 = x 0 + d 0 = ⎜ 4 ⎟ 4 ⎜⎜ 3 ⎟⎟ ⎝ 16 ⎠ Iteración 1: ⎛ 13 ⎞ ⎜ − ⎟ ⎛ 0⎞ 1 ∇f (x ) = ⎜ 64 ⎟ ≠ ⎜⎜ ⎟⎟, d 1 = ∇f (x1 ), ⎜⎜ − 1 ⎟⎟ ⎝ 0 ⎠ ⎝ 8 ⎠ λ = 1, ⎛ 0,047 ⎞ ⎟⎟, y = x1 + λd 1 # ⎜⎜ ⎝ 0,063 ⎠ Δ x1 ,1 # 0,0065 ∇f (x1 ) = 0,057 , 2 f (x 0 ) = − f ( y ) # − 0,002 ( ) ⎛ 0,047 ⎞ ⎟⎟ x 2 = x1 + d 1 # ⎜⎜ ⎝ 0,063 ⎠ Iteración 2: UNIVERSIDAD NACIONAL ABIERTA 28 1 2 ⎛ − 0,031⎞ ⎛ 0 ⎞ ⎟⎟ ≠ ⎜⎜ ⎟⎟, d 2 = ∇f (x 2 ), ∇f (x 2 ) # ⎜⎜ ⎝ − 0,051⎠ ⎝ 0 ⎠ ⎛ 0,016 ⎞ f (x 2 ) # − 0,002 2 f ( y ) # − 0,00015 ⎟⎟ , λ = 1 y = x 2 + d 2 # ⎜⎜ ⎝ 0,012 ⎠ ( ∇f (x 2 ) # 0,004 , ) Δ x 2 , 1 # − 0,00015 ⎛ 0,024 ⎞ ⎟⎟ , y = x 2 + λd 2 # ⎜⎜ ⎝ 0,025 ⎠ λ ¨= βλ 3⎞ ⎛ Δ⎜ x 2 , ⎟ # 0, 4⎠ ⎝ x3 = x 2 + La solución es x = (0, 3 2 ⎛ 0,024 ⎞ ⎟⎟ d # ⎜⎜ 4 ⎝ 0,025 ⎠ ( ) 0 ), * f ( y ) # − 0,0005 f x * = 0 . Aunque la sucesión converge rápidamente, se observa una gran influencia de los errores de redondeo cerca de la solución en la determinación de Δ( x, λ ) . 2.2. Algoritmo de Newton con paso constante Los algoritmos del gradiente consideran la aproximación lineal de la función objetivo para determinar la dirección de desplazamiento. Sin embargo, si estamos cerca del punto solución, es decir si ∇f ( x ) es pequeño o bien si f es estrictamente cóncava, una aproximación cuadrática F(x) en torno a xk representa mejor el comportamiento de f, donde: ( ) ( )( ) F ( x ) = f x k + ∇f x k , x − x k + ( )( ) 1 x − x k , H x k x − x k , siendo H la matriz hessiana 2 de f. Si f es estrictamente cóncava, F lo es también y alcanza su máximo en el punto x tal que ( ) ( )( ) ∇f x k + H x k x − x k = 0, o ( ) H xk sea es regular , ( ) ( ) x − x k = − H x k ∇f x k Por lo tanto en todo punto xk donde H(xk) es definida negativa, un desplazamiento a Δ partir de xk en la dirección d = − H k ( ) que ∇f x , d k k −1 (x )∇f (x ) producirá un crecimiento del valor de f ya k k ( ) = − H xk d k , d k > 0 UNIVERSIDAD NACIONAL ABIERTA 29 Esta manera de determinar dk caracteriza los algoritmos de Newton, los cuales en cada iteración calculan xk+1 a partir de xk mediante ( ) ( ) Δ x k +1 = x k + t k d k , con d k =− H −1 x k ∇f x k y sólo difieren entre sí en el método de escoger el paso tk. Para todos los algoritmos de Newton, tenemos: Ω = {x ∈ IR n / ∇f ( x ) = 0},.bajo el supuesto que f es al menos dos veces continuamente diferenciable y su matriz hessiana regular. El algoritmo de Newton con paso constante se escribe así: Inicio: ⎛ ⎝ 1⎞ 2⎠ α ∈ ⎜ 0, ⎟, β ∈ (0,1) (es conveniente tomar x 0 ∈ IR n Escoger β ∈ (0,5 , 0,8) , hacer k=0, ir a la iteración k Iteración K paso 1: Calcular ∇f paso 2: Si ∇f k paso 3: Calcular Δ si no, hacer paso 5 k (x ) = 0 parar si no, hacer paso 4: Si Δ (x ) d k = − H −1 (x k )∇f (x k ) , hacer λ = 1 , ir al paso 3 (x , λ )= f (x k (x , λ ) ≥ 0, k Δ k ) ( ) ( ) + λd k − f x k − λα ∇f x k , d k , hacer t k = λ , ir al paso 5 λ = λβ , ir al paso 3 x k +1 = x k + t k d k , k=k+1 ir a la iteración k UNIVERSIDAD NACIONAL ABIERTA 30 2.2.1. Ejemplo manual del algoritmo de Newton con paso constante Aplicar el ANPC para obtener algunos términos de la sucesión que converge al valor óptimo de f (x ) = − x12 x1 x2 x22 + − , con β = 0,7 2 4 2 y α = 0,4 . 1⎤ ⎡ ⎢− 1 4 ⎥ En el ejemplo anterior vimos que H ( x ) = ⎢ ⎥ , tiene por autovalores -3/4 y 1 − 1⎥ ⎢ ⎣4 ⎦ x 0 = (1,0) converge. -5/4, por lo que sucesión generada por el algoritmo a partir de Iteración 0: ⎛ − 1⎞ ⎛ 0 ⎞ ⎛1⎞ x 0 = ⎜⎜ ⎟⎟, ∇f x 0 = ⎜ 1 ⎟ ≠ ⎜⎜ ⎟⎟, ⎜ ⎟ ⎝ 0⎠ ⎝ 0⎠ ⎝4⎠ ( ) ⎛ − 1⎞ d 0 = − H −1 (x 0 )∇f (x 0 ) = ⎜⎜ ⎟⎟, ⎝0⎠ λ = 1, ⎛0⎞ y = x 0 + λd 0 = ⎜⎜ ⎟⎟, ⎝0⎠ ( ) ( ) 1 f (x 0 ) = − , 2 ⎡ ⎢ −1 x0 = ⎢ 1 ⎢− ⎣ 4 H −1 ( ) 1⎤ − ⎥ 4 ⎥ −1⎥ ⎦ ( ) ∇f x 0 , d 0 = 1 f (y) = 0 ( ) Δ x 0 ,1 = f ( y ) − f x 0 − 0,4 ∇f x 0 , d 0 = 0,1 > 0 Por lo tanto Iteración 1: ⎛ 0⎞ x1 = x 0 + d 0 = ⎜⎜ ⎟⎟ ⎝ 0⎠ ⎛0⎞ ⎛ 0⎞ x1 = ⎜⎜ ⎟⎟, ∇f (x1 ) = ⎜⎜ ⎟⎟, parar. ⎝0⎠ ⎝ 0⎠ UNIVERSIDAD NACIONAL ABIERTA 31 CAPÍTULO III Ensayos de aplicación del algoritmo genético simple y de los métodos clásicos en la optimización numérica y = x 2 sen 2 (10πx) + 1 , En este capítulo vamos a maximizar la función dominio [0, 2] y minimizar la función Z = 0,5 + sen 2 ( ) x 2 + y 2 − 0,5 (1 + 0,001(x 2 + y2 )) 2 en el , en el dominio [-200, 200] X [-200, 200] mediante el algoritmo genético simple, implementado en lenguaje pascal a fin de comentar los resultados obtenidos. 3.1. Evaluación de la función Y = x 2 sen 2 (10πx) + 1 en el dominio [0,2] Iniciaremos el ensayo mencionando algunas características de esta función, cuyo gráfico se muestra en la figura N° 1 que sigue: y 5 4.5 4 3.5 3 2.5 2 1.5 1 0.5 0 0 0.5 1 1.5 2 x figura N° 1 gráfica de la función Y = x 2 sen 2 (10πx) + 1 Como se observa, esta función en el dominio de definición, tiene una oscilación moderada con tendencia al aumento y manifiesta un incremento de su amplitud directamente proporcional al incremento de la variable independiente. El máximo global se ubica muy cerca de x = 2 y registra varios máximos locales, que se resaltan a partir de x = 1. UNIVERSIDAD NACIONAL ABIERTA 32 En el Anexo 3 de este trabajo se detallan las herramientas computacionales utilizadas para el desarrollo de este aparte y de otros donde se hizo necesario el uso de las mismas. 3.1.1. Aplicación del algoritmo genético simple Los parámetros para la corrida de la función que se intenta optimizar mediante el algoritmo genético simple son los que se detallan a continuación: Tamaño del cromosoma: 15 Tamaño de la población: 100 Número de generaciones: 200 Probabilidad de cruce: 0,85 Probabilidad de mutación: 0,013. El tamaño del cromosoma igual 15, significa que los valores de la variable x se codificaron con 15 bits cada uno, resultando que los individuos se representan mediante ristras de 0’s y 1’s de tamaño 15. El tamaño de la población igual 100, significa que para cada una de las 200 generaciones estarán formadas por 100 individuos. Pc = 0,85; quiere decir que en cada generación se modificará probablemente el 85% de la población y en todos los cruces que se aplican, los hijos sustituirán a los padres independientemente de que la aptitud de éstos sea peor que la de los padres. Pm = 0,013, significa que el 10% de la población y el 0,13% de los genes es probable que sean sometidos a mutación, por lo que en este caso como tenemos 100 individuos cada uno codificado con 15 genes se espera que aproximadamente 19 genes sean mutados por cada generación y así los individuos mutados sustituirán a los iniciales independientemente de su aptitud. La tabla N° 1 que se presenta a continuación, contiene un resumen de los resultados empíricos, de los datos que consideramos relevantes, obtenidos mediante la corrida del programa del algoritmo genético simple, con las características paramétricas mencionadas anteriormente, que se encuentra en el Anexo 2 de este trabajo. UNIVERSIDAD NACIONAL ABIERTA 33 En la misma se observa que una vez realizadas 200 generaciones, el algoritmo genético encontró el valor máximo de la función en estudio que resultó ser igual a 4,8035, el cual se alcanza en el valor de la variable x igual a 1,9504379406. UNIVERSIDAD NACIONAL ABIERTA 34 Tabla N° 1 Resumen de resultados empíricos Función de Aptitud Valor de X Máximo Mínimo Promedio Número Suma Mutaciones Cruces Generaciones 1,8289132361 3,0797 1,0050 1,5705 157,0515 17 43 1 1,9411603100 4,7886 1,0000 1,6305 163,0526 31 86 2 1,9500106815 4,8025 1,0000 2,0026 200,2616 45 128 3 1,9500106815 4,8025 1,0020 2,2726 227,2647 59 172 4 1,9494613483 4,7993 1,0007 2,7030 270,3016 76 216 5 1,9498275704 4,8017 1,0042 2,8430 284,2982 97 258 6 1,9498215702 4,8016 1,0006 3,2116 321,1613 116 298 7 1,9500106815 4,8025 1,0010 3,4588 345,8796 127 340 8 1,9506177701 4,8028 1,0012 3,7419 374,1892 141 385 9 1,9506177701 4,8028 1,0005 3,9620 396,2000 160 428 10 1,9506177701 4,8028 1,0010 3,9602 396,0231 175 474 11 1,9506177701 4,8028 1,0123 4,1118 411,1769 198 518 12 1,9501937925 4,8031 1,0185 4,1554 415,5434 217 559 13 1,9498275704 4,8017 1,0089 4,1857 418,5693 232 607 14 1,9498275704 4,8017 1,0002 4,1899 418,9862 251 649 15 1,9500106815 4,8025 1,0191 4,1718 417,1812 271 695 16 1,9501937925 4,8031 1,0041 4,2386 423,8643 290 735 17 1,9508651900 4,8032 1,0024 4,2333 423,3294 304 784 18 1,9508651900 4,8032 4,3154 431,5449 325 828 19 1,0018 1,9501937925 4,8031 1,0018 4,3134 431,3423 343 872 20 1,9501937925 4,8031 1,0605 4,3905 439,0480 356 914 21 1,9501937925 4,8031 1,0011 4,4666 446,6635 378 958 22 1,9501327555 4,8030 1,3814 4,2848 428,4767 397 1.003 23 1,9506177701 4,8028 1,0126 4,1757 417,5684 416 1.040 24 1,9506177701 4,8028 1,1804 4,3564 435,6425 429 1.084 25 1,9501937925 4,8031 1,1225 4,3614 436,1446 446 1.131 26 1,9501937925 4,8031 1,0020 4,2147 421,4660 469 1.174 27 28 1,9507431257 4,8033 1,0036 4,2421 424,2080 485 1.218 1,9504379406 4,8035 1,0045 4,1769 417,6861 505 1.264 29 1,9505600146 4,8035 1,0000 4,2572 425,7215 533 1.310 30 1,9505600146 4,8035 1,0084 4,3004 430,0397 555 1.352 31 1,9505600146 4,8035 4,3781 437,8083 577 1.393 32 1,9505600146 4,8035 1,0337 4,3390 433,9004 597 1.436 33 1,9506179856 4,8029 1,0001 4,3258 432,5818 626 1.478 34 1,0916 1,9506177701 4,8028 1,0000 4,0788 407,8834 655 1.518 35 1,9507431257 4,8033 1,0101 4,2195 421,9456 672 1.558 36 1,9507431257 4,8033 1,0101 4,3783 437,8302 690 1.600 37 Continuación de Tabla N° 1 Resumen de resultados empíricos UNIVERSIDAD NACIONAL ABIERTA 35 Función de Aptitud Valor de X Máximo Mínimo Promedio Número Suma Mutaciones Cruces Generaciones 1,9507431257 4,8033 1,0043 4,4152 441,5206 708 1.642 38 1,9507431257 4,8033 1,6957 4,4755 447,5470 731 1.684 39 1,9507431257 4,8033 1,1278 4,4546 445,4580 749 1.725 40 1,9507431257 4,8033 1,0738 4,3399 433,9920 769 1.763 41 1,9509261310 4,8027 1,0129 4,3800 438,0019 780 1.799 42 1,9500106815 4,8025 1,1193 4,3345 433,4524 797 1.839 43 1,9509261310 4,8027 1,0408 4,3470 434,6953 825 1.883 44 1,9509261310 4,8027 1,0013 4,3734 437,3395 846 1.923 45 1,9508651900 4,8032 1,0005 4,2481 424,8061 869 1.967 46 1,9507431257 4,8033 1,0001 4,1711 417,1129 884 2.005 47 1,9501937925 4,8031 1,0000 4,2156 421,5561 896 2.049 48 1,9506177701 4,8028 1,1034 4,4398 443,9789 919 2.089 49 1,9506177701 4,8028 1,2007 4,4719 447,1919 934 2.131 50 1,9506177701 4,8028 1,0096 4,3980 439,7984 956 2.176 51 1,9506177701 4,8028 4,3682 436,8249 973 2.219 52 1,0115 1,9507431257 4,8033 1,0047 4,2965 429,6507 991 2.260 53 1,9506177701 4,8028 1,0002 4,4256 442,5634 1.004 2.307 54 1,9506177701 4,8028 1,2636 4,4005 440,0500 1.034 2.349 55 1,9507431257 4,8033 1,0005 4,4866 448,6561 1.057 2.389 56 1,9506177701 4,8028 1,0120 4,2150 421,5034 1.068 2.433 57 1,9507431257 4,8033 1,0000 4,0684 406,8424 1.093 2.476 58 1,9507431257 4,8033 1,0000 4,2469 424,6913 1.113 2.517 59 1,9507431257 4,8033 1,0001 4,0269 402,6906 1.140 2.559 60 1,9507431257 4,8033 1,0001 4,1717 417,1681 1.157 2.600 61 1,9507431257 4,8033 1,0015 4,2964 429,6375 1.168 2.642 62 1,9507431257 4,8033 1,0015 4,2806 428,0582 1.182 2.689 63 1,9503158660 4,8034 1,4975 4,4106 441,0584 1.198 2.730 64 1,9506820887 4,8034 1,3398 4,3082 430,8227 1.219 2.770 65 1,9506820887 4,8034 1,0005 4,4545 445,4484 1.236 2.811 66 1,9506820887 4,8034 1,0013 4,4024 440,2356 1.259 2.851 67 1,9506820887 4,8034 1,0000 4,3572 433,7153 1.278 2.890 68 1,9506820887 4,8034 1,0000 4,2844 428,4440 1.292 2.935 69 1,9506820887 4,8034 1,0080 4,2389 423,8881 1.305 2.975 70 1,9506820887 4,8034 1,0015 4,5238 452,3835 1.331 3.015 71 1,9506820887 4,8034 1,0000 4,3515 435,1515 1.347 3.054 72 1,9504379406 4,8035 1,0120 4,1643 416,4337 1.370 3.098 73 1,9506820887 4,8034 1,0050 4,4866 448,6623 1,9504379406 4,8035 1,0115 4,4545 445,4520 1.389 3.757 3.138 8.430 74 200 Número promedio de cruces por generación: 42 Número promedio de mutaciones por generación: 19 Las gráficas que se observan a continuación, muestran los resultados empíricos de la población en función al número de generaciones, obtenidos en 74 simulaciones, con las características paramétricas mencionadas anteriormente. UNIVERSIDAD NACIONAL ABIERTA 36 6 Valores Aptitud 5 4 3 2 1 0 0 10 20 30 40 50 60 70 80 Número de Generaciones Máximo Mínimo Promedio figura N° 2 Valores regulares de la función para distintas generaciones Los resultados de los máximos y los mínimos de la función de aptitud (colores verde y azul en la figura N° 2), reflejan mucha estabilidad en la medida que avanzan las generaciones. Ahora bien, el valor promedio de la función aptitud (color naranja en la figura N° 2) muestra cierta variabilidad con tendencia hacia el valor máximo, esto confirma la teoría en cuanto a que las generaciones resultantes tienden, en promedio, a ser más aptas que sus ascendientes. Las dos gráficas (figuras N° 3 y 4) que siguen, muestran elocuentemente la relación directamente proporcional existente entre número de mutaciones, el número de cruces y la estabilización de la función de aptitud acumulada con respecto al número de generaciones producidas en los ensayos. UNIVERSIDAD NACIONAL ABIERTA 37 3.500 Número de Casos 3.000 2.500 2.000 1.500 1.000 500 0 0 10 20 30 40 50 60 70 80 Número de Generaciones Mutaciones Cruces figura N° 3 Número de mutaciones y cruces para distintas generaciones Función de aptitud acumulada por cada generación 500 400 300 200 100 0 0 10 20 30 40 50 60 70 80 Número de Generaciones figura N° 4 Función de aptitud acumulada distintas generaciones La gráfica (figura N° 5) subsiguiente muestra las posiciones de los valores máximo, mínimo y promedio de la función de aptitud para la distribución inicial de la población. UNIVERSIDAD NACIONAL ABIERTA 38 y 5 4.5 4 3.5 Máximo 3 2.5 Promedio 2 1.5 Mínimo 1 0.5 0 0 0.5 1 1.5 2 x figura N° 5 Valores regulares de la función en la población inicial La figura N° 6 muestra las posiciones de los valores máximo, mínimo y promedio de la función de aptitud para la distribución final de la población después de 200 generaciones, observándose que la línea de posición del valor máximo y mínimo coinciden con el valor máximo y mínimo de la función en estudio. y Máximo 5 4.5 Promedio 4 3.5 3 2.5 2 1.5 Mínimo 1 0.5 0 0 0.5 1 1.5 2 x figura N° 6 Valores regulares de la función en la población final 3.1.2. Aplicación de los métodos clásicos de optimización numérica Se realizaron pruebas (cambiando el punto inicial) sobre la función y = x 2 sen 2 (10πx) + 1 dirigidas a obtener resultados respecto a la ubicación del máximo global con el software matemático “Maple 8”, consiguiéndose como conducta modal que el mismo detiene la búsqueda, en todo caso, en el primer máximo local que halla después del UNIVERSIDAD NACIONAL ABIERTA 39 punto inicial y declara tal resultado como el valor máximo global de la función; produciendo así una solución aproximada con un inmenso error. 3.2. Evaluación de la función Z = 0,5 + sen 2 ( ) x 2 + y 2 − 0,5 (1 + 0,001(x 2 + y2 )) 2 , en el dominio [-200, 200] X [-200, 200] Continuando con el proceso de evaluación, la figura N° 7 ilustra la inversa de la función que antecede en el dominio [-10, 10] X [-10, 10], debido a que para el dominio 62.5 z 50 37.5 25 12.5 -10 -5 0 5 10 0 -5 -10 5 10 y x figura N° 7 gráfica de la función Z = 0,5 + ⎞ ⎛ sen 2 ⎜ x 2 + y 2 ⎟ − 0,5 ⎠ ⎝ (1 + 0,001(x 2 + y2 )) en el domino [-10, 10] X [-10, 10] 2 completo de definición, la función inversa no presenta valores máximos relevantes. UNIVERSIDAD NACIONAL ABIERTA 40 Como se observa, esta función tiene dos máximos globales en el entorno (-5, 5) X (0, 2,5) y múltiples máximos locales. 100 75 z 50 25 -5 -2.5 0 2.5 0 y figura N° 7 gráfica de la función 2.5 5 Z = 0,5 + x ⎞ ⎛ sen 2 ⎜ x 2 + y 2 ⎟ − 0,5 ⎠ ⎝ (1 + 0,001(x 2 + y2 )) en el domino [-5, 5] X [0, 2,5] 2 3.2.1. Aplicación del algoritmo genético simple Los parámetros para la corrida de la función que se intenta optimizar mediante el algoritmo genético simple son los que se detallan a continuación: Tamaño del cromosoma: 30 Tamaño de la población: 100 Número de generaciones: 200 Probabilidad de cruce: 0,85 Probabilidad de mutación: 0,013. El tamaño del cromosoma igual 30, significa que los valores de las variables x, y se codificaron con 15 bits cada uno, resultando que los individuos se representan mediante ristras de 0’s y 1’s de tamaño 30. Los primeros quince, de izquierda a derecha corresponden a la variable y; las quince posiciones restantes corresponden a la variable x. Los datos que consideramos relevantes, obtenidos mediante la corrida del programa del algoritmo genético simple, con las características paramétricas mencionadas UNIVERSIDAD NACIONAL ABIERTA 41 anteriormente, el cual se encuentra en el Anexo 2 de esta monografía, refuerzan las conclusiones obtenidas en el caso de la función de una variable. Una vez realizadas las 200 generaciones consideradas, el algoritmo genético encontró dos valores que podemos considerar una buena aproximación a los máximos de la función en estudio que resultaron: 102,9237, el cual se alcanza en el punto (2,7039399396, 1,5930661948) y 102,8904, el cual se alcanza en el punto (-0,81179235200, -3,0335398419). 3.2.2. Aplicación de los métodos clásicos de optimización numérica Los resultados generados, utilizando el mismo software matemático aplicado en el aparte 3.1.2., productos de la evaluación de la función Z = 0,5 + sen 2 ( ) x 2 + y 2 − 0,5 (1 + 0,001 (x 2 + y2 )) 2 análogos a los arrojados en el aludido aparte. UNIVERSIDAD NACIONAL ABIERTA 42 son CAPÍTULO IV Posibles modificaciones al algoritmo genético simple y conclusiones Como se evidenció en el ejemplo manual del capítulo I de esta monografía, el algoritmo genético simple al finalizar la quinta generación, produjo como resultado para el máximo de la función en el intervalo estudiado un valor igual a 676 (siendo su máximo verdadero igual a 961); este escenario comprobó que el mencionado algoritmo no es la panacea ante el problema de optimización, marcando la necesidad de seguir iterando, todo basado en el hecho, siempre imposible, de que se conoce el valor máximo de la función. He aquí un importante problema real de este algoritmo, como lo es la tendencia a la homegeinización de la población, es decir a que todos los individuos de la misma sean idénticos, impidiendo que el algoritmo siga explorando nuevas soluciones con lo que, probablemente, se quede estancado en un máximo local no muy bueno, este evento suele denominarse convergencia prematura en contraposición a la convergencia lenta que en muchos casos se produce. Otro conflicto en el comportamiento del algoritmo genético puede ser la existencia de muchos óptimos locales, además el hecho de que el óptimo global se encuentre muy aislado. Existen muchas técnicas para contrarrestar tales situaciones. Los mecanismos que únicamente mencionaremos en este capítulo tienen que ver con las modificaciones realizadas sobre los operadores genéticos. 4.1 Modificaciones sobre los operadores genéticos Las modificaciones del algoritmo genético simple, en cuanto a sus operadores genéticos, serán capaces de producir una versión mejorada del mismo, que no es ni se pretende que sea una solución definitiva al problema mencionado. La investigación en el campo de los algoritmos genéticos está centrada en la búsqueda de un algoritmo robusto, eficaz y rápido. En tiempos recientes, se han utilizado UNIVERSIDAD NACIONAL ABIERTA 43 diferentes parámetros para ensayos prácticos sobre un mismo problema, así mismo se han desarrollado nuevas representaciones para los operadores de selección, cruce y mutación a fin de aumentar la velocidad de los algoritmos genéticos; ya que empíricamente se ha comprobado que la modificación de los parámetros y operadores que los definen pueden impactar vigorosamente sobre el funcionamiento de dicho algoritmo. 4.1.1. Selección (Elitismo) Como antes se ha dicho, para el algoritmo genético simple la selección de mayor popularidad es la selección proporcional a la aptitud equivalente a la selección por rueda de ruleta, siendo la probabilidad de seleccionar a un individuo Pi sel = Fi , donde: Np ∑F j =1 j Fi : es el valor de la función de aptitud del individuo i-ésimo. N p : es el número de individuos de la población y se conoce como el tamaño de la población. Esta manera de escoger como padre a los individuos de la población presenta el inconveniente de la rápida convergencia provocada por los superindividuos. 5 El problema anterior se puede resolver efectuando una selección proporcional al rango del individuo, lo cual produce una repartición más uniforme en la escogencia. Pi rango = rango( Fi ) λ (λ + 1) / 2 , donde λ es el rango de la función objetivo del mejor individuo. Existe un modelo de selección elitista donde se obliga a que el mejor individuo de la población anterior sea seleccionado para pasar a la población siguiente. Entre la gran variedad de métodos de refinamiento del modelo de selección proporcional, cabe mencionar al modelo del selección del valor esperado, el esquema de selección que ha proporcionado empíricamente buenos resultados es el muestreo estocástico con reemplazamiento del resto, introducido por Brindle (1991), otros 5 Estos son individuos con valores relativamente elevados en la función de aptitud. UNIVERSIDAD NACIONAL ABIERTA 44 procedimientos de selección consiste en métodos de selección dinámicos (las probabilidades de selección varían en cada generación). 4.1.2. Cruce (Varios tipos) En el algoritmo genético simple los individuos seleccionados para desempeñar el papel de padres son recombinados utilizando el cruce basado en un punto. De Jong (1975) ha realizado experimentos con operador de cruce basado en múltiples puntos y ha concluido empíricamente que el cruce basado en dos puntos produce mejoras importantes al algoritmo. Existen otros operadores de cruce son: a) Operador de cruce uniforme, b) Operador de cruce basado en la función objetivo, c) Operador de cruce en el sentido del simulated annealing, etc. 4.1.1. Mutación Este operador es considerado de importancia capital debido a que permite al algoritmo genético explorar sobre todo el espacio de búsqueda. En la mayoría de las implementaciones del algoritmo genético simple la probabilidad de mutación permanece constante en todas las generaciones. La búsqueda del valor óptimo de la mencionada probabilidad ha motivado el desarrollo de muchos trabajos de investigación. Experimentalmente, modificando la probabilidad de mutación se han logrado mejorar los resultados del algoritmo genético simple. Adicionalmente, en algunos casos se ha ensayado con algoritmos genéticos que modifican dinámicamente la probabilidad de mutación (y de cruce). 4.2 Conclusiones 1. El desarrollo de las pruebas experimentales realizadas en esta monografía, sobre las dos funciones reales elegidas para ser evaluadas mediante el algoritmo genético simple, y la comparación con los resultados que arrojaron los métodos tradicionales de optimización numérica, permitió exponer la potencialidad del algoritmo genético UNIVERSIDAD NACIONAL ABIERTA 45 simple en un escenario donde las funciones presentan en su dominio de definición: oscilaciones moderadas y la existencia de varios máximos locales. 2. El campo de aplicación de esta herramienta se encuentra en el conjunto de las funciones para las cuales las técnicas tradicionales especializadas no funcionan o no aplican. 3. La utilidad del algoritmo genético simple, en el tema de la optimización y búsqueda de elementos relevantes en la ciencia moderna aún está en fase experimental y no se ha logrado todavía definir las características paramétricas (tamaño de la población, método de selección, probabilidad de cruce y de mutación, número de generaciones, tamaño del cromosoma, etc.) que garanticen resultados verdaderamente fiables en todos los contextos de aplicación. 4. Los resultados de esta monografía, producto de numerosas horas de investigación teórica y empírica, corroboran la utilidad de la técnica denominada algoritmo genético simple, estimulando un enorme interés en la investigación y estudio este tipo de herramienta. 5. A nivel mundial, se vienen realizando importantes desarrollos referidos a la aplicación del algoritmo genético simple en el campo de las matemáticas y la algoritmia. En el ámbito de nuestra Universidad Nacional Abierta (UNA) no existen proyectos de investigación y desarrollo para estas novedosas y prometedoras tecnologías. 6. Esta breve exposición, servirá de instrumento para divulgar ciertos aspectos de interés sobre el apasionante y productivo tema de la aplicación del algoritmo genético simple en la optimización de funciones reales y estimulará a los estudiantes de las carreras de Matemática, Ingeniería, Administración y Educación, pertenecientes a la comunidad educativa de la UNA, a participar en su necesario e imperioso desarrollo utilizando como plataforma inicial los resultados y conclusiones obtenidos en este trabajo. UNIVERSIDAD NACIONAL ABIERTA 46 ANEXO 1 Artículo de prensa publicado en el cuerpo 48 del Universal, el 09/04/2006 CIENCIA // El estudio fue publicado en la revista "Science" Demuestran teoría de Darwin a escala molecular Científicos mostraron etapa por etapa el proceso de selección natural Washington. Puede resultar a estas alturas obvio, pero no lo es. Así, un grupo Las Islas Galápagos fueron un reservorio inspirador para Darwin de científicos mostró por primera vez, etapa por etapa, el proceso por el cual la naturaleza crea una nueva pieza de mecánica molecular modificando los elementos ya existentes, en un estudio publicado el pasado viernes en la revista estadounidense Science que confirma la teoría de la evolución de Charles Darwin. "Descubrimos que la complejidad molecular evoluciona por transformación, por medio de un proceso de explotación molecular que permite que viejos genes, obligados por la selección a funciones completamente diferentes, a ser reciclados para nuevas funciones", afirmó Joe Thornton, biólogo y principal autor del estudio, reseña AFP. UNIVERSIDAD NACIONAL ABIERTA 47 "Nuevas técnicas nos permiten ver cómo viejos genes, hoy desaparecidos, evolucionaron hace cientos de millones de años", explicó Thornton, científico de la Universidad de Oregon (noroeste). "El proceso de evolución de la mecánica molecular por etapa que reconstruimos se conforma completamente a la teoría de Darwin", destacó. Cambio revolucionario La teoría de Darwin, sobre el origen de las especies, habla sobre el proceso de selección natural y del azar que a partir de la ausencia de recursos para su supervivencia se ven en la obligación de desarrollar habilidades, características o en todo caso variaciones que posteriormente incorporarán las siguientes generaciones, que a su vez seguirán incorporando las variantes necesarias para su subsistencia. Por supuesto, esto no es más que el principio de lo que significó el amplio desarrollo teórico del revolucionario naturalista británico. La teoría evolucionista de Darwin no tardó en generar severas críticas, no sólo por parte de sus contemporáneos que la pusieron en el banquillo e intentaron resistirse a ella por años. Aún en la actualidad, instituciones de carácter religioso se oponen drásticamente a que se imparta en ciertos colegios. En Estados Unidos, recientemente se libró una batalla legal que ha terminado favoreciendo los conceptos e ideas del científico británico. Genio observador UNIVERSIDAD NACIONAL ABIERTA 48 ⇒ Nació en Inglaterra, Shrewshury, en 1809. Fue Shropshire, el quinto descendiente de una familia acomodada. ⇒ Con credenciales para estudiar Medicina y posteriormente hacerse ministro de la Iglesia, Darwin se relacionó con Adam Sedwick y John Stevens, geólogo y Charles Darwin naturista, respectivamente, quienes le orientaron finalmente a su profesión definitiva. ⇒ Como naturalista, Darwin tuvo su primera gran oportunidad en 1831 al embarcarse en el "HMS Beagle". A los 22 años, el futuro científico tuvo su contacto con el resto del mundo. ⇒ Tras su regreso, Darwin inició lo que se conocería como "El origen de las especies". Fue un libro revolucionario, dado que echaba por tierra la clásica teoría de la catástrofe para profundizar en la capacidad de las diversas especies para evolucionar. Se editó en 1859. UNIVERSIDAD NACIONAL ABIERTA 49 ANEXO 2 Código fuente del algoritmo genético simple Código fuente del algoritmo genético, en lenguaje pascal, aplicado a la optimización de funciones reales, tomado del libro. Genetic Algorithms in Search, Optimization, and Machine Learning, Addison-Wesley Publishing Company, Inc., Readind, MA. de Goldberg, D. E. (1989). Sobre el código fuente original, se efectuaron las modificaciones que se indican, a fin de ajustarlo al contexto de nuestra monografía: a) Las salidas y las declaraciones del programa se tradujeron al idioma castellano, b) La función objetivo y el coeficiente de normalización se ajustaron de acuerdo a los requerimientos del caso que nos ocupa, c) El programa denominado sga2 es una adaptación de los códigos para funciones de dos variables. A.2.1. Para funciones reales de una variable program sga1; uses crt; const maxpop = 100; maxstring = 30; coef = 16383.5; type allele = boolean; chromosome = array [1..maxstring] of allele; individual = record chrom: chromosome; x: real; fitness: real; parent1, parent2, xsite: integer; end; population = array [1..maxpop] of individual; var oldpop,newpop: population; popsize, lchrom, gen, maxgen: integer; pcross, pmutation, sumfitness: real; nmutation, ncross: integer; avg, max, min: real; (******************************************************************) function power(x:real):real; begin power:= sqr(x)*sqr(sin(10*pi*x))+1; end; UNIVERSIDAD NACIONAL ABIERTA 50 function rand: real; begin rand:= random(23767)/23767.0; end; function flip(probability: real): boolean; begin if probability = 1.0 then flip:= true else flip:= (rand <= probability); end; function rnd(low,high: integer): integer; var i: integer; begin rnd:= random(high-low) + low; end; procedure pause; var ch: char; begin writeln; writeln('Presione cualquier tecla para continuar...'); ch:= '*'; repeat ch:= ReadKey; until (KeyPressed) or (ch<>'*'); end; (**************************************************************) function objfunc(x: real): real; begin objfunc:= power(x/coef); end; function decode(chrom: chromosome; lbits: integer): real; var j: integer; accum, powerof2: real; begin accum:= 0.0; powerof2:= 1.0; for j:= 1 to lbits do begin if chrom[j] then accum:= accum + powerof2; powerof2:= powerof2 * 2; end; decode:= accum; end; procedure statistics(pop: population); var j: integer; begin sumfitness:= pop[1].fitness; min := pop[1].fitness; UNIVERSIDAD NACIONAL ABIERTA 51 max := pop[1].fitness; for j:= 2 to popsize do with pop[j] do begin sumfitness:= sumfitness + fitness; if fitness>max then max:= fitness; if fitness<min then min:= fitness; end; avg:= sumfitness/popsize; end; procedure initdata; var j: integer; begin clrscr; writeln(' Programa de Algoritmo Genetico'); writeln(' ------------------------------'); writeln; write('Introduzca el Tamaño de Poblacion: '); readln(popsize); write(' Longitud del Cromosoma: '); readln(lchrom); write(' Maximo de Generaciones: '); readln(maxgen); write('Probabilidad de Cruce: '); readln(pcross); write(' Probabilidad de Mutacion: '); readln(pmutation); randomize; nmutation:= 0; ncross:= 0; writeln; pause; writeln; writeln('Trabajando...'); end; procedure initreport; begin writeln('Generación Estadística Inicial'); writeln; writeln('Maximo Fitness: ', max); writeln('Promedio Fitness: ', avg); writeln('Minimo Fitness: ', min); writeln(' Suma de Fitness: ',sumfitness); pause; end; procedure initpop; var j, j1: integer; begin for j:= 1 to popsize do with oldpop[j] do begin for j1:= 1 to lchrom do chrom[j1]:= flip(0.5); x:= decode(chrom,lchrom); fitness:= objfunc(x/coef); parent1:= 0; parent2:= 0; xsite:= 0; end; end; procedure initialize; begin initdata; initpop; statistics(oldpop); UNIVERSIDAD NACIONAL ABIERTA 52 initreport; end; procedure writechrom(chrom: chromosome); var j: integer; begin for j:= lchrom downto 1 do if chrom[j] then write('1') else write('0') end; procedure report; var j: integer; begin clrscr; writeln; writeln('---------------------------------------------------------------'); writeln(' Reporte de Poblacion'); writeln; writeln('Generacion: ',gen); writeln; writeln('------- Cadena ---------------- X ---------- Fitness ------'); for j:= 1 to popsize do begin with newpop[j] do begin writechrom(chrom); writeln(' ',x/coef,' ',fitness:6:4); end; end; writeln; writeln; writeln(' max: ',max:6:4,' min: ',min:6:4,' Promedio: ',avg:6:4); writeln; writeln('Suma de fitness: ',sumfitness:6:4); writeln('Numero de mutaciones:',nmutation:6); writeln('Numero de cruces:',ncross); writeln('---------------------------------------------------------------'); pause; end; (************************************************************************) function select: integer; var rand, partsum: real; j: integer; begin partsum:= 0.0; j:= 0; rand:= random * sumfitness; repeat j:= j + 1; partsum:= partsum + oldpop[j].fitness; until (partsum >= rand) or (j = popsize); select:= j; end; UNIVERSIDAD NACIONAL ABIERTA 53 function mutation(alleleval: allele): allele; var mutate: boolean; begin mutate:= flip(pmutation); if mutate then begin nmutation:= nmutation + 1; mutation:= not alleleval; end else mutation:= alleleval; end; procedure crossover(parent1, parent2: chromosome; var child1, child2: chromosome; var jcross: integer); var j: integer; begin if flip(pcross) then begin jcross:= rnd(1,lchrom-1); ncross:= ncross + 1; end else jcross:= lchrom; for j:= 1 to jcross do begin child1[j]:= mutation(parent1[j]); child2[j]:= mutation(parent2[j]); end; if jcross<> lchrom then begin for j:= jcross+1 to lchrom do begin child1[j]:= mutation(parent2[j]); child2[j]:= mutation(parent1[j]); end; end; end; procedure generation; var j, mate1, mate2, jcross: integer; begin j:= 1; repeat mate1:= select; mate2:= select; crossover(oldpop[mate1].chrom, oldpop[mate2].chrom, newpop[j].chrom, newpop[j+1].chrom,jcross); with newpop[j] do begin x:= decode(chrom,lchrom); fitness:= objfunc(x); parent1:= mate1; parent2:= mate2; xsite:= jcross; end; with newpop[j+1] do begin x:= decode(chrom,lchrom); fitness:= objfunc(x); parent1:= mate1; parent2:= mate2; xsite:= jcross; end; UNIVERSIDAD NACIONAL ABIERTA 54 j:= j + 2; until j>=popsize; end; begin gen:= 0; initialize; repeat gen:= gen + 1; generation; statistics(newpop); report; oldpop:= newpop; until (gen>= maxgen); end. UNIVERSIDAD NACIONAL ABIERTA 55 A.2.2. Para funciones reales de dos variables program sga2; uses crt; const maxpop = 100; maxstring = 30; type allele = boolean; chromosome = array [1..maxstring] of allele; individual = record chrom: chromosome; x: real;y:real; fitness: real; parent1, parent2, xsite, ysite:integer; end; population = array [1..maxpop] of individual; var oldpop,newpop: population; popsize, lchrom, gen, maxgen: integer; pcross, pmutation, sumfitness: real; nmutation, ncross: integer; avg, max, min: real; (******************************************************************) function power(x, y:real):real; begin power:= 1/(0.5+(sqr(sin(sqrt(sqr(x)+sqr(y))))-0.5)/sqr(1+0.001*(sqr(x)+sqr(y)))); end; function rand: real; begin rand:= random(23767)/23767.0; end; function flip(probability: real): boolean; begin if probability = 1.0 then flip:= true else flip:= (rand <= probability); end; function rnd(low,high: integer): integer; var i: integer; begin rnd:= random(high-low) + low; end; procedure pause; var ch: char; begin writeln; writeln('Presione cualquier tecla para continuar...'); UNIVERSIDAD NACIONAL ABIERTA 56 ch:= '*'; repeat ch:= ReadKey; until (KeyPressed) or (ch<>'*'); end; (**************************************************************) function objfunc(x, y: real): real; begin objfunc:= power(x/81.9175-200, y/81.9175-200); end; function decode(chrom: chromosome; lbits: integer): real; var j: integer; accum, powerof2: real; begin accum:= 0.0; powerof2:= 1.0; for j:= 1 to lbits do begin if chrom[j] then accum:= accum + powerof2; powerof2:= powerof2 * 2; end; decode:= accum; end; function decode1(chrom: chromosome; lbits: integer): real; var j: integer; accum1, powerof2: real; begin accum1:= 0.0; powerof2:= 1.0; for j:= lbits + 1 to 2 * lbits do begin if chrom[j] then accum1:= accum1 + powerof2; powerof2:= powerof2 * 2; end; decode1:= accum1; end; procedure statistics(pop: population); var j: integer; begin sumfitness:= pop[1].fitness; min := pop[1].fitness; max := pop[1].fitness; for j:= 2 to popsize do with pop[j] do begin sumfitness:= sumfitness + fitness; if fitness>max then max:= fitness; if fitness<min then min:= fitness; end; avg:= sumfitness/popsize; end; procedure initdata; var j: integer; begin clrscr; writeln(' Programa de Algoritmo Genetico'); UNIVERSIDAD NACIONAL ABIERTA 57 writeln(' ------------------------------'); writeln; write('Introduzca el Tamaño de Poblacion: '); readln(popsize); write(' Longitud del Cromosoma: '); readln(lchrom); write(' Maximo de Generaciones: '); readln(maxgen); write('Probabilidad de Cruce: '); readln(pcross); write(' Probabilidad de Mutacion: '); readln(pmutation); randomize; nmutation:= 0; ncross:= 0; writeln; pause; writeln; writeln('Trabajando...'); end; procedure initreport; begin writeln('Generacion Estadistica Inicial'); writeln; writeln('Maximo Fitness: ', max); writeln('Promedio Fitness: ', avg); writeln('Minimo Fitness: ', min); writeln(' Suma de Fitness: ',sumfitness); pause; end; procedure initpop; var j, j1: integer; begin for j:= 1 to popsize do with oldpop[j] do begin for j1:= 1 to lchrom div 2 do chrom[j1]:= flip(0.5); x:= decode(chrom,lchrom div 2); for j1:= lchrom div 2 + 1 to lchrom do chrom[j1]:= flip(0.5); y:= decode1(chrom,lchrom div 2); parent1:= 0; parent2:= 0; xsite:= 0; ysite:= 0; fitness:= objfunc(x, y); end; end; procedure initialize; begin initdata; initpop; statistics(oldpop); initreport; end; procedure writechrom(chrom: chromosome); var j: integer; begin for j:= lchrom downto 1 do if chrom[j] then write('1') else write('0') UNIVERSIDAD NACIONAL ABIERTA 58 end; procedure report; var j: integer; begin clrscr; writeln; writeln('---------------------------------------------------------------'); writeln(' Reporte de Poblacion'); writeln; writeln('Generacion: ',gen); writeln; writeln('------------ Cadena -------------------- X ------------- Y --------- Fitness --'); for j:= 1 to popsize do begin with newpop[j] do begin writechrom(chrom); writeln(' ',x/81.9175-200,' ',y/81.9175-200, ' ',fitness:6:4); end; end; writeln; writeln; writeln(' max: ',max:6:4,' min: ',min:6:4,' Promedio: ',avg:6:4); writeln; writeln('Suma de fitness: ',sumfitness:6:4); writeln('Numero de mutaciones:',nmutation:6); writeln('Numero de cruces:',ncross); writeln('---------------------------------------------------------------'); pause; end; (************************************************************************) function select: integer; var rand, partsum: real; j: integer; begin partsum:= 0.0; j:= 0; rand:= random * sumfitness; repeat j:= j + 1; partsum:= partsum + oldpop[j].fitness; until (partsum >= rand) or (j = popsize); select:= j; end; function mutation(alleleval: allele): allele; var mutate: boolean; begin mutate:= flip(pmutation); if mutate then begin nmutation:= nmutation + 1; mutation:= not alleleval; end else mutation:= alleleval; end; UNIVERSIDAD NACIONAL ABIERTA 59 procedure crossover(parent1, parent2: chromosome; var child1, child2: chromosome; var jcross: integer); var j: integer; begin if flip(pcross) then begin jcross:= rnd(1, lchrom-1); ncross:= ncross + 1; end else jcross:= lchrom; for j:= 1 to jcross do begin child1[j]:= mutation(parent1[j]); child2[j]:= mutation(parent2[j]); end; if jcross<> lchrom then begin for j:= jcross+1 to lchrom do begin child1[j]:= mutation(parent2[j]); child2[j]:= mutation(parent1[j]); end; end; end; procedure generation; var j, mate1, mate2, jcross: integer; begin j:= 1; repeat mate1:= select; mate2:= select; crossover(oldpop[mate1].chrom, oldpop[mate2].chrom, newpop[j].chrom, newpop[j+1].chrom,jcross); with newpop[j] do begin x:= decode(chrom,lchrom div 2); y:= decode1(chrom,lchrom div 2); fitness:= objfunc(x, y); parent1:= mate1; parent2:= mate2; xsite:= jcross; ysite:= jcross; end; with newpop[j+1] do begin x:= decode(chrom,lchrom div 2); y:= decode1(chrom,lchrom div 2); fitness:= objfunc(x, y); parent1:= mate1; parent2:= mate2; xsite:= jcross; ysite:= jcross end; j:= j + 2; until j>=popsize; end; begin gen:= 0; initialize; repeat gen:= gen + 1; UNIVERSIDAD NACIONAL ABIERTA 60 generation; statistics(newpop); report; oldpop:= newpop; until (gen>= maxgen); end. UNIVERSIDAD NACIONAL ABIERTA 61 ANEXO 3 Herramientas computacionales utilizadas a. Microcomputador con procesador intel inside pentium 3. b. Compilador Turbo Pascal 7.0 (para la corrida de los programas del algoritmo genético simple para una y dos variables). c. Software Office 2003. d. Software MuPAD Light Versión 2.5.2 (para graficar las funciones). e. Software Maple 8 <IBM intel NT> (para maximizar las funciones aplicando los métodos clásicos de optimización). UNIVERSIDAD NACIONAL ABIERTA 62 Referencia bibliográfica Camero, A. (2003). Ciencia Explicada, Biología, Editorial Nomos, S.A., Bogotá Colombia. Chambadal, L. (1984). Diccionario de Matemáticas, Ediciones Grijalbo, S.A., México, D.F. Goldberg, D. E. (1989). Genetic Algorithms in Search, Optimization, and Machine Learning, Addison-Wesley Publishing Company, Inc., Readind, MA. Holland, J. H. (1992). Adaptation in Natural and Artificial System, MIT Press, Second Edition. Ivanovich, A. (1997). El Origen de la Vida, Editorial Panamericana, Santa Fe de Bogotá, Colombia. Juricek, L. y González, J.S. (1987). Programación no Lineal (Optimización no Lineal), Universidad Nacional Abierta (Caracas). Keller, A. M. (1983). Programación en Pascal, Editorial Mc Graw Hill, México D.F. Marczyk, A. (2004). Algoritmos Genéticos y Computación Evolutiva, [Página web en línea]. Disponible en: http://the-geek.org/docs/algen. Martín, M. J. y García, M D. (2005). Seminario: Algoritmos Genéticos, [Página web en línea]. Disponible en: http://kal-el.ugr.es/mg. Melero, J. (2001). Algoritmos Genéticos, [Página web en línea]. Disponible en: http://kalel.ugr.es/. Prendes G., M. B. (2002). Optimización del Diseño y Construcción de Edificios Metálicos en Base a Algoritmos Genéticos (Tesis Doctoral), Universidad de Oviedo, [Página web en línea]. Disponible en: http://www6.uniovi.es/usr/belen/_private/tesis.pdf Rudolph, G. (1994). Convergence Analysis of Canonical Genetic Algorithms, IEEE Transactions on Neural Networks. UNIVERSIDAD NACIONAL ABIERTA 63