13
Experimentación en Programación Genética Multinivel Ricardo Aler, Francisco Blázquez, David Camacho Universidad Carlos III Avda. de la Universidad, 30 Madrid, 28911 [email protected], [email protected] Resumen La programación genética (PG) es una técnica de aprendizaje automático que se basa en la evolución de programas de ordenador mediante un algoritmo genético. Una versión avanzada de la PG intenta aprovechar las regularidades de los dominios a resolver aprendiendo simultáneamente subrutinas que codifiquen dichas regularidades. Dicha versión, denominada ADF (definición automática de funciones) permite reutilizar una subrutina varias veces dentro de un mismo individuo. Sin embargo, existe la posibilidad de que la misma subrutina pueda ser reaprovechada por varios individuos de la misma población. Existen varios sistemas que, en principio, permiten descubrir subrutinas válidas para muchos individuos de una población. Uno de los más avanzados es el de red dinámica DL GP propuesto por Racine, Schoenauer y Dague en 1998. Desgraciadamente, hasta el momento no existe ninguna evaluación experimental de DL GP . El objetivo de este artículo es presentar una extensa experimentación de algunos aspectos de DL GP y su análisis posterior. Además, los autores pretenden realizar una revisión de las variadas técnicas existentes en PG para evolucionar subrutinas. Palabras clave: Programación Genética, Definición Automática de Funciones (ADF), Evolución de Subrutinas. 1. Introducción La programación genética (PG) es una técnica de aprendizaje automático que se basa en la evolución de programas de ordenador mediante un algoritmo genético [Koza1992]. Aunque la investigación en PG ha tomado una gran multitud de rumbos, una de las ideas directrices de dicha investigación es que la PG pueda utilizar los mismos recursos que cualquier programador. Esta es desde luego la línea seguida por Koza. En particular, los programadores humanos utilizan subrutinas en sus códigos que pueden ser utilizadas en muchos lugares distintos del mismo programa. Desde un punto de vista abstracto, las subrutinas codifican regularidades del dominio a resolver. Utilizando dicho mecanismo, Koza encontró que, en efecto, aprender las subrutinas adecuadas permitía a la PG resolver los problemas de manera mucho más rápida y encontrando programas más cortos [Koza1994]. A la técnica anterior se la denomina ADF (“Automatic definition of Functions”: definición automática de subrutinas). Sin embargo, las subrutinas no sólo se pueden reutilizar dentro de un mismo programa, sino que distintos programas se pueden beneficiar de la misma subrutina. Aplicando esta idea a la PG, varios individuos dentro de la misma población se podrían beneficiar de una misma subrutina recién descubierta, sin necesidad de tener que esperar a que la misma subrutina se redescubra de manera independiente en varios individuos, que es lo que debería ocurrir con las ADF. Por tanto, parece buena idea separar la evolución de los programas principales de la evolución de las subrutinas. Esta 1

Experimentación en programación genética multinivel

  • Upload
    uam

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Experimentación en Programación Genética Multinivel

Ricardo Aler, Francisco Blázquez, David Camacho

Universidad Carlos IIIAvda. de la Universidad, 30

Madrid, [email protected], [email protected]

Resumen

La programación genética (PG) es una técnica de aprendizaje automático que se basa en la evolución deprogramas de ordenador mediante un algoritmo genético. Una versión avanzada de la PG intenta aprovecharlas regularidades de los dominios a resolver aprendiendo simultáneamente subrutinas que codifiquen dichasregularidades. Dicha versión, denominada ADF (definición automática de funciones) permite reutilizar unasubrutina varias veces dentro de un mismo individuo. Sin embargo, existe la posibilidad de que la mismasubrutina pueda ser reaprovechada por varios individuos de la misma población. Existen varios sistemas que,en principio, permiten descubrir subrutinas válidas para muchos individuos de una población. Uno de los másavanzados es el de red dinámica DLGP propuesto por Racine, Schoenauer y Dague en 1998. Desgraciadamente,hasta el momento no existe ninguna evaluación experimental de DLGP. El objetivo de este artículo es presentaruna extensa experimentación de algunos aspectos de DLGP y su análisis posterior. Además, los autorespretenden realizar una revisión de las variadas técnicas existentes en PG para evolucionar subrutinas.

Palabras clave: Programación Genética, Definición Automática de Funciones (ADF), Evolución deSubrutinas.

1. Introducción

La programación genética (PG) es una técnica deaprendizaje automático que se basa en la evoluciónde programas de ordenador mediante un algoritmogenético [Koza1992]. Aunque la investigación enPG ha tomado una gran multitud de rumbos, una delas ideas directrices de dicha investigación es que laPG pueda utilizar los mismos recursos que cualquierprogramador. Esta es desde luego la línea seguidapor Koza. En particular, los programadores humanosutilizan subrutinas en sus códigos que pueden serutilizadas en muchos lugares distintos del mismoprograma. Desde un punto de vista abstracto, lassubrutinas codifican regularidades del dominio aresolver. Utilizando dicho mecanismo, Kozaencontró que, en efecto, aprender las subrutinas

adecuadas permitía a la PG resolver los problemasde manera mucho más rápida y encontrandoprogramas más cortos [Koza1994]. A la técnicaanterior se la denomina ADF (“Automatic definitionof Functions”: definición automática de subrutinas).Sin embargo, las subrutinas no sólo se puedenreutilizar dentro de un mismo programa, sino quedistintos programas se pueden beneficiar de lamisma subrutina. Aplicando esta idea a la PG, variosindividuos dentro de la misma población se podríanbeneficiar de una misma subrutina reciéndescubierta, sin necesidad de tener que esperar a quela misma subrutina se redescubra de maneraindependiente en varios individuos, que es lo quedebería ocurrir con las ADF. Por tanto, parece buenaidea separar la evolución de los programasprincipales de la evolución de las subrutinas. Esta

1

Cita bibliográfica
Published in: Revista Inteligencia Artificial: Revista Iberoamericana de Inteligencia Artificial, 2001, vol. 5, n. 13, p. 10-22

idea fue aplicada de diversas maneras en[Ahluwalia1997] y [Aler1998] con buenosresultados. En 1998, [Racine1998] propuso unmétodo similar llamado DLGP, en el que se disponíade una población de programas principales y variaspoblaciones de subrutinas, organizadas en distintosniveles, de manera que una subrutina sólo puedellamar a subrutinas de nivel inferior.Desgraciadamente, hasta el momento los autores nohan publicado una evaluación experimental de laidea, a pesar de que no es obvio que la arquitecturaDLGP tenga que funcionar necesariamente o de quelo haga de manera eficiente. El objetivo de esteartículo es realizar una evaluación experimental dedicha arquitectura. Desafortunadamente, losresultados parecen ser negativos, al menos con lavariante de DLGP implementada en este artículo.

