miércoles, 14 de noviembre de 2012

Algoritmo Genético

Un algoritmo es una serie de pasos organizados que describe el proceso que se debe seguir, para dar solución a un problema específico. En los años 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. 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 yrecombinaciones 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, que sobreviven, y cuáles los menos aptos, que son descartados. Es incluido dentro de los algoritmos evolutivos, que incluyen también las estrategias evolutivas, la programación evolutiva y la programación genética. Dentro de esta última se han logrado avances curiosos:
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, guarde siempre al mejor elemento de la población sin hacerle ningún cambio) se puede demostrar que el algoritmo converge en probabilidad al óptimo. En otras palabras, al aumentar el número de iteraciones, la probabilidad de tener el óptimo en la población tiende a 1 (uno).



martes, 13 de noviembre de 2012

Programación con A.G.


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, el pseudocodigo consiste de los siguientes pasos:

Algoritmo genético i: inicialización, f(X): evaluación, ?: condición de término, Se: selección, Cr: cruzamiento, Mu: mutación, Re: reemplazo, X*: mejor solución.
  • 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 qué tan "buena" es la solución que se está codificando.
  • Condición de término El AG se deberá detener cuando se alcance la solución óptima, pero ésta generalmente se desconoce, por lo que 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 los cromosomas que serán cruzados en la siguiente generación. Los cromosomas con mejor aptitud tienen mayor probabilidad de ser seleccionados.
    • Recombinación o Cruzamiento La recombinación es el principal operador genético, representa la reproducción sexual, opera sobre dos cromosomas a la vez para generar dos descendientes donde se combinan las características de ambos cromosomas padres.
    • Mutación modifica al azar 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.

Cruce y Mutaciones


El operador de cruce


Se denomina operador de cruce a la forma de calcular el genoma del nuevo individuo en función del genoma del padre y de la madre. El operador de cruce es fuertemente responsable de las propiedades del algoritmo genético, y determinará en gran medida la evolución de la población.
Existen gran cantidad de técnicas de cruce. Las técnicas básicas son:
  • Cruce básico: se selecciona un punto al azar de la cadena. La parte anterior del punto es copiada del genoma del padre y la posterior del de la madre.
  • Cruce multipunto: igual que el cruce básico, sólo que estableciendo más de un punto de cruce.
  • Cruce segmentado: existe una probabilidad de que un cromosoma sea punto de un cruce. Conforme se va formando la nueva cadena del descendiente, para cada gen, se verifica si ahí se va producir un cruce.
  • Cruce uniforme: para cada gen de la cadena del descendiente existe una probabilidad de que el gen pertenezca al padre, y otra de que pertenezca a la madre.
  • Cruces para permutación: Existe una familia de cruces específicas para los problemas de permutación, siendo algunos de ellos:

    • Cruce de mapeamiento parcial: toma una subsecuencia del genoma del padre y procura preservar el orden absoluto de los fenotipos -es decir, orden y posición en el genoma- del resto del genoma lo más parecido posible de la madre. Aparece también en la bibliografía como PMX.
    • Cruce de orden: toma una subsecuencia del genoma del padre y procura preservar el orden relativo de los fenotipos del resto del genoma lo más parecido posible de la madre. Lo podemos encontrar en la bibliografía como OX.
    • Cruce de ciclo: Tomamos el primer gen del genoma del padre, poniéndolo en la primera posición del hijo, y el primer gen del genoma de la madre, poniéndolo dentro del genoma del hijo en la posición que ocupe en el genoma del padre. El fenotipo que está en la posición que ocupa el gen del genoma del padre igual al primer gen del genoma de la madre se va a colocar en la posición que ocupe en el genoma del padre, y así hasta rellenar el genoma del hijo. Este método también es conocido en la bibliografía como CX.

El operador de mutación


Se define mutación como una variación de las informaciones contenidas en el código genético -habitualmente, un cambio de un gen a otro producido por algún factor exterior al algoritmo genético-. En Biología se definen dos tipos de mutaciones: las generativas, que se heredan y las somáticas, que no se heredan. En los algoritmos genéticos sólo nos serán interesantes las mutaciones generativas. Mas, ¿por qué puede interesar que incorporemos este mecanismo aleatorio?
Algunas de las razones que pueden motivar a incorporar son:
  • Desbloqueo del algoritmo. Si el algoritmo se bloqueó en un mínimo parcial, una mutación puede sacarlo al incorporar nuevos fenotipos de otras zonas del espacio.
  • Acabar con poblaciones degeneradas. Puede ocurrir que, bien por haber un cuasi-mínimo, bien porque en pasos iniciales apareció un individuo demasiado bueno que acabó con la diversidad genética, la población tenga los mismos fenotipos.  Si se ha llegado a una población degenerada, es preciso que las mutaciones introduzcan nuevos genomas.

  • Incrementar el número de saltos evolutivos. Los saltos evolutivos -aparición de un fenotipo especialmente valioso, o, dicho de otra forma, salida de un mínimo local- son muy poco probables en un genético puro para un problema genérico. La mutación permite explorar nuevos subespacios de soluciones, por lo que, si el subespacio es bueno en términos de adaptación, se producirá un salto evolutivo después de la mutación que se expanderá de forma exponencial por la población.
  • Enriquecer la diversidad genética. Es un caso más suave que el de una población degenerada -por ejemplo, que la población tenga una diversidad genética pobre-, la mutación es un mecanismo de prevención de las poblaciones degeneradas.
