¿Cómo funcionan los algoritmos genéticos?

Los algoritmos genéticos son una abstracción de la evolución biológica real. Puede usarlos para desarrollar soluciones a muchos problemas, siempre que pueda configurar el sistema de la manera correcta. A menudo, las soluciones que presentan son muy diferentes de lo que un humano diseñaría, y mucho mejores y más complejas de lo que un humano podría diseñar.

Lo primero que necesita es una forma de codificar soluciones en un vector (una cadena de valores). Imaginemos que quieres desarrollar una estructura de puente. Necesita una asignación de una colección de números a un diseño de puente. Hay muchas formas creativas de hacer esto, pero necesita algo que sea robusto. Otra cosa que desea es tener pequeños cambios en los valores para que se correspondan con pequeños cambios en la solución final. Eso facilitará la evolución.

Entonces, por ejemplo, imagine algún tipo de codificación donde los valores en el vector se interpretan como longitud, ángulo, grosor y datos de conexión de un grupo de armaduras en un puente.

Comienza creando una población de vectores aleatorios (genotipos). Digamos 100 individuos. Revisa cada uno, lee los valores y crea un diseño de puente (fenotipo), luego lo prueba de alguna manera (función de condición física) y le asigna una puntuación para indicar qué tan bien se desempeñó (condición física). Tal vez utilizando una simulación física que calcule las tensiones en las armaduras y juntas resultantes de la gravedad, el viento y el tráfico extenso.

Al final de todas estas pruebas, a cada individuo de la población se le ha asignado un valor de aptitud de acuerdo con su desempeño para resolver el problema. Desde que comenzó con números puramente aleatorios, lo más probable es que todos sean terribles. Sin embargo, algunos serán un poco mejores que otros. Algunos pueden aguantar un poco más que otros, y algunos pueden tener subestructuras que soportan bastante bien. El punto es que habrá variación en estos valores de aptitud.

La siguiente etapa es la cría. Necesitas crear la próxima generación. Usted crea 100 ‘niños’ seleccionando aleatoriamente dos padres de la población original. El punto importante aquí es que la probabilidad de que un individuo sea ‘seleccionado’ para ser padre debe ser proporcional a su estado físico relativo. Esto significa que cuanto mayor sea la condición física, más descendencia e individuo deberían tener, en promedio. Un individuo con una condición física relativamente baja debe tener muy pocas posibilidades de reproducirse.

Para crear el genotipo de un niño, toma algunos de los valores del padre A, y el resto del padre B. Esto se llama ‘cruce’ y es similar a cómo obtenemos una mezcla aleatoria de genes de nuestros padres. En esta etapa, los nuevos genotipos se alteran ligeramente al azar. Esto es ‘mutación’, y así es como se introduce el nuevo material genético.

Luego elimina la generación original, la reemplaza por la nueva y prueba cada uno de los nuevos genotipos. Eso es todo al respecto. Dado que el material genético en la nueva población se toma de la población anterior, pero está sesgado hacia las mejores condiciones físicas, en promedio, la nueva población tendrá un puntaje ligeramente más alto que sus padres. Sigue haciéndolo durante muchas generaciones y con el tiempo aumentará la aptitud física promedio de la población. No hay garantía de que se encuentre la “mejor” solución, si hay una, pero generalmente se encontrará una satisfactoria, y en ocasiones una excelente.

Así es como se verá un gráfico típico de un progreso de GA:
El eje x es la generación, y el eje y es la aptitud (lo que sea que eso signifique para este problema).

Puedes ver cómo es un análogo de la biología real. Las personas de la población combinan sus genes y tienen hijos, cuyos genes están sujetos a algunas mutaciones leves. Algunas personas transmiten sus genes muchas veces, mientras que otras no tendrán descendencia. La probabilidad de tener hijos es proporcional a algún tipo de aptitud objetiva. En un GA, diseñas ese estado físico con un propósito en mente, pero en el mundo natural, el entorno define el estado físico (esto es lo que significa ‘selección natural’). El entorno para una especie incluye muchas cosas, como el clima, el clima, la coevolución con otras especies (depredadores, presas, parásitos, huéspedes, simbiontes, polinización), la coevolución con miembros de la misma especie (selección sexual, competencia con otros por comida o compañeros). , eficacia de camuflaje, etc.) y otros factores físicos / químicos.

Los GA pueden desarrollar soluciones a problemas en cualquier área, pero no es fácil definir un buen mapeo de genotipos a soluciones, o explicar lo que quiere al sistema cuando define la función de aptitud. Hay un arte en ello. No hay una bala de plata GA que resuelva todos los problemas, deben diseñarse caso por caso teniendo en cuenta los detalles del problema.

Un algoritmo genético (GA) es un algoritmo de búsqueda aleatoria inteligente. Configura un conjunto de soluciones (tal vez factibles). Luego comienza a mutarlos (creando nuevas soluciones cambiándolos un poco) y mezclándolos (tomando dos soluciones y combinándolas con una nueva). Cómo lo hagas depende del problema. Luego los evalúa por algún tipo de función objetiva. En términos de GA, esta función se llama función de aptitud. Siempre recuerdas el mejor. Después de evaluarlos a todos, destruye algunas soluciones al azar. Cuanto mejor sea la función de aptitud física, menos probable será que se destruya la solución. A partir de las soluciones restantes, itera nuevamente.