3. Estado de la Cuestión

Esta sección resume el estado de la cuestión relativoa la evolución de subrutinas. En primer lugar, seintroducirán de manera breve las ideas básicas de laPG. A continuación, y de manera más extensa, serevisarán los distintos modos experimentados hastala fecha de evolucionar subrutinas. Para terminar, sedescribirá de manera exhaustiva las ideas básicas de

DLGP (Dynamic Lattice Genetic Programming) en

las que se basa la experimentación desarrollada eneste artículo [Racine1998].

3.1. Programación Genética

No se pretende explicar en este artículo todos losdetalles de la PG. Para ello, se remite al lector a[Koza1992]. Aquí tan solo se resumirán los puntosprincipales. Los elementos principales de la PG sontres:

� Una población P de individuos i�I, que sonprogramas de ordenador. Dichos programasestán constituidos por funciones primitivaselegidas de un conjunto F y terminaleselegidos de un conjunto T. Por ejemplo, i=IFX<5 THEN X=(X+5) sería un ejemplo deindividuo donde F={IF-THEN,<,=,+} yT={X,5}.

� Una función de adecuación (o fitness)f(x):I�� que mide la idoneidad de cadaindividuo. Para poder realizar esta medida, laPG ejecuta al individuo en distintos contextos(o sea, distintos valores de entrada) y secomprueba como de correcta es la salida encada uno de esos contextos.

� Unos operadores genéticos O={m,c,r} queson capaces de transformar unos programas

de ordenador en otros. Los operadores que sesuelen usar son la mutación de un individuom: I�I, el cruce de dos individuos (orecombinación o crossover) c: IxI�IxI y lareproducción sin modificación r: I�I. Cadaoperador tiene una probabilidad asociada�(o) de ser utilizado. Estos operadorespermiten explorar el espacio de losprogramas de ordenador.

A continuación se describe el algoritmo estándar dela PG:

1.Comenzar en la generación g=02.Generar P(0) compuesta de individuos conelementos de F y T elegidos de manera aleatoria.3.Realizar, iterativamente, los subpasos siguienteshasta que se encuentre una solución o se llegue a undeterminado número de generaciones:

3.1.�i�P(g) calcular f(i)3.2.Realizar hasta que se llene la poblaciónP(g+1)

3.2.1.Seleccionar o�O de acuerdo a �(o)3.2.2.Si o=m � o=r

Elegir i de acuerdo a f(i)Calcular sucesor s=o(i)Introducir s en P(g+1)

3.2.3.Si o=cElegir i1 e i2 de acuerdo a f(i1) y f(i2)Calcular sucesores (s1,s2)=c(i1 ,i2)Introducir s1,s2 en P(g+1)

3.3.g=g+14.Devolver el mejor individuo encontrado

3.2. Evolución de Subrutinas

3.2.1. Funciones Definidas Automáticamente(ADF)

Para mejorar el rendimiento de la PG convencional,Koza desarrolló un paradigma nuevo donde unindividuo contiene, a la vez, un programa principal yun conjunto de subrutinas que pueden ser llamadasdesde el cuerpo principal [Koza1994]. El operadorde recombinación está modificado para que el crucesólo ocurra entre partes homogéneas de losprogramas. Por ejemplo, la subrutina 1 de unprograma sólo se puede recombinar con la subrutina1 de otro programa.

En este paradigma, la única manera que tiene unasubrutina (o partes de ella) de propagarse en lapoblación es a través del operador de cruce. Esto eslo que ocurre en PG estándar con cualquier otrosubárbol de un individuo. Esto quiere decir que noes posible que otros programas puedan reutilizar una

2

subrutina inmediatamente que es descubierta. Portanto, no es sencillo para el paradigma de ADFs eldescubrir subrutinas que sean útiles para resolver unproblema a muchos individuos distintos: cadasubrutina co-evoluciona con su programacorrespondiente. Un detalle a tener en cuenta es quelas ADFs sólo son útiles a partir de determinadogrado de complejidad de un problema. Es decir, paraproblemas simples es mejor no utilizarlas.

Dentro de este paradigma, [Spector1995] describeun sistema, similar a las ADF de Koza, llamadoMacros Definidas Automáticamente (ADM). Ladiferencia es que las macros no evalúan susargumentos hasta que se los necesita, mientras quelas funciones los evalúan inmediatamente. UsarADMs es la única manera en que un programapuede evolucionar sus propias estructuras de controlde manera eficiente. Por ejemplo, para la típicaestructura if-then-else es preferible que la parte elsesólo se evalue en caso de que la condición no seacierta, especialmente si dicha parte else produceefectos colaterales (tales como cambiar el valor deuna variable global). Spector muestra que enalgunos problemas, el uso de ADMs reduce elesfuerzo computacional requerido por la PG.

3.2.2. Constructor de librerías genéticas (GLiB)

El objetivo de GLiB es el de proteger buenossubárboles almacenándolos en una librería, demanera que no puedan ser destruidos por lasoperaciones genéticas [Angeline1992,1993,1994].Para ello, GLiB utiliza el llamado operador decompresión. Dicho operador toma un subárbol de unindividuo de manera aleatoria, lo parametriza y loguarda en una librería. En este momento, el subárbolse ha convertido en una nueva función primitiva quepuede ser utilizada por cualquier otro programa enla población. La manera de transferir esta nuevaprimitiva a nuevos programas es bien a través decruce con el individuo comprimido, bien a través demutación. Puesto que la compresión eliminasubárboles de la población, la diversidad genética deesta disminuye, por lo que los autores utilizantambién el operador de expansión, el cual substituyeuna llamada a una primitiva almacenada en lalibrería por el subárbol de dicha primitiva. Elsistema se comportar bien en el dominio del tres enraya y el problema del “camino de comida”.

GLiB permite la transferencia de subárbolesinalterados de unos individuos a otros, con muchamás facilidad que las ADFs, gracias a lacompresión. Una vez transferidos, cada individuocomprueba (a través de la evaluación de suidoneidad) si la nueva primitiva le es útil o no, de

manera que aquellas nuevas primitivas útiles seextenderán rápidamente en la población. Por tanto,el sistema aprenderá rutinas que son útiles no sólo aun individuo, sino a toda la población. Sin embargo,puesto que los subárboles a comprimir se eligen sinningún criterio, muchos de los que son almacenadoscarecerán de valor, lo que resta eficiencia al sistema.

