La influencia de Darwin
en el pensamiento científico
contemporáneo
Manuel Martínez Morales
es indudable que la teoría de la evolución, enunciada por
Charles Darwin a mediados del siglo X I X, provocó una
revolución científica. Los conceptos de esta teoría,
como el de selección natural, han permeado desde entonces casi
todas las disciplinas científicas. Así, puede constatarse cómo han
surgido áreas de estudio que van desde la evolución química prebiótica
y la evolución molecular hasta la evolución tecnológica,
pasando por ideas de la evolución aplicadas a las ciencias sociales
y a las ciencias cognitivas. Algunas de estas “aplicaciones” han
sido fructíferas, en tanto que otras han mostrado no ser apropiadas
–como la idea de Marx, inspirada en Darwin, de considerar el
desarrollo histórico de las formaciones sociales como una “historia
natural”– o francamente grotescas –como la interpretación denominada
“darwinismo social”.
Sería demasiado ambicioso pretender en un artículo como
el presente exponer todas las ramificaciones y adaptaciones del
darwinismo en las ciencias contemporáneas, por lo que me limitaré,
a manera de ilustración, a describir la forma en que los conceptos
de evolución y selección natural se han adoptado en el campo de
la inteligencia artificial, en particular en el área de los algoritmos
genéticos. Así que presentaré la forma en que las ideas de Darwin
sobre la evolución y el mecanismo de la selección natural se aplican
en la inteligencia artificial. Este enfoque tiene la ventaja de que, para
que las ideas darwinistas sean funcionales, los conceptos correspondientes
se definen con un alto grado de abstracción, lo que
tiene la ventaja de que las ideas de evolución y adaptación alcancen
un alto grado de generalidad y puedan aplicarse y compren derse tanto en los sistemas artificiales como en
los naturales.
Computación evolutiva
La computación evolutiva es una rama de la
inteligencia artificial que involucra problemas de
optimización combinatoria. Se inspira en los mecanismos
de la evolución biológica.
Durante los años 50 se comenzaron a
aplicar los principios de Charles Darwin en la
resolución de problemas. Durante los años 60 y
70, varias corrientes de investigación independientes
empezaron a formar lo que ahora se
conoce como computación evolutiva.
La programación evolutiva nació en la
década de 1960 y su creador fue Lawrence J.
Fogel. Este desarrollo comenzó como un esfuerzo
encaminado a crear inteligencia artificial
basada en la evolución de máquinas de estado
finitas.
Las estrategias evolutivas fueron propuestas
por Ingo Rechenberg y Hans-Paul
Schwefel en la década siguiente y su principal
objetivo era el de optimizar parámetros.
Los algoritmos genéticos fueron propuestos
por John H. Holland a mediados de esa
década y su motivación inicial fue la de proponer
un modelo general de proceso adaptable.
Algoritmos evolutivos
De manera general, la computación evolutiva
toma como base las ideas de la evolución propuestas por Charles Darwin y los descubrimientos
realizados por Gregor Mendel en el campo de
la genética.
Entre los principales aspectos a considerar
en el diseño de algoritmos evolutivos se
encuentran los siguientes:
1. La elección de una codificación (representación
de las variables del problema en el algoritmo
evolutivo) tiene un gran efecto en el
tamaño del espacio de búsqueda y, por ende,
en el tiempo y dificultad de resolución.
2. La función de desempeño (fitness function), la
cual considera la función objetivo o función de
la que se desea obtener el valor óptimo.
3. Los algoritmos evolutivos poseen diversos
parámetros, los cuales deben ser cuidadosamente
elegidos para obtener un buen desempeño
y evitar problemas tales como la convergencia
prematura.
A continuación se describen someramente la
clase de algoritmos conocidos como “algoritmos
genéticos” que, en cierta forma, ilustran concretamente
las ideas de la computación evolutiva,
además de su interés intrínseco en cuanto a sus
múltiples aplicaciones.
Algoritmos genéticos
Un algoritmo es una serie de pasos organizados
que describen el proceso que se debe seguir
para dar solución a un problema específico.
En los años de 1970, de la mano de John
Henry Holland, surgió una de las líneas más
prometedoras de la inteligencia artificial: la de los
algoritmos genéticos (A G). Son llamados así
porque se inspiran en la evolución biológica y su
base genético-molecular. Estos algoritmos hacen evolucionar una población de individuos sometiéndola a acciones
aleatorias semejantes a las que actúan en la evolución biológica
(mutaciones y recombinaciones genéticas), así como también a
una selección de acuerdo con algún criterio, en función del cual se
decide cuáles son los individuos más adaptados –los que sobreviven–
y cuáles los menos aptos –mismos que son descartados.
También se denominan algoritmos evolutivos e incluyen las
estrategias de evolución, la programación evolutiva y la programación
genética. Un algoritmo genético es un método de búsqueda dirigida
basada en probabilidad. Bajo una condición muy débil (que el algoritmo
mantenga elitismo, es decir, que guarde siempre al mejor elemento
de la población sin hacerle ningún cambio), se puede
demostrar que el algoritmo converge en probabilidad en un grado
óptimo. En otras palabras, al aumentar el número de iteraciones, la
probabilidad de tener el óptimo en la población tiende a 1.
Los algoritmos genéticos establecen una analogía entre el
conjunto de soluciones de un problema, llamado fenotipo, y el conjunto
de individuos de una población natural, codificando la información
de cada solución en una cadena, generalmente binaria,
llamada cromosoma. A los símbolos que forman la cadena se les
llama genes. Cuando la representación de los cromosomas se
hace con cadenas de dígitos binarios, al resultado se le conoce
como genotipo. Los cromosomas evolucionan a través de iteraciones,
llamadas generaciones. En cada generación, los cromosomas
se evalúan usando alguna medida de aptitud. Las siguientes
generaciones (nuevos cromosomas), llamadas descendencia, se
forman utilizando dos operadores: de cruzamiento y de mutación.
Funcionamiento de un
algoritmo genético básico
Un algoritmo genético puede presentar diversas variaciones
dependiendo de cómo se aplican los operadores genéticos (cruzamiento,
mutación), de cómo se realiza la selección y de cómo se
decide el reemplazo de los individuos para formar la nueva
población. En general, consiste de los siguientes pasos:
Inicialización: Se genera aleatoriamente la población inicial,
que está constituida por un conjunto de cromosomas los cuales
representan las posibles soluciones del problema. En caso de no
hacerlo aleatoriamente, es importante garantizar que dentro de la
población inicial se tenga la diversidad estructural de estas soluciones
para tener una representación de la mayor parte de la
población posible o al menos evitar la convergencia prematura.
Evaluación: A cada uno de los cromosomas de esta
población se aplicará la función de aptitud para saber cuán
“buena” es la solución que se está codificando.
Condición de término:El algoritmo genético se deberá
detener cuando se alcance la solución óptima, pero como ésta
generalmente se desconoce, se deben utilizar
otros criterios de detención. Normalmente se
usan dos criterios: correr el AG un número máximo
de iteraciones (generaciones), o detenerlo cuando
no haya cambios en la población. Mientras no se
cumpla la condición de término se hace lo siguiente:
Selección: Después de saber la aptitud
de cada cromosoma, se procede a elegir aquellos
que serán cruzados en la siguiente generación.
Los cromosomas con mejor aptitud tienen mayor
probabilidad de ser seleccionados.
Cruzamiento: El cruzamiento es el principal
operador genético y representa la reproducción
sexual; opera sobre dos cromosomas a la
vez para generar dos descendientes en los que se
combinan las características de ambos cromosomas
padres. La mutación modifica al azar una
parte del cromosoma de los individuos y permite
alcanzar zonas del espacio de búsqueda que
no estaban cubiertas por los individuos de la
población actual.
Reemplazo: Una vez aplicados los operadores
genéticos, se seleccionan los mejores
individuos para conformar la población de la generación
siguiente.
Como se ha dicho, los algoritmos genéticos
tienen muchas aplicaciones, entre las que
podemos destacar las siguientes: en el diseño
automatizado, que incluye investigación en el diseño
de materiales y el diseño multiobjetivo de
componentes automovilísticos: mejor comportamiento
ante choques, ahorros de peso, mejora
de la aerodinámica, diseño de topologías de redes
computacionales, aprendizaje de comportamiento
de robots. En la bioinformática: alineamiento múltiple
de secuencias, selección óptima de modelos
matemáticos para la descripción de sistemas
biológicos, construcción de horarios en grandes
universidades, lo que evita los conflictos de clases,
optimización de producción y distribución de
energía eléctrica y un largo etcétera.
Para el lector interesado
Feldman, M.W. (Ed.) (1989). Mathematical evolutionary
theory. Princeton, MA: Princeton University
Press.
Graur, D. y Li, W.H. (2000). Fundamentals of molecular
evolution (2nd ed.). Sunderland, MA: Sinauer
Associates, Inc.
Holland, J.H. (1994). Adaptation in natural and artificial
systems. An introductory analysis with applications to biology, control, and artificial intelligence. Cambridge, MA: The MIT Press.
Jiménez-Montaño, M. A. y Martínez-Morales, M.
(1993). Un modelo estocástico de competencia
tecnológica. Investigación Operacional,
1(4). La Habana: Universidad de La Habana.
Mason, S.F. (1991) Chemical evolution. Origin of the
elements, molecules, and living systems.
Oxford, MA: Clarendon Press.
Mitchell, M. (2009). Complexity, a guided tour. Oxford,
MA: Oxford University Press.