COMPUTACIÓN EVOLUTIVA (CE) PROGRAMACIÓN GENÉTICA

Anuncio
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
Descargar