GLiB está basado en el operador de encapsulacióndefinido en [Koza1992], con la diferencia de que laencapsulación almacenaba subárboles sinparametrizar. Es decir, generaba subrutinas sinparámetros.

Las subrutinas almacenadas en la librería nocompiten entre sí. Teller y Veloso definen unsistema híbrido llamado PADO que también utilizauna librería de subrutinas [Teller1996]. A diferenciade GLiB, las subrutinas compiten mediante susidoneidades que están basadas en una mediaponderada de las de los programas que las llaman.En cada generación, se borra el peor individuo de lalibrería y se sustituye por las ADF del mejorprograma principal.

3.2.3. Representaciones adaptativas (ARL)

Rosca y Ballard describen el método derepresentaciones adaptativas mediante aprendizaje(ARL: Adaptive Representation through Learning)para la inducción de subrutinas[Rosca1994a,Rosca1994b,Rosca1995,Rosca1996a,Rosca1996b]. ARL también intenta encapsular ensubrutinas los buenos subárboles presentes en lapoblación, pero a diferencia de GLiB, no seleccionadichos árboles de manera aleatoria. El operador decreación busca subárboles en aquellos individuosque son mejores que sus padres. Además, seleccionalos subárboles de entre aquellos que se ejecutan unmayor número de veces. Esto tiene sentido, puestoque la evaluación de un individuo en PG consiste obien en ejecutar un mismo individuo en diversoscontextos para evaluar su generalidad, o bien enejecutar dicho individuo varias veces, en caso deque el dominio sea no determinista. Una restricciónadicional es que, por razones de eficiencia, ARL seconcentra en subárboles de pequeño tamaño. Unavez que un bloque útil ha sido detectado, se le da unnombre de subrutina y se generaliza (algunos de susnodos terminales se convierten en parámetros de lanueva subrutina). Por último, se guarda en unalibrería. Cada cierto tiempo, se “mata” a undeterminado porcentaje de programas y se creanotros tantos nuevos, de manera que las nuevassubrutinas tienen la oportunidad de entrar en lapoblación. Por último, las subrutinas de la libreríapueden desaparecer de la misma si son poco útiles,

3

es decir, si la media de las idoneidades de losprogramas que la usan es demasiado baja. Cuandose borra una subrutina, la llamada es sustituida porsu código equivalente en cualquier programa que lallame. ARL ha sido experimentado extensivamenteen el PAC-MAN, con muy buenos resultados.

ARL permite descubrir subrutinas útilesgeneralizando el uso en la población de bloqueseficientes de código. Sin embargo, una vez que hansido extraídas, las subrutinas dejan de evolucionar, apesar de que no tienen porque estar completamenteoptimizadas.

3.2.4. Funciones coevolutivas

Al igual que GLiB y ARL, las funciones co-evolutivas separan los programas de sus subrutinasen poblaciones diferentes. Pero a diferencia de ellos,las funciones co-evolutivas permiten que lassubrutinas continuen evolucionando en sus propiaspoblaciones. De hecho, co-evolucionan al mismotiempo que los programas principales. La co-evolución no es una idea nueva en el campo de lacomputación evolutiva. Los principales proponentesdentro de la PG son Ahluwalia, Bull y Fogartyquienes las introdujeron en [Ahluwalia1997].

Puesto que los programas principales y lassubrutinas están separadas, es necesario resolver dosproblemas. El primero ocurre a la hora de ejecutar elprograma principal y encontrar una llamada asubrutina. ¿Cuál de las subrutinas de la población desubrutinas correspondiente debería ser llamada?. Elsegundo problema es cómo asignar idoneidad a laspropias subrutinas, puesto que lo único que esevaluable directamente es el programa principal.Este último problema se puede resolver de dosmaneras. O bien se dispone de una función deidoneidad para cada una de las poblaciones desubrutinas (distinta de la función de idoneidad delprograma principal), o bien se le asigna a cadasubrutina la idoneidad del programa principal que lausa. Para aplicar esta segunda opción es necesarioresolver el primer problema, es decir, cómo enlazarindividuos -subrutinas y programas principales- queestán en poblaciones distintas.

[Ahluwalia1997] estudia diversas maneras deasociar programas principales y subrutinas. Laselección puede ser aleatoria, o bien estar basada enla idoneidad (el programa principal selecciona conpreferencia aquella subrutina que tiene unaidoneidad alta, aunque la selección suele ser no

determinista). Obsérvese que esto permite que secompruebe la generalidad de las subrutinas, puestoque en distintas generaciones pueden estar asociadasa programas distintos. Sin embargo, Ahluwaliaadvierte que en ocasiones los sistemas co-evolutivostienen un comportamiento no convergente. Enefecto, si un programa es evaluado en distintasocasiones con muy distintas subrutinas, es posibleque la evaluación del programa sea prácticamentealeatoria, puesto que su comportamiento depende engran medida de con qué subrutinas está asociado.Para solventar este problema, en aquellos casos enlos que se produzca, Ahluwalia propone que losprogramas principales se vinculen con las subrutinasde manera definitiva. Desgraciadamente, es difícilver en qué difiere esto de las ADFs de Koza[Koza1994].

En un trabajo posterior, Ahluwalia combina lasideas de GliB y la coevolución de rutinas. Denominasu sistema EDF (Evolution Defined Functions)[Ahluwalia1998]. Funciona de la siguiente manera.Cada cierto tiempo, un subárbol es seleccionadoaleatoriamente de un individuo. Pero a diferencia deloperador de compresión, este subárbol es mutadorepetidas veces, dando lugar a una población enterade subrutinas, las cuales continuan evolucionandopor separado. Dichas subrutinas pueden ser llamadaspor los programas principales. Caso de que elnúmero total de llamadas a las subrutinas sea muybajo, se aplica el operador de expansión, que en estecaso consiste en eliminar la población de subrutinasy substituir las llamadas en los programasprincipales por subrutinas elegidas aleatoriamentede esa misma población. Las diferencias con GliBson por tanto dos. La primera es que el número declases de subrutinas a guardar es mucho menor. EnGliB, se podían guardar cientos de ellas, mientrasque EDF sólo crea unas pocas poblaciones desubrutinas. Cada población de subrutinas contienemuchas de ellas, pero los programas principales lasusan como si se tratara de la misma rutina. Por tanto,hay muchas subrutinas pero pocos tipos de ellas. Lasegunda diferencia es que las subrutinasalmacenadas en la librería pueden continuarevolucionando y adaptándose a los programasprincipales. Además de EDF, Ahluwalia aplicaEDF(auto), en el que el número de poblaciones desubrutinas se decide automáticamente: caso de queuna población de subrutinas sea muy usada, se creauna nueva población. Tanto EDF como EDF(auto)se comportan muy bien experimentalmente en losdominios seleccionados.

