Algoritmos Geneticos Memoria
Algoritmos Geneticos Memoria
Algoritmos Geneticos Memoria
ALGORITMOS
GENÉTICOS
2006-2007
3
4
1. Introducción
El algoritmo genético es una técnica de búsqueda basada en la teoría de la
evolución de Darwin, que ha cobrado tremenda popularidad alrededor del mundo
durante los últimos años.
Fue en las décadas de 1950 y 1960 cuando varios científicos, de modo indepen-
diente, comenzaron a estudiar los sistemas evolutivos, guiados por la intuición de que se
podrían emplear como herramienta en problemas de optimización en ingeniería. La idea
era evolucionar una población de candidatos a ser solución de un problema conocido,
utilizando operadores inspirados en la selección natural y la variación genética natural.
Con esta idea nace en el año 1993 la computación evolutiva, que retoma con-
ceptos de la evolución y la genética para resolver principalmente problemas de optimi-
zación. Esta rama de la inteligencia artificial tiene sus raíces en tres desarrollos relacio-
nados pero independientes entre sí:
- Algoritmos genéticos
- Programación evolutiva
- Estrategias Evolutivas
De estas tres áreas parten los caminos hacia todos los campos de investigación
inspirados en nuestros conocimientos sobre Evolución.
Las estrategias evolutivas son métodos computacionales que trabajan con una
población de individuos que pertenecen al dominio de los números reales, que mediante
los procesos de mutación y de recombinación evolucionan para alcanzar el óptimo de la
función objetivo. Entre 1965 y 1973 Rechenberg las introdujo como método para opti-
mizar parámetros reales para ciertos dispositivos. La misma idea fue desarrollada poco
después (75-77) por Schwefel. El campo de las estrategias evolutivas ha permanecido
como un área de investigación activa, cuyo desarrollo se produce, en su mayor parte, de
modo independiente al de los algoritmos genéticos (aunque recientemente se ha visto
como las dos comunidades han comenzado ha colaborar).
5
Pasamos ahora a hablar de los algoritmos genéticos. La primera mención del
término, y la primera publicación sobre una aplicación del mismo, se deben a Bagley
en 1967. Este diseñó algoritmos genéticos para buscar conjuntos de parámetros en fun-
ciones de evaluación de juegos, y los comparó con los algoritmos de correlación, proce-
dimientos de aprendizaje modelizados después de los algoritmos de pesos variantes de
ese periodo. Sin embargo el que es considerado como el creador de los algoritmos gené-
ticos es John Holland, que los desarrolló, junto a sus alumnos y colegas, durante las
décadas de 1960 y 1970.
En contraste con las estrategias evolutivas y la programación evolutiva, el pro-
pósito original de Holland no era diseñar algoritmos para resolver problemas concretos,
sino estudiar, de un modo formal, el fenómeno de la adaptación tal y como ocurre en la
naturaleza, y desarrollar vías de extrapolar esos mecanismos de adaptación natural a los
sistemas computacionales. El libro que Holland escribió en 1975 Adaptación en siste-
mas naturales y artificiales presentaba el algoritmo genético como una abstracción de la
evolución biológica, y proporcionaba el entramado teórico para la adaptación bajo el
algoritmo genético. El algoritmo genético de Holland era un método para desplazarse,
de una población de cromosomas (bits) a una nueva población, utilizando un sistema
similar a la selección natural junto con los operadores de cruces, mutaciones e inversión
inspirados en la genética. En este primitivo algoritmo, cada cromosoma consta de genes
(bits), y cada uno de ellos es una muestra de un alelo particular (0 o 1).
Holland adapta los operadores de selección, cruces, mutaciones e inversión a su
algoritmo:
- Selección: este operador escoge entre los cromosomas de la población aque-
llos con capacidad de reproducción, y entre estos, los que sean más compati-
bles, producirán más descendencia que el resto.
- Cruce: extrae partes de dos cromosomas, imitando la combinación biológica
de dos cromosomas aislados (gametos).
- Mutación: se encarga de cambiar, de modo aleatorio, los valores del alelo en
algunas localizaciones del cromosoma.
o Inversión: invierte el orden de una sección contigua del cromosoma,
recolocando por tanto el orden en el que se almacenan los genes.
La mayor innovación de Holland fue la de introducir un algoritmo basado en po-
blaciones con cruces, mutaciones e inversiones. Es más, Holland fue el primero en in-
tentar colocar la computación evolutiva sobre una base teórica firme. Hasta hace poco,
esta base teórica, fundamentada en la noción de esquemas, fue la estructura sobre la que
se edificaron la mayoría de los trabajos teóricos sobre algoritmos genéticos en las déca-
das siguientes.
Además de los investigadores de los que hemos hablado muchos otros investiga-
dores desarrollaron su trabajo en los algoritmos para la optimización y el aprendizaje
inspirados en la evolución. Cabe resaltar nombres como los de Box (1957), Friedman
(1959), Bledsoe (1961), Bremermann (1962), y Reed, Toombs y Baricelli (1967). Sin
embargo, su trabajo no ha tenido, ni con mucho, la atención que han recibido las estra-
tegias evolutivas, programación evolutiva, y los algoritmos genéticos. Hay que recordar
además a los biólogos evolucionistas que han utilizado el ordenador para simular la evo-
lución para realizar experimentos controlados (Baricelli (1957-1962), Fraser 1957, Mar-
tin y Coreman 1960). Pero habría que esperar hasta que la computación electrónica se
desarrollara, para poder apreciar la consolidación definitiva de la computación evoluti-
va.
6
En estos últimos años se ha generado una amplia interacción entre los investiga-
dores de varios métodos de computación evolutiva, rompiéndose las fronteras entre al-
goritmos genéticos, estrategias evolutivas y programación evolutiva. Como consecuen-
cia, en la actualidad, el término “algoritmo genético” se utiliza para designar un concep-
to mucho más amplio del que concibió Holland.
7
2. Definición de algoritmo genético
Los objetivos que perseguían John Holland y sus colegas de la Universidad de
Michigan cuando concibieron los algoritmos genéticos, eran dos: primero abstraer y
explicar rigurosamente el proceso adaptativo de los sistemas naturales; segundo diseñar
sistemas artificiales que retuvieran los mecanismos más importantes de los sistemas
naturales. En este sentido, podemos dar una definición de los algoritmos genéticos:
8
La evolución, tal y como la conocemos, es básicamente un método de búsqueda
entre un número enorme de posibles soluciones. En biología las posibilidades están
formadas por un conjunto de secuencias genéticas posibles, y las soluciones deseadas,
por organismos capaces de sobrevivir y reproducirse en sus entornos. La evolución pue-
de verse, asimismo, como un modo de diseñar soluciones a problemas complejos, con la
capacidad de innovar. Estos son los motivos de que los mecanismos evolutivos sean una
fuente de inspiración para los algoritmos de búsqueda. Por supuesto, el buen funciona-
miento de un organismo biológico depende de muchos criterios, que además varían a
medida que el organismo evoluciona, de modo que la evolución está “buscando” conti-
nuamente entre un conjunto cambiante de posibilidades. Por ello, podemos considerarla
como un método de búsqueda masivamente paralelo, ya que evalúa y cambia millones
de especies en paralelo.
Características de los algoritmos genéticos
o Son algoritmos estocásticos. Dos ejecuciones distintas pueden dar dos solucio-
nes distintas.
o Son algoritmos de búsqueda múltiple, de los que se obtiene como respuesta va-
rias soluciones
o Son los algoritmos que hacen una barrida mayor al subespacio de posibles solu-
ciones válidas. De hecho, se considera que, de todos los algoritmos de optimiza-
ción estocásticos, los algoritmos genéticos son de los más exploratorios disponi-
bles.
o A diferencia de otros algoritmos, cuya convergencia y resultado final son fuer-
temente dependientes de la posición inicial, en los algoritmos genéticos (salvo
poblaciones iniciales realmente degeneradas, en los que el operador de mutación
va a tener mucho trabajo) la convergencia del algoritmo es poco sensible a la
población inicial si esta se escoge de forma aleatoria y es lo suficientemente
grande.
o Por su grado de penetración casi nulo, la curva de convergencia asociada al algo-
ritmo presenta una convergencia excepcionalmente rápida al principio, que casi
enseguida se bloquea.
o Es una búsqueda paramétricamente robusta. Eso quiere decir que hemos de es-
coger realmente mal los parámetros del algoritmo para que no converga. Con ta-
sas razonables, va a converger (mejor o peor) en una solución razonablemente
buena si la representación es la adecuada.
o Por último, los algoritmos genéticos son intrínsecamente paralelos. Esto signifi-
ca que, independientemente de que lo hayamos implementado de forma paralela
o no, buscan en distintos puntos del espacio de soluciones de forma paralela. Ese
paralelismo intrínseco permite que sean fácilmente paralelizables, es decir, que
sea fácil modificar el código para que se ejecute simultáneamente en varios pro-
cesadores.
9
o Resulta sumamente fácil ejecutarlos en las modernas arquitecturas masivas en
paralelo.
o Usan operadores probabilísticos, en vez de los típicos operadores determinísti-
cos de las otras técnicas.
o Pueden tardar mucho en converger, o no converger en absoluto, dependiendo en
cierta medida de los parámetros que se utilicen: tamaño de la población, número
de generaciones, etc.
o Pueden converger prematuramente
10
3. Transformación de conceptos de evolución biológica
a algoritmos genéticos
3.1 Acercamiento teórico a los conceptos biológicos básicos:
Cada individuo de cada una de las especies del planeta posee ciertas característi-
cas que lo identifican. Dichas características, que suelen ser externas (como el color de
ojos) aunque también pueden ser internas (como el grupo sanguíneo), forman el fenoti-
po de un individuo que es el resultado de la interacción del medio ambiente en que se
desarrolla y la herencia que recibe de sus ancestros. Dicho fenotipo está determinado
por las proteínas que produce y está definido en la información genética de cada una de
las células del individuo. A su vez, la información acerca de las proteínas que se produ-
cirán está contenida en los cromosomas. En cada célula existen dos juegos de cromo-
somas que definen las mismas características. Un cromosoma es una larga molécula de
ADN formada por proteínas que definen los genes. El conjunto de todos los cromoso-
mas, es decir, de toda la información genética de un individuo se llama genoma y el
conjunto de genes contenidos en el genoma se denomina genotipo que es que determina
en buena medida el fenotipo del individuo. Existen unas células especiales, llamadas
gametos, que intervienen en la reproducción dividiéndose mediante un proceso denomi-
nado meiosis del siguiente modo:
1. Se duplica el número de cromosomas en la célula, esto es, se hace una copia de
cada cromosoma. Al final quedan dos juegos correspondientes al padre y dos a
la madre.
2. Se cruzan un juego de cromosomas del padre con uno de la madre, formándose
dos juegos de cromosomas híbridos. El resultado es un juego de cromosomas
puros del padre, un juego puro de la madre y dos juegos de cromosomas híbri-
dos.
3. Se divide la célula dos veces y al final del proceso quedan cuatro células haploi-
des (con un solo juego de cromosomas): una con cromosomas puros del padre,
una con cromosomas puros de la madre y dos con cromosomas híbridos.
El proceso de meiosis
11
mutación que puede manifestarse en el fenotipo y hacer al individuo diferente del resto
de sus congéneres. Por lo general las mutaciones son desfavorables e incluso letales
para el organismo mutante pero a veces pueden no serlo y conferir a dicho organismo
alguna ventaja que le permita sobrevivir más fácilmente en su medio. Dicha caracterís-
tica será transmitida a sus descendientes y se habrá producido un pequeño paso evoluti-
vo.
12
4. Operadores Genéticos más usuales
4.1 Mutación:
13
4.2 Reproducción:
ui
Pi =
uT
donde uT es la suma de las aptitudes de todos los individuos de la población.
4.3 Crossover:
14
• Crossover n-puntos: los dos cromosomas se cortan por n puntos, y el material-
genético situado entre ellos se intercambia. Lo más habitual es un crossover de
un punto o de dos puntos.
15
5. Algoritmo Genético Simple
5.1 Pseudocódigo:
BEGIN
Generar una población inicial
Computar la función de evaluación de cada individuo
WHILE NOT Terminado DO
BEGIN /* Producir nueva generación */
FOR (Tamaño población)/2 DO
BEGIN /*Ciclo reproductivo*/
Seleccionar dos individuos de la generación an-
terior, para el cruce (probabilidad de selec-
ción proporcional a la función de e evaluación
del individuo)
Cruzar con cierta probabilidad los dos indivi-
duos obteniendo dos descendientes
Mutar los dos descendientes con cierta probabi-
lidad
Computar la función de evaluación de los dos
descendientes mutados
Insertar los dos descendientes mutados en la
nueva generación
END
IF la población ha convergido THEN
Terminado := TRUE
END
END
Se supone que los individuos (posibles soluciones del problema), pueden repre-
sentarse como un conjunto de parámetros (que denominaremos genes), los cuales agru-
pados forman una ristra de valores (a menudo referida como cromosoma). Si bien el
alfabeto utilizado para representar los individuos no debe necesariamente estar consti-
tuido por el {0, l}, buena parte de la teoría en la que se fundamentan los algoritmos ge-
néticos utiliza dicho alfabeto.
Durante la fase reproductiva se seleccionan los individuos de la población para
cruzarse y producir descendientes, que constituirán, una vez mutados, la siguiente gene-
ración de individuos. La selección de padres se efectúa al azar usando un procedimiento
16
que favorezca a los individuos mejor adaptados, ya que a cada individuo se le asigna
una probabilidad de ser seleccionado que es proporcional a su función de adaptación.
Este procedimiento se dice que está basado en la ruleta sesgada. Según dicho esquema,
los individuos bien adaptados se escogerán probablemente varias veces por generación,
mientras que, los pobremente adaptados al problema, no se escogerán más que de vez en
cuando.
Una vez seleccionados dos padres, sus cromosomas se combinan, utilizando ha-
bitualmente los operadores de cruce y mutación. Estos y otros operadores están explica-
dos en la sección de operadores genéticos.
Para criterios prácticos, es muy útil la definición de convergencia introducida en
este campo por De Jong en su tesis doctoral en relación con los algoritmos genéticos
simples. Si el algoritmo ha sido correctamente implementado, la población evolucionará
a lo largo de las generaciones sucesivas de tal manera que la adaptación media extendi-
da a todos los individuos de la población, así como la adaptación del mejor individuo se
irán incrementando hacia el óptimo global. El concepto de convergencia está relaciona-
do con la progresión hacia la uniformidad: un gen ha convergido cuando al menos el 95
% de los individuos de la población comparten el mismo valor para dicho gen. Se dice
que la población converge cuando todos los genes han convergido. Se puede generalizar
dicha definición al caso en que al menos un pequeño porcentaje de los individuos de la
población hayan convergido.
Resumiendo, se puede explicar el proceso de un algoritmo genético simple de un
modo bastante gráfico (vemos la probabilidad de un suceso como el acto de lanzar una
modela al aire) como sigue:
1. Decidir cómo codificar el dominio del problema.
2. Generar un conjunto aleatorio (población inicial) de N posibles soluciones codi-
ficadas al problema. A esta se le llamará población actual.
3. Calificar cada posible solución (individuo) de la población actual.
4. Seleccionar dos individuos de la población actual con una probabilidad propor-
cional a su calificación.
5. Lanzar una moneda al aire (supongamos que la probabilidad de cara es pc).
6. Si cayó cara mezclar los códigos de los dos individuos seleccionados para for-
mar dos híbridos, a los que llamaremos nuevos individuos.
7. Si cayó cruz llamamos a los individuos seleccionados nuevos individuos.
8. Por cada bit de cada nuevo individuo lanzar otra moneda al aire (supongamos
que en este caso cae cara con probabilidad pm ).
9. Si cae cara cambiar el bit en turno por su complemento.
10. Si cae cruz, el bit permanece inalterado.
11. Incluir a los dos nuevos individuos en una nueva población.
12. Si la nueva población tiene ya N individuos, llamarla población actural y regre-
sar al paso 3, a menos que se cumpla alguna condición de terminación.
13. Si no, regresar al paso 4.
17
5.3 Ejemplo:
18
Población en el tiempo 3, proveniente de efectuar los operadores de
cruce y mutación sobre los individuos de la tabla anterior.
Admitamos, por ejemplo, que los dos números extraídos sean menores que 0.8,
decidiéndose por tanto efectuar el cruce entre las dos parejas. Para ello escogeremos un
número al azar entre 1 y L (siendo L la longitud de la ristra utilizada para representar el
individuo). Notése que la restricción impuesta al escoger el número entre 1 y L, se reali-
za con la finalidad de que los descendientes no coincidan con los padres. Supongamos,
tal y como se indica en la segunda tabla, que los puntos de cruce resulten ser 2 y 3. De
esta manera obtendríamos los 4 descendientes descritos en la tercera columna de dicha
tabla. A continuación (siguiendo el pseudocódigo descrito) mutaríamos con una proba-
bilidad p, cercana a cero, cada uno de los bits de las cuatro ristras de individuos. En este
caso suponemos que el único bit mutado corresponde al primer gen del tercer individuo.
En las dos últimas columnas se pueden consultar los valores de los individuos, así como
las funciones de adaptación correspondientes. Como puede observarse, tanto el mejor
individuo como la función de adaptación media han mejorado sustancialmente al com-
pararlos con los resultados de la tabla inicial.
19
6. Algoritmo Genético Paralelo
20
Técnicamente hay 3 características importantes que influyen en la eficiencia de
un algoritmo genético paralelo:
• La topología que define la comunicación entre subpoblaciones.
• La proporción de intercambio: número de individuos a intercambiar.
• Los intervalos de migración: periodicidad con que se intercambian los
individuos.
Comunicación en Estrella
Normalmente, la operación que se suele implementar en paralelo es la evalua-
ción de la adecuación de los individuos, porque suele ser la más compleja. Además, este
valor es independiente del resto de la población, por lo que su implementación es muy
sencilla.
21
El intercambio de información entre los nodos es sencillo: el nodo maestro envía
el subconjunto de inviduos que corresponde a cada nodo, y estos le devuelven los valo-
res de adecuación para cada uno de ellos. La comunicación puede ser implementada de
dos maneras: síncrona o asíncrona. En la primera de ellas, el nodo maestro espera a re-
cibir los valores de adecuación de todos los individuos para generar la siguiente genera-
ción. En la segunda, el algoritmo no espera a que los nodos más lentos envíen sus valo-
res de fitness (función de capacidad, aptitud o potencial asigna una puntuación (la capa-
cidad) a cada cromosoma de la población actual, que depende de cómo resuelva ese
cromosoma el problema a tratar). De este modo conseguimos agilizar el proceso, pero el
comportamiento no es exactamente el mismo que el de un algoritmo genético secuen-
cial. La implementación síncrona, en cambio, sí mantiene este comportamiento.
Varios estudios han sido realizados para evaluar el rendimiento de este tipo de
algoritmos. Algunos resultados interesantes pueden verse, por ejemplo, en el que reali-
zaron Abramson, Mills y Perkins, que usando dos computadores de memoria comparti-
da observaron un incremento de prestaciones razonablemente alto en comparación con
los algoritmos genéticos tradicionales usando hasta 16 procesadores. A partir de ese
número, el comportamiento se degradaba, dato que justificaban por el aumento del coste
de las comunicaciones.
Comunicación en red
Se han llevado a cabo algunos estudios para determinar si el tamaño de los ve-
cindarios influía o no en la presión de selección de los individuos. Sarma y De Jong
encontraron que la relación entre el radio de los vecindarios y el radio de la población
completa influía en este aspecto, y cuantificaron el tiempo que tardaba en propagarse
una solución buena al resto de la población con diferentes tamaños para los vecindarios.
Otros estudios han intentado determinar qué tipo de representaciones espaciales
daban mejores resultados. Schwehm experimentó con varias representaciones: un anillo,
22
un toro, un cubo 16x8x8 y un hipercubo 4x4x4x4x4. El problema con el que trabajó fue
el particionamiento de grafos, y encontró que el algoritmo que usó la estructura de toro
convergió más rápidamente que el resto, aunque no da detalles sobre la calidad de las
soluciones encontradas.
Comunicación en anillo
En 1985 Grosso realizó el que se puede considerar como el primer estudio de los
algoritmos genéticos paralelos con múltiples poblaciones. Algunos de sus resultados,
lejos de aclarar si el uso de este tipo de algoritmos es recomendable en sustitución de
los tradicionales algoritmos genéticos secuenciales, arrojan nuevas incógnitas. Por
ejemplo, observó que los individuos de las poblaciones, cuando estas están aisladas,
convergen más rápidamente hacia valores óptimos, pero que estos valores no son tan
buenos como los obtenidos con los algoritmos secuenciales. Con valores bajos en el
ratio de migraciones los cambios apenas son apreciables. Una vez alcanzado un deter-
minado ratio de migración, que dependerá del problema y de la topología empleada, las
soluciones encontradas por estos algoritmos igualan en calidad a las encontradas por el
algoritmo secuencial. Como este y otros estudios demuestran, el buen funcionamiento
de estos algoritmos depende en gran medida de varios factores, de entre los que desta-
can la frecuencia con la que se realicen las migraciones y la topología de comunicación
entre las subpoblaciones que se use.
Este tipo de algoritmos son, quizás, los más complejos de los vistos hasta el
momento, dado que combinan dos de los algoritmos anteriores una estructura de dos
niveles. En el nivel superior suele haber siempre un algoritmo de grano grueso (multi-
población). En el nivel inferior se han probado los tres tipos de algoritmos vistos: maes-
tro-esclavo, de grano fino y de grano grueso. A esta estructuración en dos niveles se le
23
denomina jerarquía y, por eso, muchas veces a estos algoritmos se les denomina algo-
ritmos genéticos jerárquicos (del inglés Hierarchical Genetic Algorithms).
La primera posibilidad es combinar un algoritmo multipoblación en el nivel su-
perior con un algoritmo de grano fino en el nivel inferior.
24
frecuencias de migraciones bajas, lo cual hace que la complejidad no crezca demasiado,
siendo aproximadamente igual a la de un algoritmo paralelo con multipoblaciones tradi-
cional.
25
6.3 Influencia de la topología de comunicación en un algorit-
mo paralelo
26
7. Aplicaciones de los Algoritmos Genéticos
27
8. Aplicación informática basada en Algoritmos Gené-
ticos
8.1 Descripción general
La aplicación que he elegido para estudiar una aplicación práctica de los algo-
ritmos genéticos es un applet que busca el extremo de una función dada utilizando di-
chos algoritmos. Podemos variar dicha función además de indicarle al programa si ha de
buscar bien el máximo o bien el mínimo. El applet se encontrón en una introducción a
algoritmos genéticos de la página del profesor Marek Obitko del Departamento de
Ciencias Computacionales e Ingeniería de la universidad de Praga
http://cs.felk.cvut.cz/~xobitko/ga/example3d.html.
28
El applet ofrece la posibilidad de variar el factor de recombinación y el de muta-
ción. El factor de recombinación lo podemos variar entre el 0% y 100% con una varia-
ción de una unidad porcentual. En cuanto al factor de mutación, este puede ser oscilado
entre 0% y el 20% con una variación mínima del 0.1%.
Una vez hayamos elegido los parámetros correctos de recombinación y de muta-
ción así como el mínimo y máximo de X e Y, podemos presionar Star para comenzar la
búsqueda del mínimo, pudiendo parar la ejecución en cualquier momento mediante Stop
para retomarla posteriormente con Continue. Si nos parece que la aplicación funciona a
demasiada velocidad con el botón Step podemos ir ejecutando paso a paso. Por último
con Reset se vuelve a iniciar la búsqueda tomando unos parámetros iniciales nuevos.
Durante la ejecución podemos ir variando los parámetros de mutación y crossover e ir
viendo como cambia la ejecución. También podemos variar el objetivo de la búsqueda
(máximo o mínimo).
A lo largo de la ejecución podemos ver donde buscamos la solución (líneas azu-
les) y la mejor solución actual (línea roja).
8.2 Prueba
29
Vemos que así la solución permanece por algunos ciclos estancada en puntos
que no son la mejor solución pero con el tiempo la solución habitualmente mejora. No
obstante si aumentamos el factor de mutación (a un 1.5%) se evitan esos estancamientos
alcanzando una solución mejor en un período de tiempo inferior. Pues cuando la solu-
ción no mejora por el efecto de la recombinación se produce una mutación que varía la
descendencia.
Si aumentamos el factor de recombinación (80%) pero dejando el valor para la
mutación al 0.2% vemos como la solución se alcanza antes que en la primera ejecución
pero por ser la mutación baja en algunas ejecuciones tarda más que en otras.
30
8. Bibliografía
Los links que pertenecen a la bibliografía han sido comprobados el (20/05/07)
Tutorial de Informática Evolutiva
http://geneura.ugr.es/~jmerelo/ie/index.html
Informática evolutiva: Algoritmos genéticos Juan Julián Merelo Guervós
http://geneura.ugr.es/~jmerelo/ie/ags.htm
Introducción a los Algoritmos Genéticos Carlos A. Coello Coello
http://www.redcientifica.com/doc/doc199904260011.html
Algoritmos genéticos y computación evolutiva Adam Marczyk 2004
http://the-geek.org/docs/algen/
Búsqueda, Optimización y Aprendizaje (algoritmos genéticos) Eduardo Morales
http://ccc.inaoep.mx/~emorales/Cursos/Busqueda04/node98.html
Algoritmos Genéticos
http://eddyalfaro.galeon.com/geneticos.html
Introducción a los algoritmos genéticos y sus aplicaciones Piedad Tolmos Rodríguez-
Piñero
http://www.uv.es/asepuma/X/J24C.pdf
Algoritmos genéticos paralelos Antonio la Torre de la Fuente (16/09/ 2005)
http://laurel.datsi.fi.upm.es/~atorre/_media/universidad/algoritmos_geneticos_paralelos.
pdf?id=universidad%3Adoctorado&cache=cache
Algoritmos Genéticos en Paralelo de Grado Fino por Martin Pelikan, Prasanna
Parthasarathy, and Arun Ramraj Traducido por Germán Rojo Eguren
http://www.acm.org/crossroads/espanol/xrds8-3/fineGrained.html
Informática evolutiva J. J. Merelo Guervós
http://geneura.ugr.es/~jmerelo/ie/ie.ps.gz
Creación de música mediante algoritmos genéticos
http://www.rieoei.org/opinion43.htm
Algoritmos genéticos
http://www.ecobachillerato.com/experto/algoritmo.pdf
Algoritmos genéticos Introducción, métodos de búsqueda y optimización
Raúl Martín Rello
Algoritmos genéticos en grafos: Algoritmos Evolutivos
http://www.dma.eui.upm.es/MatDis/Seminario3/GenAlg.pdf
Algoritmos Genéticos: Princípios y Aplicaciones Marco Aurélio Cavalcanti Pacheco
31
Algoritmos Genéticos Katherine Viteri, Christian Salazar, Carlos Paredes, José Luis
Muñoz
http://www.fiec.espol.edu.ec/investigacion/topico/tabusearch.pdf
Introducción a los algoritmos genéticos y applets de ejemplo (incluido el applet
utilizado en este trabajo
http://cs.felk.cvut.cz/~xobitko/ga/
32