En la ciencia de la computación y la investigación de
operaciones, un algoritmo genético ( GA ) es una metaheurística inspirada en el proceso de selección natural que pertenece a la clase más grande de algoritmos evolutivos (EA). Los algoritmos genéticos se utilizan comúnmente para generar soluciones de alta calidad para la optimización y los problemas de búsqueda al depender de operadores de inspiración biológica, como la mutación, el cruce y la selección.
La evolución generalmente comienza en una población de
individuos generados al azar, y es un proceso iterativo, con la población en cada iteración llamada generación. En cada generación, se evalúa la aptitud de cada individuo en la población; la aptitud suele ser el valor de la función objetivo en el problema de optimización que se está resolviendo. Los individuos más aptos son seleccionados estocásticamente de la población actual, y el genoma de cada individuo se modifica (recombinado y posiblemente mutado aleatoriamente) para formar una nueva generación. La nueva generación de soluciones candidatas se usa luego en la próxima iteración del algoritmo. Comúnmente, el algoritmo finaliza cuando se ha producido un número máximo de generaciones o se ha alcanzado un nivel de aptitud física satisfactorio para la población.
Un algoritmo genético típico requiere:
una representación genética del dominio de la solución,
una función de aptitud para evaluar el dominio de la solución.
Una representación estándar de cada solución candidata es como
una matriz de bits. Las matrices de otros tipos y estructuras se pueden usar esencialmente de la misma manera. La propiedad principal que hace que estas representaciones genéticas sean convenientes es que sus piezas se alinean fácilmente debido a su tamaño fijo, lo que facilita operaciones simples de cruce. También se pueden usar representaciones de longitud variable, pero la implementación cruzada es más compleja en este caso. Las representaciones en forma de árbol se exploran en la programación genética y las representaciones de forma gráfica se exploran en la programación evolutiva; una mezcla de cromosomas lineales y árboles se explora en la programación de expresión génica.
Una vez que se definen la representación genética y la función
de aptitud, un GA procede a inicializar una población de soluciones y luego a mejorarla mediante la aplicación repetitiva de los operadores de mutación, cruce, inversión y selección. Existen limitaciones del uso de un algoritmo genético en comparación con algoritmos de optimización alternativos:
La evaluación repetida de la función de aptitud física para
problemas complejos a menudo es el segmento más prohibitivo y limitante de los algoritmos evolutivos artificiales. Encontrar la solución óptima para problemas multidimensionales y multidimensionales complejos a menudo requiere evaluaciones de funciones de aptitud física muy costosas . En problemas del mundo real tales como problemas de optimización estructural, una evaluación de una sola función puede requerir de varias horas a varios días de simulación completa. Los métodos de optimización típicos no pueden hacer frente a este tipo de problemas. En este caso, puede ser necesario renunciar a una evaluación exacta y utilizar una aptitud aproximada que sea computacionalmente eficiente. Es evidente que la amalgama de modelos aproximadospuede ser uno de los enfoques más prometedores para usar GA de manera convincente para resolver problemas complejos de la vida real.
Los algoritmos genéticos no se adaptan bien a la complejidad. Es
decir, cuando el número de elementos que están expuestos a la mutación es grande, a menudo hay un aumento exponencial en el tamaño del espacio de búsqueda. Esto hace que sea extremadamente difícil utilizar la técnica en problemas como el diseño de un motor, una casa o un avión. Para que estos problemas sean manejables para la búsqueda evolutiva, deben dividirse en la representación más simple posible. Por lo tanto, normalmente vemos algoritmos evolutivos que codifican diseños para álabes de ventiladores en lugar de motores, construyendo formas en lugar de planos de construcción detallados, y superficies aerodinámicas en lugar de diseños de aviones completos. El segundo problema de la complejidad es la cuestión de cómo proteger las piezas que han evolucionado para representar buenas soluciones a partir de una mutación más destructiva,
La solución "mejor" es solo en comparación con otras soluciones.
Como resultado, el criterio de detención no está claro en todos los problemas. En muchos problemas, las AG tienen una tendencia a converger hacia puntos óptimos locales o incluso puntos arbitrarios en lugar del óptimo global del problema. Esto significa que no "sabe cómo" sacrificar la aptitud física a corto plazo para obtener una buena forma física a más largo plazo. La probabilidad de que esto ocurra depende de la forma del paisaje de fitness: ciertos problemas pueden proporcionar un fácil ascenso hacia un óptimo global, otros pueden facilitar que la función encuentre el óptimo local. Este problema puede ser aliviado mediante el uso de una función de aptitud diferente, aumentando la tasa de mutación, o mediante el uso de técnicas de selección que mantienen una población diversa de soluciones, aunque el teorema de No Free Lunch demuestra que no hay una solución general a este problema. Una técnica común para mantener la diversidad es imponer un "nicho de penalti", en la que, cualquier grupo de individuos de similitud suficiente (nicho de radio) han añadido un penalti, lo que reducirá la representación de ese grupo en las generaciones posteriores, permitiendo otra (menos similar) individuos a mantener en la población. Sin embargo, este truco puede no ser efectivo, dependiendo del panorama del problema. Otra técnica posible sería simplemente reemplazar parte de la población con individuos generados al azar, cuando la mayoría de la población es muy similar entre sí. La diversidad es importante en los algoritmos genéticos (y la programación genética) porque cruzar una población homogénea no produce nuevas soluciones. En estrategias de evolución y programación evolutiva, la diversidad no es esencial debido a una mayor dependencia de la mutación.
Operar en conjuntos de datos dinámicos es difícil, ya que los
genomas comienzan a converger desde el principio hacia soluciones que pueden dejar de ser válidas para los datos posteriores. Se han propuesto varios métodos para remediar esto aumentando la diversidad genética de alguna manera y previniendo la convergencia temprana, ya sea aumentando la probabilidad de mutación cuando la calidad de la solución cae (llamada hipermutación desencadenada) o introduciendo ocasionalmente elementos completamente nuevos, generados aleatoriamente en el conjunto de genes (llamado inmigrantes aleatorios). De nuevo, estrategias de evolución y programación evolutiva se puede implementar con la llamada "estrategia de coma" en la que los padres no se mantienen y los nuevos padres se seleccionan solo de la descendencia. Esto puede ser más efectivo en problemas dinámicos.