4

x xxx

x xx

xx x

xxx x

xx

xxx

x xxx

x xxx

x xxx

x xxx

x xxx

x xx

xx xxx

x xxx

Individuo

PoblaciónProgramas principales Nivel 0

Nivel 1

Nivel 2

Nivel 3

Nivel n

Poblacionesde

subrutinas

Llamada

Figura 1 Topología en red. Existe una población de programas principales (Nivel 0) que pueden llamar asubrutinas de niveles inferiores (Nivel 1, 2, …, n).

El trabajo presentado en [Aler1998] también se basaen la co-evolución separada de programasprincipales y de subrutinas. El estudio intentaaveriguar si la transferencia de buenas subrutinasencontradas por una población de subrutinas a otrapoblación que las usa, es útil o no. Básicamente, estaidea consistiría en vincular a cada individuo de unapoblación con los mejores individuos encontradospor las otras poblaciones. Es como si una poblaciónde subrutinas transfiriera de manera inmediata lasmejoras encontradas a los individuos de las otraspoblaciones, de una manera similar a como hacenlos científicos. Los resultados muestran que elesfuerzo computacional necesario para obtener losmismos resultados que las ADF es algo menor y queretrasa el problema de la convergencia prematura dela PG.

3.3. Red dinámica DLGP (Dynamic LatticeGenetic Programming)

En [Racine1998] se propone un sistema para la co-evolución de subrutinas y programas a la que

denomina red dinámica DLGP. Al igual que lasfunciones co-evolutivas de Ahluwalia, Racine separalas poblaciones de programas y subrutinas yjerarquiza estas últimas. Es decir, hay diversaspoblaciones de subrutinas, pero las de un nivel sólopueden llamar a las de nivel inferior. Además, lavinculación entre programas y subrutinas es fija:cuando un programa llama a una subrutina, esteespecifica a qué individuo de qué población estállamando realmente. De esta manera, distintosprogramas pueden estar vinculados a la mismasubrutina simultáneamente, por lo que dichasubrutina puede ser probada en distintos contextos.

La hipótesis básica de DLGP es que cada poblacióndebería concentrarse en resolver una subtarea

particular del problema durante el proceso deevolución.

La estructura de DLGP puede verse en la Figura 11.Las cajas representan poblaciones que se organizana distintos niveles. Las líneas discontinuasrepresentan llamadas desde el cuerpo de unprograma principal o una subrutina a otrassubrutinas. Dichas llamadas sólo ocurren hacianiveles inferiores. Cada individuo puede llamar auno o varios individuos, debido a lo cual el gráficose muestra como una especie de red. Pero debido ala evolución, cada individuo puede cambiar, por loque la red cambiará con el tiempo. De ahí el nombrede Red Dinámica. Puede observarse también quecada nivel tiene varias poblaciones. Cada una deesas poblaciones corresponde al número deargumentos de las subrutinas que hay en ella. Asípor ejemplo, el nivel 1 tiene tres poblaciones quecorresponderían a subrutinas con cero, uno y dosargumentos, respectivamente. En principio no hayninguna objeción para que en un mismo nivel hayavarias poblaciones de subrutinas correspondientes almismo número de argumentos, pues cada una deellas podría especializarse en una tarea distinta.

De entrada, esta estructura presenta ciertas posiblesventajas frente a sistemas vistos anteriormente. EnADFs, ADMs y otros, cada subrutina es poseída porun único programa principal, por lo que escomplicado transferir y evaluar la utilidad de dichasubrutina para otros programas principales. Otrastécnicas, como GLiB no distinguen subrutinas ycuerpo principal en el uso de los operadoresgenéticos. Por lo tanto, la recombinación esanárquica y la convergencia hacia una habilidadespecífica no es estable. 1 Figura extraída de [Racine1998]

5

P1

P2 P3 P4

P5 P6 P7 P8

Nuevo

ciclo

evolutivo

Figura 2 Ciclo co-evolutivo de la topología en red. Se realiza un ciclo evolutivo de la población de programasprincipales, seguido de ciclos evolutivos en las poblaciones de subrutinas.

Además del operador de cruce estándar y varios

operadores de mutación, DLGP define un operadorde mutación específico denominado Mutación desubrutinas. En este operador se substituye unallamada a subrutina por una llamada a otra subrutinacon el mismo número de parámetros. La función deeste operador es permitir al programa experimentarcon otras subrutinas. En realidad, otras mutacionespueden producir el mismo efecto pero de maneramás azarosa.

DLGP propaga de arriba a abajo la idoneidad.Primero, se ejecutan todos los programas de lapoblación principal tras lo cual se puede obtener suidoneidad. Ahora, las poblaciones de segundo nivelpueden calcular su idoneidad a partir de la de losprogramas principales, y así sucesivamente.Obsérvese que los únicos individuos que puedenobtener su idoneidad directamente son losprogramas principales. Las subrutinas calculan laidoneidad a partir de la de los programas principalesy la de otras subrutinas. Pueden definirse muchasmaneras de calcular dicha idoneidad. [Racine1998]propone la siguiente fórmula para calcular laidoneidad de las subrutinas, si se desea minimizar:

��

��

��

��

caso otro en ,

0 si ,*1

**1 %

F

N cN c

FF

max

bestbcfx

��

donde:

� bcfxF % es la media de las idoneidades de las

x% mejores funciones llamadoras.

� bestF es la idoneidad de la mejor función

llamadora.

� cN es el número de llamadas hacia la subrutina

actual.

� maxF es la idoneidad maximal (correspondiente

al individuo peor).� ��� , , son pesos especificados por el

usuario.

Tras la inicialización aleatoria de cada una de laspoblaciones, comienza el llamado ciclo co-evolutivo1, que funciona de arriba a abajo en la

jerarquía. Así, DLGP puede dividirse en dos partes:población principal (o superior) y poblaciones denivel inferior. Cada población del mismo nivel sufreuno o varios ciclos evolutivos locales. Esto incluyelas tres etapas básicas: (1) Cálculo de lasidoneidades (2) selección de acuerdo a la idoneidad,y (3) reproducción y aplicación de los operadoresgenéticos para crear/modificar la nueva población.Después, el proceso comienza otra vez conpoblaciones que pertenecen al siguiente estrato. Esteproceso se describe en la Figura 22. Las líneas de 1 Puesto que la evolución de una población influencia laevolución de las otras. Por ejemplo, el cómo evolucioneuna subrutina influye en la evolución de los programasprincipales que las llaman, y viceversa.2 Figura extraída de [Racine1998]