Sin embargo, si la tasa de mutación es excesivamente alta tendremos la ya conocida deriva genética. Una estrategia muy empleada es una tasa de mutación alta al inicio del algoritmo, para aumentar la diversidad genética, y una tasa de mutación baja al final del algoritmo, para conseguir que converga.
Existen varias técnicas distintas de mutación. Algunas de éstas son:
  • Mutación de bit: existe una única probabilidad de que se produzca una mutación de algún bit. De producirse, el algoritmo toma aleatoriamente un bit, y lo invierte.
  • Mutación multibit: cada bit tiene una probabilidad de mutarse o no, que es calculada en cada pasada del operador de mutación multibit.
  • Mutación de gen: igual que la mutación de bit, solamente que, en vez de cambiar un bit, cambia un gen completo. Puede sumar un valor aleatorio, un valor constante, o introducir un gen aleatorio nuevo.
  • Mutación multigen: igual que la mutación de multibit, solamente que, en vez de cambiar un conjunto de bits, cambia un conjunto de genes. Puede sumar un valor aleatorio, un valor constante, o introducir un gen aleatorio nuevo.
  • Mutación de intercambio: existe una probabilidad de que se produzca una mutación. De producirse, toma dos bits/genes aleatoriamente y los intercambia.
  • Mutación de barajado: existe una probabilidad de que se produzca una mutación. De producirse, toma dos bits o dos genes aleatoriamente y baraja de forma aleatoria los bits -o genes, según hubieramos escogido- comprendidos entre los dos.
En nuestro algoritmo genético hemos implementado el operador de mutación utilizando la técnica de mutación multigen.

Programación Evolutiva


La programación evolutiva (PE) es una rama de la Computación Evolutiva. La programación evolutiva es prácticamente una variación de los algoritmos genéticos, donde lo que cambia es la representación de los individuos. En el caso de la PE los individuos son ternas (tripletas) cuyos valores representan estados de un autómata finito. Cada terna está formada por:
§  El valor del estado actual;
§  un símbolo del alfabeto utilizado;
§  el valor del nuevo estado.
Estos valores se utilizan, como en un autómata finito, de la siguiente manera: Teniendo el valor del estado actual en el que nos encontramos, tomamos el valor del símbolo actual y si es el símbolo de nuestra terna, nos debemos mover al nuevo estado.
Básicamente así funciona y así se representan los individuos en la PE. Evidentemente las funciones de selección, Cruce (crossover) y mutación deben variar para adaptarse y funcionar con una población de individuos de este tipo.

PROGRAMAS EVOLUTIVOS (PE)
Son una estrategia de optimización estocástica similar a los Ags, pero hacen un énfasis específico en los operadores genéticos tal y como se observan en la naturaleza y en la estructura de datos que utilizan adaptada al problema. Por esto, a diferencia de los AGs, los PEs no son restrictivos en cuanto a la representación del problema. Mientras en los AGs se hace necesario una codificación de las soluciones del problema; en los PEs, tal representación se hace de forma directa.

Aplicaciones
Predicción
Generalización
Juegos
Control automático
Problema del viajero
Planeación de rutas
Diseño y entrenamiento de redes neuronales
Reconocimiento de patrones.

ESTRATEGIAS EVOLUTIVAS (EE)

Esta técnica esta básicamente enfocada hacia la optimización paramétrica. En esencia son métodos estocásticos con paso adaptativo, que permiten resolver problemas de optimización paramétrica. A este método se le han agregado procedimientos propios de la computación evolutiva, que lo han convertido en un paradigma más de dicha metodología. Con tal mezcla, las EEs pueden definirse como algoritmos evolutivos enfocados hacia la optimización paramétrica, teniendo como características principales que utilizan una representación a través de vectores reales, una selección determinística y operadores genéticos específicos de cruce y mutación. Además, su objetivo fundamental consiste en encontrar el valor real de un vector de N dimensiones.
Las EEs pueden dividirse en dos tipos: Estrategias Evolutivas Simples y Estrategias Evolutivas Múltiples.
·         EEs Simples
Son consideradas como procedimientos estocásticos de optimización paramétrica con paso adaptativo, esta característica las hace similares al temple simulado. En este caso, se hace evolucionar un solo individuo usando únicamente a la mutación como operador genético. Son relativamente sencillas, y se denominan también EEs de dos miembros. Debido a que evoluciona un solo individuo a la vez, no son consideradas estrictamente como métodos evolutivos. A pesar de ser muy sencillas, son de gran utilidad práctica y han sido utilizadas, con algunas mejoras, para resolver problemas reales en diversas áreas.
·         EEs Múltiples:
Surgen como respuesta a las debilidades de las EEs simples, las cuales tienden a converger hacia subóptimos. En las EEs múltiples existen múltiples individuos (población), y se producen en cada generación varios nuevos individuos, usando tanto mutación como cruce (también puede usarse cualquier otro operador). Se usa normalmente e cruce promedio, el cual genera un único descendiente de dos padres, promediando los vectores de estos. En cuanto a los criterios de reemplazo, siempre se usa un esquema determinístico pudiéndose utilizar una estrategia de inserción o de inclusión.

