Aprende IA

Algoritmos genéticos: guía práctica con una mochila resuelta

Selección, cruce y mutación explicados con una mochila resuelta a mano, y criterios para decidir cuándo un algoritmo genético compensa.

Un algoritmo genético es un método de optimización que imita la evolución: genera muchas soluciones, conserva las mejores, las combina y las altera al azar hasta dar con una buena. No garantiza el óptimo, pero sirve cuando el problema es demasiado grande o desordenado para un cálculo exacto.

Aquí tienes las cuatro piezas (aptitud, selección, cruce y mutación), una mochila resuelta a mano y los criterios para decidir si te compensa usarlo en tu empresa.

¿Qué es un algoritmo genético y para qué sirve?

Es una técnica de búsqueda de la familia de la computación evolutiva. John Holland, de la Universidad de Michigan, la formalizó en su libro de 1975 Adaptation in Natural and Artificial Systems.

Su utilidad práctica es encontrar buenas soluciones donde probar todas las combinaciones es imposible. Ejemplos típicos: rutas de reparto, turnos de personal, colocación de piezas en una placa o parámetros de un controlador.

No es machine learning en el sentido habitual: no aprende de datos históricos, sino que busca dentro de un espacio de soluciones. Eso sí, a veces se usa para ajustar modelos o buscar la configuración de redes neuronales.

El bucle es siempre el mismo:

  1. Crear una población inicial de soluciones candidatas, normalmente aleatorias.
  2. Medir la calidad de cada una con la función de aptitud.
  3. Seleccionar a las mejores como progenitores.
  4. Generar hijos mediante cruce y mutación.
  5. Formar la nueva generación y repetir hasta cumplir un criterio de parada.

¿Cómo funcionan la aptitud, la selección, el cruce y la mutación?

Codificación: cómo se representa una solución

Primero, cada solución se convierte en un «cromosoma»: una cadena de genes. En una mochila, cada gen es un bit que indica si el objeto entra (1) o no (0).

En una ruta, el cromosoma es una permutación de ciudades, por ejemplo C-A-D-B. La diferencia importa: si cortas dos rutas por la mitad y las intercambias, puedes repetir o perder ciudades. Para permutaciones se usan operadores específicos, como el cruce de orden, que conserva cada ciudad una sola vez.

Función de aptitud: el criterio de negocio

Es la pieza más importante. Recibe una solución y devuelve un número: beneficio, coste, kilómetros, tiempo de entrega o una combinación ponderada. Aquí se traduce tu decisión de negocio a matemáticas.

Si la función premia lo equivocado, el algoritmo lo optimizará con total eficacia. Las restricciones (capacidad, ventanas horarias) se imponen descartando o penalizando las soluciones que las incumplen.

Selección: quién se reproduce

Las soluciones con mayor aptitud tienen más probabilidad de ser progenitoras. Dos métodos habituales:

  • Torneo: se eligen dos o tres individuos al azar y gana el mejor.
  • Ruleta: la probabilidad de elegir a cada uno es proporcional a su aptitud.

Conviene que los peores conserven alguna opción pequeña. Si solo se reproduce la élite, la población pierde diversidad y se estanca.

Cruce: combinar lo bueno de dos soluciones

Se toman dos progenitores y se mezclan sus genes. En el cruce de un punto se corta por una posición y se intercambian las colas. La idea es que un hijo herede partes útiles de ambos.

Mutación: la exploración

Con probabilidad baja, se altera un gen al azar: un bit cambia o dos ciudades intercambian posición. La mutación introduce variantes que ningún progenitor tenía y ayuda a salir de los óptimos locales.

Una regla práctica habitual es mutar, de media, un gen por cromosoma. Con demasiada mutación, la búsqueda se vuelve aleatoria.

¿Cómo se resuelve una mochila paso a paso?

La mochila admite 12 kg y hay seis objetos. Quieres maximizar el valor transportado sin pasarte de peso.

  • A: 4 kg, valor 8
  • B: 3 kg, valor 5
  • C: 5 kg, valor 9
  • D: 2 kg, valor 3
  • E: 6 kg, valor 11
  • F: 1 kg, valor 2

Paso 1: codificar y crear la población