6

puntos corresponden a los ciclos locales.

De todo el proceso co-evolutivo, merece la penadestacar el modo de manejar la descendencia, unavez que se han aplicado los operadores genéticos.En la población de programas principales, cada cicloevolutivo renueva la población por completo. Estoes lo que se denomina modelo generacional. Sinembargo, hacer esto mismo en las poblaciones desubrutinas conduciría a un sistema muy inestable. Enefecto, el comportamiento de los programassuperiores depende del de las subrutinas. Por tanto,si en cada ciclo se renueva por completo unapoblación de subrutinas, el comportamiento de granparte de los programas llamadores cambiará degolpe. Es por tanto necesario una renovación másgradual de las poblaciones de subrutinas. Para ello,se sigue el modelo de estado estable (steady-state),en el que en cada ciclo sólo cambian un pequeñoporcentaje de individuos de la población. En estecaso, además de seleccionar que individuos se van areproducir, también es necesario seleccionar queindividuos van a ser sustituidos por los nuevosdescendientes. Según Racine, esto puede hacerse dedos maneras:

� O bien seleccionando uno de los peoresindividuos en la población

� O bien substituyendo una de las rutinas padre3

por la rutina descendiente, siempre que estaúltima sea mejor que la rutina padre. Elproblema de esta alternativa es que paraconocer la idoneidad de la rutina descendientees necesario re-evaluar todos los programasprincipales que directa o indirectamentellamen a la rutina padre, habiendo sustituidopreviamente la rutina padre por ladescendiente. En suma, por cada substitución,es necesario realizar un gran número de re-evaluaciones.

4. Descripción del sistema utilizado parala experimentación

El sistema de programación genética multiniveldesarrollado aquí pretende ser una particularización

del sistema multipoblación en red dinámica (DLGP)de Racine, Schoenauer y Dague según el cortoartículo publicado al respecto en [Racine1998]. Elsistema de programación genética multinivel tieneexactamente la misma topología jerárquica y

3 La rutina padre es aquella a la que se le aplica laoperación genética (mutación o cruce) y produce aldescendiente.

practica la misma evolución local que DLGP. Hasido desarrollado en Common Lisp, a partir de laimplementación producida por Koza [Koza1992] yde código desarrollado por uno de los autores[Aler1998].

El sistema se ha estructurado como un conjunto de 1a n niveles, cada uno de los cuales está compuestopor un conjunto de p poblaciones y, a su vez, cadapoblación se compone de i individuos. El nivel n-1es el inferior y está compuesto de p poblaciones de iindividuos cuyas subrutinas solamente puedenllamar a las funciones primitivas definidas por elusuario. El nivel 0 contiene una sola población deprogramas principales. Dicha población principalsigue el modelo de evolución generacional (en cadageneración se reemplaza la población completa)mientras que las poblaciones de subrutinas utilizanel modelo steady-state, donde en cada cicloevolutivo sólo cambia un individuo de la población.Para ello hay que seleccionar qué individuo de lapoblación va a ser substituido. En los experimentosse han permitido dos posibilidades que sedeterminan por medio de un parámetro: que losindividuos padres del descendiente sean substituidoso que lo sean los individuos peores. Los efectos decada una de estas políticas se estudiaránposteriormente. Hay que destacar que nunca secomprueba que la rutina descendiente sea mejor quela rutina progenitora, debido al gasto computacionalque conllevaría (habría que re-evaluar todos losprogramas principales que directa o indirectamentellamaran a la rutina padre, substituyendo esta por larutina hija, para comprobar el efecto del cambio deuna por la otra). Además, tampoco se haimplementado la mutación que cambia una llamadaa una subrutina por una llamada a otra subrutina,aunque este cambio se puede conseguir por lamutación y el cruce estándares. Se ha hecho asíporque se quería comprobar como se comportaba unsistema simple, antes de introducirle nuevascomplicaciones.

Una llamada a una subrutina aparece en unprograma como una lista cuyo primer elemento esotra lista de tres elementos que indica el nivel,población e individuo donde está almacenado sucódigo y el resto de elementos son los argumentosque se le pasan al programa o subrutina. Antes depoder evaluar un programa principal es necesarioexpandirlo, es decir, cambiar las llamadas asubrutinas por las subrutinas mismas. Aunque estaforma es la menciona en [Racine1998], puedenencontrarse otras opciones aplicables, como porejemplo, que el programa principal se ejecute ycuando se encuentre una llamada a una subrutina

7

simplemente se salte al código de la misma, sinnecesidad de expandir el programa principal. Encualquier caso, una vez que el programa ha sidoexpandido, se debería compilar para que suejecución sea más eficiente.

La función de adecuación utilizada es la propuestapor Racine [1998] y descrita en la sección anterior:

l

jm

*1

**1

��

��

Los valores de ��� , , son el inverso de los

valores máximos que pueden alcanzar lasmagnitudes ponderadas por dichos coeficientes, paranormalizar dichas magnitudes. Estos coeficientes secalculan de manera dinámica, de manera que puedenser diferentes en generaciones diferentes. Sinembargo, para una generación y una poblaciónparticulares, los tres coeficientes son los mismospara todos los individuos en la población.

El método de selección utilizado es el de torneo.Este método se utiliza tanto para elegir queindividuos se van a reproducir y modificar mediantelos operadores genéticos, como para elegir aaquellos individuos que van a ser substituidos porlos descendientes (en el caso de las poblaciones desubrutinas). El método de torneo consiste enseleccionar al mejor (o al peor, según el caso) de unpequeño subconjunto de individuos elegidosaleatoriamente.

5. Experimentación

5.1 Introducción

El propósito de esta sección es exponer losexperimentos realizados para estudiar el com-portamiento del sistema de programación genéticamultinivel.

Las pruebas iniciales mostraron que unaconfiguración que muestra un buen comportamientose compone dos o tres niveles, tres o cuatro po-blaciones de subrutinas por nivel, 150 subrutinas porpoblación, una población de programas de 4000individuos y una profundidad máxima inicial de 3para los árboles que representan a programas ysubrutinas. Esta configuración constituye el punto dearranque de los experimentos a los que se hasometido el sistema.

Para realizar experimentos se ha utilizado elconocido problema de la regresión simbólica de la

paridad par de orden 4. Este problema consiste enevolucionar programas de ordenador que determinesi en sus cuatro argumentos binarios (0 ó 1) hay unnúmero par de unos. Este problema es difícil deresolver para la PG debido a la gran extensión delespacio de búsqueda. Es también un problema muyutilizado, por lo que se pueden comparar losresultados obtenidos con los de otros modelosexistentes, especialmente con las ADF de Koza.

