COMPUTACIÓN EVOLUTIVA (CE) PROGRAMACIÓN GENÉTICA EVOLUCIÓN GRAMATICAL PROGRAMACIÓN POR EXPRESIÓN GENÉTICA Angel García Baños Escuela de Ingeniería de Sistemas y Computación Universidad del Valle 04 de febrero de 2008 OTROS ALGORITMOS EVOLUTIVOS PROGRAMACIÓN GENÉTICA GP ■ ■ GP (Genetic Programing), ideada por Koza en 1990. Se trata de diseñar programas usando técnicas evolutivas (GAs). Aunque se puede hacer con cualquier lenguaje, con LISP hay algunas ventajas: – Los programas y los datos tienen la misma forma (Expresiones-Simbólicas). Entonces, es fácil manipular programas. – Las expresiones simbólicas son equivalentes al árbol de análisis (parse-tree). Las operaciones del algoritmo genético deben hacerse sobre este árbol. – Es interpretado (no hace falta recompilar cada vez que hay un cambio en el programa). AGB 4 GP ■ Para resolver un problema con GP hay que definir: – Conjunto de funciones (que requieren argumentos). – Conjunto de terminales (variables, constantes o funciones que no requieren argumentos). ■ Ejemplo: – Conjunto de funciones = { AND, OR, NOT } – Conjunto de terminales = { D0, D1 } – Una posible expresión simbólica: OR (AND (OR D1 D0) (NOT (AND D0 D0))) D1 ÁRBOL DE ANÁLISIS (PARSING) AGB AND NOT D0 AND D0 D0 5 GP ■ ■ ■ Deben cumplirse las condiciones de suficiencia y cerradura (clausura). La propiedad de clausura requiere que cada una de las funciones del conjunto de funciones sea capaz de recibir como argumento cualquier dato (valor y tipo) que pueda retornar cualquier función, y cualquier dato (valor y tipo) del conjunto de terminales. Por ejemplo, el álgebra de Boole es cerrada: – Conjunto de funciones = { AND, OR, NOT } – Conjunto de terminales = { nil, T } ■ Pero no ocurre así con la aritmética. AGB 6 GP ■ Para cerrar la aritmética hay que redefinir ciertos operadores: (defun % (numerador denominador) “La función de division protegida” (if (= 0 denominador) 1 (/ numerador denominador))) (defun srt (argumento) “La funcion raiz cuadrada protegida” (sqrt(abs argumento))) (defun gt (primer segundo) “La funcion mayor-que con resultado numerico” (if (> primero segundo) 1 -1))) AGB 7 GP ■ ■ En Common LISP hay un problema adicional: ciertas operaciones (ejecución condicional y ejecución iterativa) no se pueden implementar con facilidad. Ello es debido a que LISP evalúa todos los argumentos antes de pasarlos a una función. Por ejemplo: (IF-HAY-COMIDA (AVANZA) (GIRA-DERECHA)) – Se realizarán las dos cosas, independientemente de la condición. Para evitarlo, el IF se implementa con una MACRO: (defmacro ifltz (condicion then else) ‘(if (< (eval ‘,condicion) 0) (eval ‘,then) (eval ’,else))) AGB 8 GP ■ La población inicial de individuos (expresiones simbólicas) se puede generar así: – Cada función tiene tantas ramas como argumentos. Los terminales no tienen ramas. – Se elige al azar una función, que servirá como raíz. – Se van añadiendo a sus ramas otras funciones o terminales elegidos al azar, hasta que no queden ramas libres. + + + * * (+ (* A B) C) A AGB C B 9 GP ■ Hay varias formas de realizar la inicialización: – “Full”: Crear los programas con todos los caminos de longitud L. Para ello, en los nodos intermedios se seleccionan aleatoriamente solo funciones, y cuando se llega a la longitud L deseada, se seleccionan aleatoriamente solo terminales. – “Grow”: Crear los programas con caminos de longitud variable, menor que L. Para ello, en los nodos intermedios se seleccionan aleatoriamente funciones y terminales, , y cuando se llega a la longitud L deseada, se seleccionan aleatoriamente solo terminales. – “Ramped half-and-half”: se crean un número igual de programas con una profundidad especificada entre 2 y el máximo L. Por ejemplo, si se desea L=6, el 20% de la población tendrá profundidad 2, el 20% 3, el 20% 4, el 20% 5 y el 20% tendrá profundidad 6. AGB 10 GP ■ ■ ■ ■ El método “Ramped half-and-half”: crea la mayor diversidad de formas. Es conveniente eliminar individuos que salgan repetidos en la generación 0 (en las demás no). La aptitud de un programa se calcula ejecutándolo y midiendo lo mal o bien que cumple con sus objetivos. Ello indica el punto débil de GP: requiere mucho cómputo. Los operadores de reproducción son: – – – – – Cruce (intercambiar dos sub-árboles al azar de dos individuos). Mutación (eliminar al azar un sub-árbol y generar allí otro al azar). Permutación (similar al cruce, pero dentro del mismo individuo). Edición (eliminar bloques inútiles) Ej: (+ 1 2) → 3 y (AND X X) → X Encapsulación (definir funciones). Ej: (+ A (* B C)) → (defun E0 () (* B C)) y cambiar por (+ A (E0)) AGB 11 GP ■ RESUMEN CARACTERÍSTICAS: – Requiere mucha potencia de cómputo (computación paralela o distribuida). – El usuario debe de saber cuales funciones primitivas son mas apropiadas para un determinado problema. Y lo mismo con las variables. Si hay funciones y/o variables superfluas, aumenta mucho el tiempo para encontrar la solución. Y si faltan funciones y/o variables, no encontrará la solución. – Las constantes (PI, 1, 2, 3, etc.) se suelen generar al azar, e incluso así el GP puede encontrar la solución. – Si la función de aptitud cambia suavemente en el tiempo, el GP puede encontrar la solución óptima para cada momento. – El programa solución suele tener muchos intrones (“code bloat”). AGB 12 GP – Puede diseñar automáticamente la estructura de un programa: ■ ADF: funciones automáticamente definidas. Por medio de operadores de: – – – – ■ ■ ■ Encapsulación (Creación de una función). Borrado de una función. Adición de un argumento. Borrado de un argumento. Generación automática de bucles (ADL) y recursiones (ADR). Variables internas automáticamente definidas (arrays, colas, listas...). Constantes automáticamente generadas. AGB 13 GP ■ APLICACIONES: – – – – – – – – – Integración, derivación e inversión simbólicas. Predicción de secuencias. Compresión de datos con pérdidas (imágenes...). Descubrimiento de leyes a partir de datos empíricos (leyes de Kepler...). Demostración de identidades matemáticas. Diseño en ingeniería (civil, etc...). Estrategias en robots (hormigas artificiales). Regresión simbólica. Diseño de circuitos digitales (multiplexor...). AGB 14 GP – Comportamiento emergente (hormigas artificiales, agentes, robots...). – Diseño de controladores y automatismos (péndulo invertido, parquear un trailer...). – Diseño de estrategias óptimas en juegos (Pac-Man). – Diseño de arquitecturas internas (para “path planning” de robots...). – Generación de secuencias seudoaleatorias. – Clasificación de datos (Clustering, Data Mining...). AGB 15 EVOLUCIÓN GRAMATICAL GE ■ ■ GE (grammatical evolution): evolución gramatical, ideada por Michael O’Neill y Conor Ryan en 1997. Gramáticas BNF (Backus-Naur Form): – Contienen un conjunto de símbolos terminales (+, -, 1,2,3...) y un conjunto de símbolos no terminales. Y hay reglas de producción que permiten generar los símbolos no terminales en función de ellos mismos y de los terminales. – Una gramática puede expresarse por medio de una tupla {N,T,P,S} donde N es el conjunto de símbolos no terminales, T el conjunto de símbolos terminales, P el conjunto de reglas de producción que mapean los elementos de N en T, y S es el símbolo inicial, que debe ser miembro de N. AGB 17 GE ■ Ejemplo: N = {expresion, op, pre_op, var} T = {sin, cos, tan, log, +, -, /, *, X, () } S = <expresion> P= (1) <expresion> ::= <expresion> <op> <expresion> | ( <expresion> <op> <expresion> ) | <pre_op> ( <expresion> ) | <var> (2) <op> ::= + | | * | / (3) <pre_op> ::= sin | cos | tan | log (4) <var> ::= X AGB [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [0] 18 GE ■ ■ ■ ■ Es habitual no usar toda una especificación BNF de un lenguaje, sino solo un subconjunto de interés. En GE, el fenotipo es un programa de computador escrito en cualquier lenguaje (especificado a su vez en BNF). El genotipo es un conjunto de strings binarios de longitud variable. Los codones son grupos de 8 bits (por ejemplo). La expresión se consigue tomando secuencialmente los codones y usándolos para tomar decisiones sobre una secuencia de reglas BNF. Ejemplo de regla BNF: <sentencia> := if (<expresion>) { <sentencia>; } else { <sentencia>; } | <sentencia> ; <sentencia> | variable = <expresion>; AGB [0] [1] [2] 19 GE ■ ■ ■ Si tomamos un codón (número entre 0 y 255) y sacamos su módulo 3 (porque hay 3 reglas de producción), el resultado puede salir 0, 1 o 2 y, según salga, se elegirá una de las tres reglas de producción. Y así sucesivamente hasta lograr un programa completo (con todas las reglas resueltas en nodos terminales) o hasta que se acaben los codones. Si se acaban los codones: – Se pueden volver a comenzar a extraer desde el principio, reusándolos. Aunque algunos investigadores hacen esto, no es una buena idea. – Se dice que el programa resultante no es ejecutable, y se le asigna el menor valor de adaptación posible. AGB 20 GE ■ Degeneración del código genético: – Como los codones software son de 8 bits, pero hay menos reglas de producción, se emplea el operador módulo. – Entonces, diversos codones pueden dar lugar a la misma regla de producción (ej: 3, 6, 9, etc.. ya que 3 MOD 3 = 6 MOD 3 = 9 MOD 3 etc). – A esto se le llama degeneración del código genético y es un fenómeno que ocurre también en biología, donde hay 43 = 64 posibles codones (61 que dan lugar a aminoácidos y 3 de STOP). Pero solo se producen 20 aminoácidos. O sea que, en promedio, hay 3 codones que producen el mismo aminoácido. – La degeneración no tiene ninguna importancia en GE. AGB 21 GE – Se ha descubierto que de los tres nucleótidos, los dos primeros codifican el aminoácido, mientras que el tercero no suele tener importancia. – Ello tiene sus consecuencias: si se produce una mutación sobre el tercer nucleótido, no suele producir cambios en el fenotipo del individuo. – La teoría de la "evolución neutral" de Kimura dice que son esas mutaciones silenciosas las responsables de la gran diversidad genética que hay. AGB 22 GE ■ En GE se han introducido nuevos operadores: – Duplicación: seleccionar al azar unos cuantos genes consecutivos y copiarlos al final del cromosoma. Ello sirve para: ■ ■ ■ Permitir mutaciones mortales (el gen que muta puede ser imprescindible, pero como existe una copia, no hay problema). Evolucionar nuevas funciones. Producir mas cantidad de lo mismo. – Poda: si un cromosoma no necesitó usar todos sus genes para generar un programa, se aplica este operador con una cierta probabilidad. La poda consiste en quitar los genes no usados. De esta manera se eliminan los intrones (genes que no se expresan). AGB 23 GE – Los intrones sirven para dos cosas: ■ ■ Permiten acumular mutaciones sin dañar el organismo (lo cual es bueno). Mas del 90% del ADN humano son intrones. Vuelven mucho más lento el proceso evolutivo (lo cual es malo). – Por ello, el operador de poda se aplica con baja probabilidad (0.01%). ■ En GE hay problemas de dependencias similares a los de GP (programación genética): cuanto mas lejos de la raíz está un gen, mas probable es que su expresión se vea alterada por los genes que están antes. AGB 24 PROGRAMACIÓN POR EXPRESIÓN GENÉTICA GEP ■ ■ GEP (gene expression programing): Programación por expresión genética, ideado por Ferreira (Univ. Azores) en 2000. Muy similar a GE, aunque con mas “detallitos”. En biología, un gen comienza con un codón de comienzo, continúa con la secuencia de codones que codifican la funcionalidad del gen, y termina con un codón de finalización. AGB 26 GEP ■ ■ ■ ■ En GEP se separa el genotipo del fenotipo. En GAs y GPs no se hace esa separación (funcionan como los primitivos ARN). En GEP se mantiene una población de cromosomas, compuestos por genes de tamaño fijo codificados como cadenas de símbolos. Los cromosomas se reproducen como en GA (cruce, mutación, etc.). Luego cada gen se convierte a un ET (expression tree = árbol de expresión), que consiste en un programa de computador. En GEP un gen no es un símbolo, sino una secuencia de símbolos de longitud fija. Lo que usualmente ocurre es que quedan símbolos no usados (no expresados) en el gen. AGB 27 GEP ■ De esta manera, cualquier secuencia de símbolos en un gen da lugar a un ET sintácticamente correcto. Por ejemplo, la expresión: (a + b ) * (c − d ) Q Se representa en el siguiente ET: * (siendo Q la raíz cuadrada). + ■ El gen que lo representa será (leyendo el ET de arriba abajo y de a b c izquierda a derecha): ■ Esta representación no es prefija ni postfija, sino una expresión-K. Q * + - a b c d ■ AGB d 28 GEP ■ Al revés, partiendo de un gen cualquiera: Q ■ * + * a * Q a a b a Q - + Equivale al siguiente ET: (obsérvese que no se usan los 5 últimos símbolos) + Q * + a ■ Cuyo fenotipo es la expresión: (a + (a * b )) * ( a *a a a * * b Q a a ) AGB 29 GEP ■ ■ ■ ■ ■ Cada gen está formado por una cabeza y una cola. La cabeza contiene símbolos que representan funciones y terminales, mientras que la cola contiene solo terminales. La longitud de la cabeza (h) se elige dependiendo del problema. La longitud de la cola (t) depende de h y del número de argumentos (n) de la función que tenga mas argumentos: t = h*(n-1)+1 Con estas reglas se garantiza que no quede el gen corto (es decir, que no queden funciones sin suficientes argumentos) y que el programa tenga una longitud acotada (que no pueda crecer indefinidamente, como ocurre en GP). AGB 30 GEP ■ ■ La ventaja de GEP es que los genes son de longitud fija, mientras que los genotipos son de longitud variable. Y que no hacen falta operadores especiales de reproducción, ya que los típicos de GA valen. Y los resultados de estos operadores son siempre genes válidos: – El cruce automáticamente da lugar a un gen válido. – La mutación hay que hacerla con la restricción de que en la cola solo pueden aparecer símbolos terminales. AGB 31 GEP ■ ■ Por ejemplo, si las funciones son {Q, +, -, *, /} y los terminales son {a, b}, entonces n=2. Suponiendo que queramos h=7, sale t=8 y la longitud total del gen será h+t=15. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Q * + * a / Q a a b Cabeza: funciones y terminales a a a b a Cola: solo terminales AGB 32 GEP ■ ■ Un cromosoma está compuesto por un número fijo de genes. Cada gen codifica un ET. Los ETs se relacionan a través de una única operación codificada al final del cromosoma. Cada gen puede evolucionar aisladamente de los demás, dentro del mismo cromosoma. Ello facilita el surgimiento de los bloques constructivos. AGB 33 GEP ■ Ejemplo (3 genes de h=4, n=2 => t=5 y longitud gen=9): Q * + * a b a a a b a a b a a a a a + * a b b a a b a F 1er. gen 2o. gen Operación final 3er. gen F Q b + * * + a * b a b a AGB a b Nota: F = IF 34