Algunas aplicaciones de las estrategias evolutivas son
Problemas de ruteo y redes
Bioquímica
Óptica
Diseño en ingeniería
Magnetismo




domingo, 11 de noviembre de 2012

Historia de Los A.G.

Los primeros ejemplos de algoritmos genéticos aparecieron a
finales de los 50 y principios de los 60, programados en computadoras por biólogos evolutivos que buscaban realizar modelos de aspectos de la evolución natural. A ninguno de ellos se le ocurrió que esta estrategia podría aplicarse a problemas artificiales, pero ese reconocimiento no tardaría en llegar. En 1962, investigadores como G.E.P. Box, G.J. Friedman, W.W. Bledsoe y H.J.

Bremermann habían desarrollado independientemente algoritmos inspirados en la evolución para optimización de funciones y aprendizaje automático, pero sus trabajos generaron poca reacción. En 1965 surgió un desarrollo más exitoso, cuando Ingo Rechenberg introdujo una técnica que llamó estrategia evolutiva.

En esta técnica no había población ni cruzamiento; un padre mutaba para producir un descendiente, y se conservaba el mejor de los dos, convirtiéndose en el padre de la siguiente ronda de mutación (Haupt y Haupt 1998). Versiones posteriores introdujeron la idea de población. 

El siguiente desarrollo importante se produjo en 1966, cuando L.J. Fogel, A.J. Owens y M.J. Walsh introdujeron en América una técnica que llamaron programación evolutiva. En este método, las soluciones candidatas para los problemas se representaban como máquinas de estado finito sencillas; al igual que en la estrategia evolutiva de Rechenberg, su algoritmo funcionaba
mutando aleatoriamente una de estas máquinas simuladas y conservando la mejor de las dos (Mitchell 1996; Goldberg 1989). También al igual que las estrategias evolutivas, hoy en día existe una formulación más amplia de la técnica de programación evolutiva que todavía es un área de investigación en curso. Sin embargo, lo que todavía faltaba en estas dos metodologías era el reconocimiento de la importancia del cruzamiento. 

Fue a principios de los 60, en la Universidad de Michigan en Ann Arbor, donde,  dentro del grupo  Logic of Computers, las ideas de Holland empezaron a desarrollarse y a dar frutos. Y fue con “La teoría genética de la selección natural” escrito por R. A. Fisher, donde aprendió que la evolución era una forma de adaptación más potente que el simple aprendizaje, y tomó la decisión de
aplicar estas ideas para desarrollar programas bien adaptados para un fin determinado. Cuando Holland se enfrentó a los algoritmos genéticos, los objetivos de su investigación fueron dos:

• Imitar los procesos adaptativos de los sistemas naturales.
• Diseñar sistemas artificiales (normalmente programas) que retengan los mecanismos importantes de los sistemas naturales. 

En 1975, Holland publico su libro “Adaptación en Sistemas Naturales y Artificiales”. Basado en investigaciones y artículos anteriores del propio Holland  y de colegas de la Universidad de Michigan, donde presentó sistemática y rigurosamente el concepto de sistemas digitales adaptativos utilizando  la mutación, la selección y el cruzamiento, simulando el proceso de la evolución biológica como estrategia para resolver problemas. Ese mismo año, la importante tesis de Kenneth De Jong estableció el potencial de los AGs demostrando que podían desenvolverse bien en una gran variedad de funciones de prueba (Goldberg 1989).
 
En la década de los 80, los algoritmos genéticos se estaban aplicando en una amplia variedad de áreas, desde problemas matemáticos abstractos hasta asuntos tangibles de ingeniería como el control de flujo en una línea de ensamble, reconocimiento y clasificación de patrones y optimización estructural (Goldberg 1989).  

Al principio, estas aplicaciones eran teóricas. Sin embargo, al seguir incrementando la investigación, los algoritmos genéticos migraron hacia el sector comercial, al cobrar importancia con el crecimiento exponencial de la potencia de computación y el desarrollo de Internet. Y en el corazón de todo esto se halla nada más que la simple y poderosa idea de Charles Darwin mencionada al principio: que el azar en la variación, junto con la ley de la selección, es una técnica de resolución de problemas de inmenso poder y de aplicación casi ilimitada.