Se han realizado 5 experimentos, cada uno de loscuales consiste en una serie de 17 ejecuciones delsistema4 durante 51 generaciones con un mismogrupo de parámetros que las gobiernanexceptuando, claro está, la semilla para el generadorde números aleatorios que permite la obtención depoblaciones aleatorias iniciales distintas.

5.2. Experimento de control

En primer lugar, se ha realizado un experimento,con el código propuesto en [Koza1994] para teneruna referencia del comportamiento de sistemassimilares, en este caso programación genética confunciones definidas automáticamente (ADF). LaFigura 3 muestra la evolución de la media (lospuntos) y la desviación típica (líneas verticales) delas 17 ejecuciones de esta configuración. Losresultados son bastante buenos, pues el sistemasiempre encuentra un programa que resuelve elproblema de la paridad par de orden 4, como muytarde en la generación 17. Estos serían los resultadosa superar por la programación genética multinivel.

-1

0

1

2

3

4

5

6

7

1 11 21 31 41 51Generación

Figura 3 Idoneidad media de 17 ejecuciones delproblema de paridad-4 con ADFs.

4 La PG es un método estocástico, por lo que paraevaluar correctamente los resultados, es necesarioejecutar el sistema varias veces.

8

5.2. Ciclo continuo vs. Ciclo alterno

Tal como se ha programado nuestra versión de

DLGP, el ciclo co-evolutivo genera una nuevapoblación de programas y después genera un nuevoindividuo por cada una de las poblaciones desubrutinas. Sin embargo, la modificación de laprimera población de subrutinas, cambia de maneraindirecta algunos de los programas de la poblaciónprincipal (de aquellos que directa o indirectamentellamen a dicha subrutina). Sin embargo, la idoneidadde dicha población principal no se vuelve a calcularhasta que se han modificado todas las poblacionesde subrutinas. Es decir, hasta que se ha producido unciclo co-evolutivo completo. Es posible que esteretardo en la actualización de la idoneidad tenga unefecto pernicioso. Para ello se han realizado dosexperimentos. Uno en el que la idoneidad de losprogramas principales no se re-evalúa hasta que serealizado el ciclo co-evolutivo completo (ciclocontinuo) y otro en el que la idoneidad de losprogramas afectados se re-evalúa tras lamodificación de cada población de subrutinas (cicloalternado). Hay que destacar que el esfuerzocomputacional en ambos experimentos es más omenos el mismo, puesto que se ha forzado a que elnúmero de veces que se evalúa la poblaciónprincipal para calcular su idoneidad coincida con elnúmero de generaciones. Eso significa que en elciclo alternado, los operadores genéticos seaplicarán un número menor de veces a lassubrutinas, aunque el resultado de aplicar unaoperación genética se conocerá de inmediato.

Los resultados pueden verse en la Figura 4 para elciclo continuo y la Figura 5 para el ciclo alterno. Elprimer resultado a observar es decepcionante:ninguna de las dos configuraciones lo hace tan biencomo la configuración con ADFs (ver Figura 3). Elciclo continuo encuentra soluciones en 3 de las 17ejecuciones y existe una gran variación de resultadosen cada una de las ejecuciones (gran desviacióntípica), incluso en las últimas generaciones. El cicloalternado encuentra una solución en sólo una de lasejecuciones. Sin embargo, su comportamientoparece más consistente, pues su desviación típica esbastante menor y la media a lo largo de lasgeneraciones muestra una mayor tendencia deprogreso. En efecto, el ciclo continuo se estancaprácticamente en la generación 11, mientras que elciclo alterno progresa hasta la generación 40.Posiblemente, la información suministrada por lasevaluaciones de idoneidad extra proporciona unaguía más fiable que en el caso continuo. Por tanto, sí

parece que el tipo de ciclo tiene cierta influencia enel comportamiento del sistema. A partir de estemomento, todos los experimentos tendrán el ciclocontinuo.

0

1

2

3

4

5

6

7

1 11 21 31 41 51Generación

Figura 4 Idoneidad media para el problema deparidad-4 con ciclo contínuo.

0

1

2

3

4

5

6

7

1 11 21 31 41 51Generación

Figura 5 Idoneidad media para el problema deparidad-4 con ciclo alterno.

5.3. Políticas de substitución

En los experimentos anteriores, al generar nuevosindividuos para las poblaciones de subrutinas, esnecesario elegir qué individuos serán substituidospor los nuevos descendientes. En los experimentosanteriores, las rutinas a substituir son siempre lasrutinas padre (es decir, la rutina a la que se le aplicómutación, o una de las dos rutinas a las que se lesaplicó cruce). La situación es que puede que hubieramuchos programas principales que, directa oindirectamente, llamaran a dicha rutina padre. Si larutina descendiente incorporara mejoras, todos los

9

programas principales dependientes se beneficiaráninmediatamente de dicha mejora [Aler1992]. Peropuede ocurrir que algunos o todos los programasprincipales dependientes empeoren debido alcambio de subrutina. Esto haría que el sistema dierasaltos bastante aleatorios en el espacio deprogramas. Esto explicaría que la desviación típicade las ejecuciones de los dos experimentosanteriores sea tan elevada. Para comprobar estefenómeno, se ha realizado otro experimento en elque las rutinas que se substituyen no son las rutinaspadre, sino la rutina a substituir se elige mediantetorneo: se eligen unos pocos (7 en este caso)individuos al azar y “gana” aquel que tiene peoridoneidad. La Figura 6 muestra los resultados deeste experimento. En efecto, la desviación típica esalgo menor. Además, el comportamiento en mediaes bastante mejor si lo comparamos con el de laFigura 5: el valor final obtenido cuando no sesubstituye a los padres (1.5) es menor que cuando selos substituye (3). Por tanto, parece necesario nosubstituir las rutinas padre. Otra alternativa sería lamencionada en [Racine1998], en la que antes desubstituir el padre por el hijo, se re-evaluan losprogramas necesarios para comprobar que el cambioes beneficioso a la mayoría de ellos. Sin embargo,como los propios autores comentan, el esfuerzocomputacional en este caso sería mucho mayor yposiblemente poco eficaz (el esfuerzo nocompensaría los beneficios). Se deja esta alternativapara estudiarla en el futuro.

0

1

2

3

4

5

6

7

1 11 21 31 41 51Generación

Figura 6 Idoneidad media para el problema deparidad-4 con ciclo alterno sin substitución.

5.4. Influencia del número de niveles

En este apartado se quiere comprobar si el tener una