Escribí sobre soluciones “quizás viables”. A veces tiene sentido también permitir que las soluciones sean inviables. En ese caso, necesita adaptar su función objetivo de una manera, que las soluciones inviables sean castigadas por algunos términos. Tómelo como un nodo lateral.

Si tiene más preguntas, solo responda.

Bueno, originalmente escribí esta respuesta específicamente para usar la nueva función de video de Quora, pero resulta que esa característica está actualmente rota, así que puse el video que quería usar en YouTube:

Es un poco disperso, pero incluí enlaces para saltar a puntos clave en la descripción:

Saltar al problema específico: 3:50

Saltar al resumen del algoritmo: 12:20

Saltar al código: 16:10

Aquí hay un enlace al código que revisé: [Java] Carlos GA Code – Pastebin.com

Un breve resumen y algunas cosas menores:

  1. Primero defina el problema, la estructura cromosómica, etc. ¿Es binario? ¿Es algún objeto más complejo? ¿Cuál es una estructura eficiente que será fácil de reproducir y mutar?
  2. Definir una función de fitness. Tome su tiempo.

    No lo expliqué claramente, pero en el ejemplo clásico [matemática] \ frac {1} {| x + y + zt |} [/ matemática], funciona porque cuanto más se acerca la suma de las 3 variables a t, cuanto más se acerca el denominador a cero, lo que hace que el valor de la fracción suba bastante. Y abs todo para evitar que se vuelva negativo. No recuerdo dónde lo encontré, pero es realmente una pequeña cosa inteligente.

  3. Crea la generación inicial.
  4. Seleccione / elimine una fracción de la generación actual sobre la base de la función fitness.
  5. Críe este grupo sacrificado para crear una nueva población que sea del mismo tamaño que la anterior.
  6. Mutar a la población para permitir que se introduzca más información genética al azar. En general, no desea que esta mutación sea muy frecuente, pero es importante. Menos del 10% generalmente diría.
  7. Regrese a 4 hasta que haya completado X generaciones.
  8. Seleccione de la última generación el cromosoma con el mejor estado físico.

Y eso es todo.

Bastante intuitivo cuando lo captas por primera vez, debido a su estrecha similitud funcional con la evolución real.


Bonificación: ejecutar un algoritmo codicioso para un tamaño de mochila de 190 resulta en un valor de 1287 con un peso de 171. En contraste con 1293 y 183 de la AG.

Estoy seguro de que en otros casos la diferencia puede ser más dramática, pero incluso en este contexto puede ver que la optimización de GA es superior.

(Si me encuentro con temas más interesantes, puede que intente usar el video nuevamente … espero que pueda juntar mi mierda y hacerlos un poco más concisos).

La idea central detrás del algoritmo genético es el principio darwiniano basado en la evolución natural. El algoritmo genético representa el espacio de búsqueda de optimización a través de una lista de variables y la búsqueda se realiza mediante la creación de una mejor población de descendientes a partir de la población parental en la generación sucesiva.

Aquí se explica con un simple ejemplo.

Los algoritmos genéticos imitan el proceso de selección natural en evolución para crear mejores y mejores soluciones dentro de una población de soluciones sobre iteraciones mediante el uso de algunos criterios. Por lo general, pueden encontrar soluciones globales y hacer esto utilizando esquemas de exploración-explotación, donde el algoritmo es libre de explorar el espacio de solución para áreas con soluciones potencialmente buenas pero tienen restricciones que los mantienen cerca de buenas soluciones en general.

Existen muchas estrategias basadas en la evolución del mundo real, incluidas pérdidas catastróficas de población (extinciones masivas de soluciones), aislamiento (similar a las islas y deriva genética), apareamiento de poblaciones aisladas de vez en cuando … Esto a menudo mejora las soluciones de algoritmos o conduce a una convergencia más rápida de El algoritmo.

Esto los hace ideales para resolver problemas mínimos / máximos difíciles, como problemas de mochila y diseños de ingeniería.

El algoritmo genético se describe mejor como un modelo computacional de selección natural, aplicado a problemas de optimización.

Los GA nos permiten buscar un espacio de parámetros combinando soluciones candidatas para generar nuevas soluciones candidatas y sometiendo cada generación de soluciones candidatas (a partir de un conjunto inicial aleatorio de soluciones) a un cálculo de aptitud. Esta evaluación de la aptitud ayuda a identificar y retener solo a las personas más aptas en una generación de soluciones candidatas, que luego se utilizan como punto de partida para el próximo conjunto.

De esta manera, al desarrollar continuamente nuevas soluciones candidatas basadas en las existentes, obtenemos mejores y mejores diseños que ayudan a lograr el objetivo de diseño en mente (o, cuando se usan en situaciones de optimización matemática, ayudan a encontrar los mejores valores de los parámetros que minimiza o maximiza la función objetivo que tenemos en mente).