Cada cromosoma tiene seis bits, en el orden A-B-C-D-E-F. Generamos cuatro al azar:

  • P1 = 101010 (A, C, E)
  • P2 = 110100 (A, B, D)
  • P3 = 011001 (B, C, F)
  • P4 = 100011 (A, E, F)

Paso 2: calcular la aptitud

La aptitud es el valor total, o 0 si el peso supera 12 kg.

  • P1: 4+5+6 = 15 kg. Se pasa, aptitud 0.
  • P2: 9 kg, valor 8+5+3 = 16.
  • P3: 9 kg, valor 5+9+2 = 16.
  • P4: 11 kg, valor 8+11+2 = 21.

La aptitud media es (0+16+16+21)/4 = 13,25.

Paso 3: seleccionar

Usamos torneos de dos individuos. Supongamos que salen estos cuatro: P4 contra P1, P3 contra P2, P4 contra P2 y P2 contra P1.

Ganan P4, P3 (empate a 16, lo decide el azar), P4 y P2. Los progenitores quedan en dos parejas: (P4, P3) y (P4, P2). P1 no habría ganado ningún torneo, porque su aptitud es 0.

Además aplicamos elitismo: P4, el mejor, pasa intacto a la siguiente generación para no perderlo por accidente.

Paso 4: cruzar

Cruzamos P3 y P4 cortando tras el segundo gen: P3 = 01|1001 y P4 = 10|0011.

  • Hijo 1 = 01|0011: B, E, F. Pesa 10 kg y vale 18.
  • Hijo 2 = 10|1001: A, C, F. Pesa 10 kg y vale 19.

La otra pareja, P4 y P2, se corta tras el tercer gen. Da 100100 (A, D: 6 kg, valor 11) y 110011 (A, B, E, F: 14 kg, inválido, aptitud 0).

Paso 5: mutar

Supongamos que el azar cambia el cuarto gen del Hijo 2 de 0 a 1. Pasa de 101001 a 101101, es decir, A, C, D y F. Pesa 4+5+2+1 = 12 kg y vale 8+9+3+2 = 22.

Esta mutación la hemos elegido para ilustrar el efecto. En una ejecución real, el azar la produciría o no, quizá en una generación posterior.

Paso 6: nueva generación y comprobación

La nueva población queda así: 100011 (21), 101101 (22), 010011 (18) y 100100 (11). Descartamos el hijo inválido.

La aptitud media pasa de 13,25 a (21+18+22+11)/4 = 18, y la mejor sube de 21 a 22. Repetiríamos el ciclo hasta que la mejor solución deje de mejorar durante varias generaciones.

Con seis objetos hay 26 = 64 combinaciones, así que podemos verificarlo por fuerza bruta. El máximo es 22 y lo alcanzan varias combinaciones: A-C-D-F, A-E-D, C-E-F y A-B-C.

La heurística voraz de elegir por valor/peso daría A, F y E (11 kg, valor 21). Se queda a uno del óptimo, y por eso a veces compensa explorar.

¿Cuándo conviene un algoritmo genético frente a otros métodos?

Conviene cuando el espacio de búsqueda es enorme, la función de aptitud es difícil de derivar y te vale una solución muy buena en un tiempo razonable.

Con 50 objetos, la mochila tiene 250 combinaciones: 1.125.899.906.842.624, algo más de mil billones. Probarlas todas no es una opción.

Aun así, la mochila es un mal ejemplo de uso real. Existen algoritmos exactos, como la programación dinámica, que la resuelven bien. La usamos porque se calcula a mano.

Método Encaja cuando Límite principal
Búsqueda exhaustiva Hay pocas combinaciones Se vuelve inviable al crecer el problema
Programación lineal o entera (solvers) Puedes formular el problema con ecuaciones y restricciones lineales Exige un modelo matemático limpio
Descenso de gradiente La función es continua y derivable Falla con variables discretas o funciones no derivables
Heurística voraz Necesitas una respuesta inmediata Puede quedarse lejos del óptimo
Algoritmo genético Espacio enorme, función como «caja negra», restricciones raras Sin garantía de óptimo y con ajuste de parámetros

La regla práctica: si puedes formular tu problema como programación lineal o entera, prueba primero un solver, como Google OR-Tools. Suele dar la solución óptima o una cota de lo cerca que estás.

El genético entra cuando la función de aptitud es una simulación, un cálculo opaco o un criterio con reglas inusuales.

El coste real: evaluar la aptitud