jerarquía de poblaciones profunda tiene algunainfluencia en el comportamiento del sistema. Enprincipio, puesto que se usa una profundidad deindividuo pequeña, para que el tamaño del individuoexpandido no crezca en demasía, la única maneraque tiene un individuo de ser profundo es llamandoa subrutinas de nivel inferior. Si el número deniveles se decrementa, es posible que los individuosno puedan ser lo suficiente profundos para resolverel problema. La Figura 7 muestra que esto es lo queparece ocurrir al disminuir el número de niveles de 3a 2. El comportamiento en media de la Figura 7 esligeramente peor que su equivalente con tres nivelesque se puede ver en la Figura 6. Esto pareceríaindicar que los programas no pueden llegar a ser tancomplejos como se necesiten. La conclusión es queserá necesario elegir correctamente la relación entreel número de niveles y la profundidad máximapermitida para un individuo. Si disminuimos elnúmero de niveles, habrá que incrementar laprofundidad máxima permitida a los individuos.

0

1

2

3

4

5

6

7

1 11 21 31 41 51Generación

Figura 7 Idoneidad media para el problema deparidad-4 con dos niveles de poblaciones.

6. Discusión

El primer resultado es decepcionante. En ninguna delas configuraciones experimentadas se consiguesuperar los resultados del experimento de control

(ADFs únicamente), a pesar de que DLGP introduceuna complejidad notable. Es perfectamente posibleque, al igual que las ADFs de Koza [Koza1994],esta arquitectura sólo sea útil para problemas muycomplicados. Si el problema es demasiado simple,no compensa el esfuerzo extra a realizar. Encualquier caso, queda fuera de nuestrasposibilidades el experimentar estar arquitectura enproblemas mucho más complicados, por lo que nos

10

centraremos en los aspectos dinámicos de DLGP enel problema de paridad 4.

El primer aspecto a observar es que DLGP sebeneficia de conocer los efectos sobre los programasprincipales que tiene modificar una subrutina. Estose puede conseguir re-evaluando los programasafectados. Si no se hace así, existe una gran varianzaentre distintas ejecuciones de la PG, lo que indicaque el sistema tiende a convertirse en un paseoaleatorio. La guía proporcionada por las re-evaluaciones hace que, efectivamente, se reduzcadicha varianza. Por tanto, parece recomendable que

DLGP tenga un ciclo alterno. Desgraciadamente, elciclo alterno disminuye el número de veces que sepueden aplicar los operadores genéticos si queremosmantener el mismo número de evaluaciones que enel ciclo continuo. Esto disminuye la exploración enel espacio de programas, por lo que es posible que elmejor comportamiento del sistema se obtenga enalgún lugar entre el ciclo alterno y el ciclo continuo.Por ejemplo, en lugar de modificar una población desubrutinas y re-evaluar inmediatamente, se podríanmodificar sólo alguna de ellas (pero no todas, pueseso sería el ciclo continuo).

Pero incluso con el ciclo alterno, los resultados enmedia no son demasiado buenos. Parece que laspolíticas de substitución son responsables de estecomportamiento. En este caso, tras una operacióngenética, la subrutina hija substituye a alguna de lassubrutinas padre. Si en lugar de eso, la subrutina hijasubstituye a alguna de las peores subrutinas en lapoblación, el sistema pasa a mejorar en media deuna manera notable. Además, su varianza tambiéndisminuye ligeramente. Parece que lo que estaocurriendo es que al modificar de repente unasubrutina, muchos programas principales se venafectados. De hecho, las subrutinas que tienendescendencia se eligen de entre las mejores, y estastienen tan alta valoración debido a que los padresque las llaman son también muy buenos. Así, en uninstante, muchos programas que funcionaban muybien pueden pasar a funcionar mal, porque se hancambiado algunas de sus subrutinas. Esto podríaexplicar en parte la alta varianza encontrada en lasdiversas ejecuciones. Parece que es así, pues alcambiar la política de substitución, la varianzadisminuye.

Aunque pueda parecer obvio que la política correctaconsiste en no substituir a la rutina padre, tambiénpodría darse el siguiente comportamiento: inclusoaunque buena parte de las substituciones del padrepor el hijo den malos resultados, algunas podríanrepresentar mejoras. Y en ese caso, la mejora se

transferiría inmediatamente a todos los programasque llamen a la subrutina padre, sin necesidad deesperar a que el proceso de cruce hiciera el trabajode una manera más lenta y menos fiable. Además,hay que tener en cuenta que las poblaciones deprogramas principales y subrutinas co-evolucionan,por lo que tras varias generaciones, cada poblacióndebería producir subrutinas que realizan, más omenos la misma tarea y que están co-adaptadas a losprogramas principales. Por supuesto, lo mismoocurre con los programas principales, los cuales seadaptan a aceptar subrutinas de ese tipo. Además, almutar o cruzar rutinas similares, las rutinas hijasdeberían parecerse en muchos casos a las rutinaspadre, por lo que cambiar un padre por el hijo notiene porqué producir efectos tan drásticos. Estoseran los resultados observados en otro sistema co-evolutivo [Aler1998], pero parece que son no losuficientemente generales como para ser transferidos

a DLGP.

Si a pesar de este resultado se pretende seguirsubstituyendo al padre por el hijo, habría que seguirla sugerencia de Racine de comprobar que el efectode la substitución es positivo, antes de realizarladefinitivamente [Racine1998]. Esto llevaría aencontrar el conjunto de programas principalesafectados por la substitución, re-evaluarlos ypropagar hacia abajo las idoneidades. Si el hijomejora a muchos de los programas, el cambio podríaser aceptado. Sin embargo, esto lleva a realizarmuchas re-evaluaciones de programas. En efecto, sicomo parece, la mayor parte de las rutinas hijo noconsiguen aportar alguna mejora, la mayor parte delas re-evaluaciones no tendrían ninguna utilidad.Que esta es la manera más eficiente de gastar elesfuerzo computacional habrá que determinarlo enfuturos experimentos.

Por último, si DLGP tiene muchos niveles, esnecesario disminuir la profundidad permitida a losindividuos. Esto es así porque si expandimos unprograma principal (o sea, cambiamos sus llamadasa subrutinas por el código de las mismas) y existenmuchos niveles, y cada el árbol representativo decada individuo de cada nivel tiene una granprofundidad, el individuo expandido completamentepodría ser gigantesco. Incluso aunque la expansiónno se haga de manera explícita, la ejecución de unprograma con tantos nodos puede resultarprohibitiva en tiempo. Por tanto, será necesariolimitar la profundidad máxima. Sin embargo, seráconveniente incrementar dicha profundidad sidecrementamos el número de niveles. De otramanera, los programas no podrían alcanzar el nivelde complejidad requerido.

