La evolución no es solamente un proceso biológico. Sus principios pueden aplicarse al desarrollo de software y hardware, a veces con resultados insospechados.
¿Qué es la evolución?
La evolución es el cambio de las características heredables a través de generaciones sucesivas de una población.
En el siglo XIX, Charles Darwin formuló, en su libro “El Origen de las Especies”, la teoría científica de la evolución a través de la selección natural, basándose en tres hechos observables:
- Los individuos de una especie tienen variaciones en su forma, fisiología y comportamiento.
- Dichas variaciones influyen en su probabilidad de sobrevivir y reproducirse.
- Esas variaciones pueden heredarse de generación en generación.
Al pasar el tiempo, los miembros de generaciones sucesivas de una especie van siendo reemplazados por nuevos individuos cuyos padres están mejor adaptados a sobrevivir en su entorno y, por tanto, tienen mayores posibilidades de reproducirse.
La selección natural pareciera “elegir” y preservar características que están mejor adaptadas a los roles funcionales que desempeñan, pero no ocurre así; simplemente es el resultado de una población que sobrevive y se reproduce más exitosamente que otra debido a sus características heredadas.
Al aparente propósito y cumplimiento de objetivos por parte de las estructuras y funciones de los seres vivos se le llama Teleonomía. Veamos dos interpretaciones del mismo hecho:
- “La mariposa monarca migra de Canadá a México en invierno PARA ESCAPAR tanto del clima helado así como la escasez de flores para alimentarse”
- “La mariposa monarca migra de Canadá a México en invierno Y POR TANTO, LOGRA ESCAPAR tanto del clima helado así como la escasez de flores para alimentarse”
La primera oración implica un propósito anticipatorio. La segunda, una característica adaptativa que heredó toda una especie y le permitió sobrevivir a un fenómeno climático cíclico. La Teleonomía es un enfoque programático y computacional sobre la adaptación derivada de una historia evolutiva, aunque también puede aplicarse a la operación de un programa y su eficiencia para cumplir un objetivo.
La selección natural a través del tiempo es la única causa conocida de adaptación, pero no es la única que desencadena la evolución; también existen las mutaciones (el cambio permanente que ocurre al azar en la información genética de una especie) y la deriva genética (el cambio en la frecuencia con la que se presenta una variante genética en una población). En el cómputo evolutivo solamente se usan las mutaciones.
¿Qué es el cómputo evolutivo?
Es un campo de la inteligencia artificial que utiliza algoritmos inspirados en un enfoque darwiniano para resolver problemas, y de ahí su nombre. Un algoritmo evolutivo es por naturaleza un método iterativo de prueba y error que busca encontrar una solución global optimizada; esto es, con valores óptimos para todas las variables que lo definen en lugar de un máximo o mínimo local. Tuvo su origen en la década de 1950 y actualmente se considera representado en cuatro áreas:
Programación evolutiva
La estructura del programa a optimizar es fija. Únicamente cambian sus variables numéricas.
Estrategias evolutivas
El problema se representa como una serie de variables sujetas a dos operadores: Mutación, que modifica aleatoriamente sus valores pero con una intensidad gobernada por auto adaptación o covarianza, y selección, que evalúa en conjunto qué tan bien lo resuelven.
Los operadores se aplican iterativamente, y cada ciclo es llamado una generación. La secuencia de generaciones se detiene cuando se satisface un criterio de terminación, como puede ser la poca diferencia en la función de selección aún transcurridas muchas generaciones sucesivas.
Algoritmos genéticos
Se trata de un proceso de búsqueda heurístico (es decir, una metodología suficientemente buena para alcanzar metas inmediatas, pero sin garantía de ser óptima o perfecta) que imita la selección natural para encontrar una solución óptima mediante el uso de herencia, mutación, selección y cruzamiento. La población de soluciones candidatas (llamada individuos, criaturas o fenotipos) es evaluada iterativamente por funciones objetivo; aquellas que obtengan mejor puntaje son seleccionadas estocásticamente y sujetas a recombinación y/o mutación de su genoma para formar la siguiente generación. El proceso se detiene tras haber alcanzado un número dado de generaciones o bien haber alcanzado un nivel satisfactorio en las funciones objetivo. Los algoritmos genéticos son fáciles de implementar, pero difíciles de comprender cuando han encontrado una solución.
Programación genética
Es una metodología que hace evolucionar programas de computadora para que realicen una tarea específica, evaluados por una función de desempeño. Cada programa es representado con una estructura de árbol; cada nodo es un operador y cada terminal un operando. Las ramas se pueden intercambiar con otro individuo de la población, o bien se hace mutar un nodo de un individuo.
¿Tiene desventajas el cómputo evolutivo?
Las cuatro áreas ya mencionadas demandan gran poder de procesamiento, particularmente al evaluar las soluciones propuestas con las funciones objetivo. Una sola evaluación exacta puede tardar horas, por lo que a veces se cambia el criterio a evaluaciones aproximadas que sean computacionalmente más eficientes.
Plantear un problema en términos de cómputo evolutivo es una tarea que crece exponencialmente con la complejidad, por lo que debe dividirse en subproblemas que tengan la representación más simple posible. Actualmente, no es posible diseñar un automóvil de forma evolutiva, ni siquiera un motor completo. Pero sí puede diseñarse un mejor pistón, un mejor cigüeñal, etcétera, aunque vendrá la dificultad adicional de integrarlas en un todo más grande, potencialmente disminuyendo su eficiencia.
Las soluciones encontradas no siempre constituyen el óptimo global. No se puede distinguir ni saber sacrificar una solución eficiente de corto plazo (un óptimo local) en favor de otra más eficiente a largo plazo. De hecho, pueden tener problemas cuando la función objetivo se reduce a una decisión de resultado apropiado o inapropiado.
¿Cómo puede hacer el software evolucionar al hardware?
El cómputo evolutivo no es un dominio exclusivo del software. A manera de ejemplo, citaremos uno de los trabajos pioneros en el campo y posteriormente seguiremos con otros más recientes.
En 1997, el Dr. Adrian Thompson, de la Universidad de Sussex hizo evolucionar un circuito electrónico que pudiera distinguir entre dos tonos de audio de mil y diez mil KHz, respectivamente.
Para ello, empleó un chip programable llamado FPGA (Field Programmable Gate Array: Arreglo de compuertas programables en campo) que consiste en un arreglo de compuertas lógicas cuyas interconexiones internas no son estáticas, sino pueden ser “programadas” de forma externa. Aunque los FPGAs no son tan rápidos como sus contrapartes diseñadas exprofeso (los llamados ASICs, Circuitos Integrados de Aplicación Específica), ofrecen una enorme plasticidad para reconfigurarse rápidamente con tan sólo cargar un conjunto diferente de instrucciones de conexión. Típicamente, se usan para probar diseños de chips, que una vez finalizados, serán convertidos en una implementación inmutable como ASICs.
El Dr. Thompson puso dos restricciones importantes para el circuito evolucionado: se dispondría únicamente de 100 compuertas para implementarlo, y no se usaría una señal de reloj para sincronizarlo como ocurre en un diseño tradicional.
Se generó una colección inicial de 50 grupos de unos y ceros distribuídos al azar, que fueron cargados uno por uno al FPGA y evaluados por una computadora para saber qué tan bien estaban cumpliendo su objetivo. Debido a que esta población era completamente aleatoria, no sorprendió mucho descubrir que incluso los mejores candidatos eran marginalmente terribles en cumplir la tarea encomendada. Los peores individuos fueron eliminados, y los restantes intercambiaron entre sí fragmentos de unos y ceros, introduciendo ocasionalmente una mutación que cambiaba un uno o cero de forma aleatoria.
Tras doscientas generaciones, el FPGA ya sabía reproducir la señal de entrada. Después de seiscientas, desarrolló sensibilidad a un tono de mil Hertz. Al llegar a la generación mil cuatrocientos, podía identificar tonos en más de 50% de los intentos. Cuatro mil generaciones después, ya no cometía errores. Modificando la especificación original del problema, el FPGA incluso pudo distinguir entre dos comandos de voz tras dejarlo evolucionar su programa algunos cientos de generaciones más.
Tras haber examinado el diseño resultante, ninguno de los investigadores participantes sabía exactamente cómo estaba funcionando. El programa finalista usaba únicamente treinta y siete de las cien compuertas disponibles; la mayoría estaban conectadas como si fueran lazos de retroalimentación. Cinco de ellas incluso no tenían conexión funcional con el resto del circuito; pero si se deshabilitaban, el chip dejaba de trabajar. Y lo más extraño de todo: El programa únicamente funcionaba de forma confiable con ESE chip en particular y no con otro, aunque fuera de la misma familia.
Es muy posible que el diseño evolucionado estuviera aprovechando los campos magnéticos creados por el flujo de electrones dentro de ese FPGA así como las características analógicas intrínsecas en los transistores que lo componen, más que sus propiedades originales como switches digitales. Una solución así difícilmente hubiera sido considerada por un ingeniero electrónico debido, entre otras cosas, al tiempo que le tomaría implementarla.
Otro ejemplo lo tenemos en los trabajos de diseño de antenas evolucionadas. La NASA creó un programa tomaba un diseño simple de antena al que luego iba agregando y modificando elementos de forma semialeatoria. El resultado era evaluado contra ciertos criterios de desempeño (por ejemplo, satisfacer un patrón inusual de radiación, polarización circular de la señal o gran impedancia del ancho de banda); los peores candidatos se eliminaban para dejar una pequeña población de los mejores y repetir el proceso varias veces. La población final a menudo funcionaba mucho mejor que los mejores diseños hechos a mano, y presentaba formas complejas asimétricas y aparentemente caprichosas.
En el año 2006, estos diseños fueron usados dentro de la misión ST5, que consistía en tres satélites que medirían la magnetósfera de nuestro planeta. Cada satélite poseía dos antenas para comunicarse con estaciones terrestres y de haber usado un diseño tradicional, se habrían necesitado dos elementos helicoidales de gran tamaño.
¿Qué aplicaciones podría tener el hardware evolutivo?
Aparte de encontrar una solución extremadamente eficiente a un problema bien definido, sería posible desarrollar sistemas que interactúan con el mundo real y puedan adaptarse a situaciones cambiantes con gran resiliencia. Por ejemplo, la circuitería de control en un satélite o sonda espacial podría reconectarse a sí misma evitando partes conforme se van dañando por la intensa radiación, y aun así operar satisfactoriamente.
Si este tema te gusta, puedes seguir leyendo al respecto en Sociedad de Científicos Anónimos:
Robots que juegan a la biología
Robots que escriben sobre computación
Para saber más
Computación evolutiva
Handbook of Evolutionary Computation, Thomas Back, David B. Fogel, Zbigniew Michalewicz, 1997.
Algoritmos de optimización evolutivaDan Simon, Professor. Universidad estatal de Cleveland
El papel de la Teleonomía en la Evolución.Grace de Laguna, Filosofía de la ciencia
Errores de muestreo y evolución: Universidad de Berkeley
Programación Genética, Grupo privado de investigación
FPGAs Arquitectura
Historia de los FPGAs (la página original ya no está disponible)
Electrónica evolutiva, Universidad de Sussex (la página original ya no está disponible)
Video: Síntesis evolutiva de antenas en la NASA
Sin comentarios