El coste de un genético no está en cruzar ni mutar, sino en evaluar. Cada individuo exige llamar a la función de aptitud.

Un ejemplo hipotético: una simulación tarda un minuto y lanzas 100 individuos durante 200 generaciones. Son 20.000 evaluaciones, unas 333 horas en serie. Repartidas entre 32 núcleos, bajan a algo más de 10 horas.

Los genéticos se paralelizan muy bien, pero conviene hacer esta cuenta antes de empezar. Si cada evaluación es cara, quizá compense un modelo sustituto más barato.

¿Qué aplicaciones reales tienen en ingeniería, logística y diseño?

  • Logística: rutas de vehículos con ventanas horarias, carga de contenedores y asignación de pedidos a almacenes. Son variantes del viajante y de la mochila, con restricciones que complican el modelo exacto.
  • Planificación: turnos de personal, horarios de aulas o de quirófanos y secuenciación de producción. Hay muchas reglas cruzadas y es difícil encontrar un modelo limpio.
  • Ingeniería de diseño: forma de piezas, distribución de componentes y parámetros de controladores. El caso más citado es la antena de la misión ST5 de la NASA, diseñada mediante computación evolutiva.
  • Robótica y control: ajuste de trayectorias y de parámetros, como en la robótica y la automatización industrial.
  • Software e IA: selección de hiperparámetros y de variables, y generación de pruebas automáticas, junto a otras prácticas de IA en el desarrollo de software.

Para términos como «óptimo local» o «convergencia prematura», consulta el glosario de inteligencia artificial.

¿Cómo montar el primero con ayuda de un asistente de IA?

La forma más rápida es partir de una librería. DEAP es un marco flexible para computación evolutiva en Python. PyGAD es más sencilla para empezar.

Un asistente como ChatGPT, Gemini o Claude te ahorra el código base. Si dudas sobre cómo pedírselo, repasa cómo usar ChatGPT. Este prompt reproduce el caso anterior:

Actúa como ingeniero de optimización. Escribe en Python, con la librería DEAP, un algoritmo genético para este problema de mochila: capacidad 12; objetos (peso, valor): A(4,8), B(3,5), C(5,9), D(2,3), E(6,11), F(1,2).
Requisitos: cromosoma binario de 6 genes; aptitud igual al valor total, o 0 si se supera la capacidad; selección por torneo de tamaño 2; cruce de un punto; mutación por bit con probabilidad 1/6; población de 20; 30 generaciones; semilla fija.
Imprime la mejor aptitud de cada generación y compara el resultado con una búsqueda exhaustiva de las 64 combinaciones. Comenta el código.

Resultado esperado: un script que imprime una aptitud creciente por generación. Debería acercarse a 22, el óptimo de la búsqueda exhaustiva, en pocas generaciones.

Si se queda en 21, sube la mutación o la población, o aumenta las generaciones. Si no mejora nunca, revisa la penalización, que es el fallo más habitual.

Si quieres aplicarlo a tu empresa, empieza por escribir la función de aptitud en una hoja de cálculo para diez soluciones reales, con su coste y sus restricciones. Si no puedes puntuar y comparar esas diez, todavía no estás listo para optimizar. Si puedes, prueba antes un solver y deja el genético para cuando el modelo exacto no te quepa.

Preguntas frecuentes

¿Un algoritmo genético garantiza la mejor solución?

No. Encuentra soluciones buenas, pero puede quedarse en un óptimo local o no llegar al global. Para comprobarlo, repite varias ejecuciones con semillas distintas y compara los resultados.

¿Qué diferencia hay con una red neuronal?

Una red neuronal aprende patrones a partir de datos. Un algoritmo genético busca la mejor solución entre muchas posibles, sin datos de entrenamiento. Se pueden combinar: por ejemplo, para buscar la configuración de una red.

¿Qué parámetros hay que ajustar?

Los principales son el tamaño de la población, la probabilidad de mutación, el tipo de selección y el criterio de parada. Casi siempre hace falta probar varios valores en tu problema concreto.

¿Necesito saber programar para usarlos?

Para un uso serio, sí: hay que escribir la función de aptitud. Con una librería y un asistente de IA, un perfil técnico medio puede tener un prototipo en una tarde. Aun así, valida el resultado contra un caso que ya conozcas.

Subir