11

7. Conclusiones

Las contribuciones principales de este artículo sondos. La más importante es la evaluación empírica de

DLGP , un sistema co-evolutivo jerárquico. Estaidea fue propuesta en [Racine1998], perotranscurridos más de dos años, todavía no hanaparecido resultados experimentales de la misma.Puesto que uno de los autores de este artículo yaestaba trabajando en ideas similares ([Aler1992]), sedecidió realizar una implementación de esas ideasextendiendo un código del que ya disponíamos. Laexperimentación ha demostrado que no es trivialmejorar el modelo, más simple, de las ADFs[Koza1992]. Sin embargo, nuestros experimentosmuestran algunas de las propiedades que debería

tener un sistema similar a DLGP . En particular,parece necesario que el sistema tenga ciertoconocimiento de los efectos de los cambios de laspoblaciones de subrutinas, puesto que estos cambiospueden afectar potencialmente a muchos programasprincipales. Además, es necesario ser cauteloso conla política de substitución de rutinas padre porrutinas hija, a pesar de que en principio esta políticapodría tener ciertos beneficios. Será necesario seguirinvestigando para determinar bajo qué condicionesse puede utilizar dicha política.

En segundo lugar, el presente artículo realiza unaextensa revisión del estado actual sobre la evoluciónde subrutinas en PG.

8. Trabajos Futuros

� En primer lugar, habría que determinar en quepunto de la gradación ciclo alterno-ciclocontinuo es necesario comprobar los efectos delos cambios realizados a las subrutinas. Esposible que dicha comprobación pueda serrealizada después de unos pocos cambios, con loque, con el mismo número de evaluaciones, sepodrían realizar más operaciones genéticas, y portanto llevar a cabo una exploración máscompleta.

� Como se comentaba en las conclusiones, habríaque determinar bajo que condiciones es posiblerealizar la substitución de padre por hijo. Habríaque determinar experimentalmente cuandomerece la pena el esfuerzo computacional decomprobar que el hijo es mejor que el padre.

� Es posible que DLGP sólo sea útil paraproblemas realmente complicados, como ocurrecon las ADF de Koza. Al igual que este último,habría que considerar un problema

parametrizado de manera que al incrementar elparámetro se incremente la complejidad delproblema. Una vez echo esto, se podríadeterminar si hay algún valor del parámetro tras

el cual DLGP es un método que proporcionabeneficios. Por supuesto, el esfuerzocomputacional necesario para la experimentaciónsería bastante grande.

� Introducir la mutación sugerida en [Racine1998],en la que se cambia una llamada a subrutina porotra llamada a una subrutina de la mismapoblación que la primera. El efecto de estamutación puede conseguirse por medio de variasoperaciones genéticas estándar, pero seríainteresante ver si la nueva mutación mejora elcomportamiento de manera cualitativa.

Referencias

[Ahluwalia1998] Manu Ahluwalia and Larry Bull.Conocimiento-evolving Functions in GeneticProgramming: Dynamic ADF Creation UsingGLiB. Evolutionary Programming VII 1998.Proceedings of the Evolutionary ProgrammingVII International Conference 7th InternationalConference EP’98. San Diego (USA). 1998.

[Ahluwalia1997] Manu Ahluwalia and Larry Belland Terence C. Fogarty. Co-evolving Functionsin Genetic Programming: A Comparison in ADFSelection Strategies. Genetic Programming1997: Proceedings of the Genetic ProgrammingConference GP’97. 1997.

[Aler1998] Ricardo Aler. Immediate transfer ofglobal improvements to all individuals in apopulation compared to Automatically DefinedFunctions for the EVEN-5,6-PARITY problems.Proceedings of the EuroGP’98 Workshop. Paris.1998

[Angeline1992] Angeline, P. J. and Pollack, J. B.(1992) The Evolutionary Induction ofSubroutines, In The Proceedings of the 14thAnnual Conference of the Cognitive ScienceSociety. Hillsdale (USA). 1992.

[Angeline1993] Angeline, P. J. and Pollack, J. B.(1993) Evolutionary Module Acquisition, InProceedings of the Second Annual Conferenceon Evolutionary Programming. 1993.

[Angeline1994] Angeline, P. J. and Pollack, J. B.(1994) Coevolving High-Level Representations,In Artificial Life III, C. Langton (ed.), Addison-Wesley: Reading MA, pp. 55-71.

12

[Koza1992] Koza, John R. 1992. GeneticProgramming: On the Programming ofComputers by Means of Natural Selection. TheMIT Press.

[Koza1994] Koza, John R. 1994. GeneticProgramming II: Automatic Discovery ofReusable Programs. The MIT Press.

[Rosca1994a] Justinian P. Rosca, Dana H. Ballard."Hierarchical Self-Organization in GeneticProgramming", Proceedings of the EleventhInternational Conference on Machine Learning,Morgan Kaufman Publishers, 1994.

[Rosca1994b] Justinian P. Rosca, Dana H. Ballard."Hierarchical Self-Organization in GeneticProgramming", Proceedings of the EleventhInternational Conference on Machine Learning,Morgan Kaufman Publishers, 1994.

[Rosca1995] Justinian P. Rosca. "Towardsautomatic discovery of building blocks in geneticprogramming." Proc. of the AAAI Symposiumon Genetic Programming, Technical ReportAAAI Press, 1995.

[Rosca1996a] Justinian P. Rosca, Dana H. Ballard."Discovery of Subroutines in GeneticProgramming." In Advances in GeneticProgramming II, Edited by P. Angeline and K.Kinnear Jr. MIT Press, 1996.

[Rosca1996b] Justinian P. Rosca, Dana H. Ballard."Evolution-based discovery of hierarchicalbehaviors." Proc. of the Thirteenth NationalConference on Artificial Intelligence (AAAI-96),AAAI / The MIT Press, 1996.

[Racine1998] Alain Racine and Marc Schoenauerand Philippe Dague. A dynamic Lattice toEvolve Hierarchically Shared Subroutines:DL'GP Proceedings of the First EuropeanWorkshop on Genetic Programming, LNCS,Vol. 1391, pp. 220-232, Springer-Verlag, 14-15April 1998.

[Spector1995] Spector, L. 1995. Evolving ControlStructures with Automatically Defined Macros.Working Notes of the AAAI Fall Symposium onGenetic Programming. The AmericanAssociation for Artificial Intelligence. pp. 99-105

[Teller1996] Teller, A. and Veloso M. SYMBOLICVISUAL LEARNING. 1996. PADO: A newLearning Architecture for Object Recognition.Oxford University Presss. pp 81-116

13