Una caja negra
Millones de pesos, decisión ininterpretable. Sabemos qué predice, pero no por qué.
Cuando los algoritmos evolucionan sus propias fórmulas
Una clase introductoria para quienes nunca han trabajado con Programación Genética (GP). Recorreremos cada elemento del algoritmo, cómo se representa y cómo, generación tras generación, descubre por sí solo la fórmula x² + x.
El problema de la caja negra
El Deep Learning es extraordinariamente potente, pero sus decisiones quedan repartidas en millones de parámetros que nadie puede leer. En dominios críticos —medicina, finanzas, defensa— no basta con acertar: hay que poder explicar, auditar y justificar cada predicción. Ahí entra GP.
Millones de pesos, decisión ininterpretable. Sabemos qué predice, pero no por qué.
Ecuación explícita, auditable, explicable. Cada término puede inspeccionarse, simplificarse y discutirse con un experto del dominio.
«GP no te da una caja negra: te entrega una fórmula que puedes leer.»
¿Qué es GP?
GP es un algoritmo evolutivo que genera, combina y selecciona programas de computadora —normalmente fórmulas— imitando la selección natural, hasta encontrar uno que resuelva el problema.
Cada solución candidata es un programa completo, representado como un árbol de operaciones y variables.
Se trabaja con un conjunto de cientos o miles de programas candidatos a la vez, no con una sola solución.
Los mejores programas se reproducen y se modifican; generación tras generación, la población mejora.
x*x, luego se le suma x. En notación prefija (estilo Lisp, la de Koza): (+ (* x x) x).GP evoluciona programas, no pesos.
La sección más importante
Cada componente, con su representación visual y un ejemplo numérico sobre y = x² + x.
3.1 · Individuo
Un individuo es un programa completo, representado como un árbol cuya evaluación produce una salida.
+ − * / sin cos exp log if. Reciben argumentos de sus hijos.x, y, z y constantes como 1 o 3.14.Se evalúa desde las hojas hacia la raíz:
x = 2 → (* x x) = 4 → (+ 4 x) = 6 ✓ (y real = 6)Profundidad = 2 · Tamaño = 5 nodos.
3.2 · Población
La población es el conjunto de individuos (árboles) que coexisten en una generación.
| Individuo | Fórmula | Notación prefija | Profundidad | Tamaño |
|---|---|---|---|---|
| #1 | x | x | 0 | 1 |
| #2 | x + 1 | (+ x 1) | 1 | 3 |
| #3 | x * x | (* x x) | 1 | 3 |
| #4 | x + x | (+ x x) | 1 | 3 |
| #5 | x * x + x | (+ (* x x) x) | 2 | 5 |
3.3 · Función de aptitud
El fitness es un número que mide qué tan bien resuelve el problema cada individuo; es la única «brújula» que guía la evolución.
Predicciones: 1, 4, 9 frente a los valores reales 2, 6, 12.
|2−1| + |6−4| + |12−9| = 1 + 2 + 3 = 6| Ind. | Fórmula | ŷ(1) | ŷ(2) | ŷ(3) | MAE | Fitness 1/(1+MAE) |
|---|---|---|---|---|---|---|
| #1 | x | 1 | 2 | 3 | 4.67 | 0.176 |
| #2 | x + 1 | 2 | 3 | 4 | 3.67 | 0.214 |
| #3 | x * x | 1 | 4 | 9 | 2.00 | 0.333 |
| #4 | x + x | 2 | 4 | 6 | 2.67 | 0.273 |
| #5 | x * x + x óptimo | 2 | 6 | 12 | 0.00 | 1.000 |
Un mal fitness = GP no converge o sobreajusta. Si la métrica no refleja lo que de verdad importa, la evolución optimizará lo equivocado.
3.4 · Selección
La selección elige qué individuos serán padres de la siguiente generación, favoreciendo a los de mejor fitness.
Presión selectiva sin perder diversidad.
Se sortean k individuos al azar y gana el de mejor fitness. Con k controlamos la presión.
Observa que el óptimo (#5) no fue sorteado: el torneo deja oportunidades a otros, y eso preserva diversidad.
La probabilidad de ser elegido es fitness / Σ fitness.
Los mejores pasan intactos a la siguiente generación, para no perderlos por azar. élite (1) → x*x + x se copia tal cual
3.5 · Cruce (crossover)
El cruce elige un punto (nodo) en cada padre e intercambia los subárboles que cuelgan de ellos, generando dos hijos.
P1 = x*x + x, P2 = x + 1. Se intercambia el subárbol x*x de P1 con la hoja x de P2:
El cruce explora combinaciones nuevas de bloques que ya funcionaban.
x*x + x
x + 1
x + x
x*x + 1
3.6 · Mutación
La mutación altera al azar una parte de un solo individuo para introducir material genético nuevo.
Exploración secundaria; tasa baja (5–10 %).
x*x + x+ → *) · x*x*x| Tipo | Qué cambia | Cambio | Resultado | ŷ(1, 2, 3) |
|---|---|---|---|---|
| Punto | Un nodo por otro de la misma aridad (nº de argumentos). | + → * | x*x*x | 1, 8, 27 |
| Subárbol | Un subárbol completo por uno nuevo generado al azar. | x → (x − 1) | x*x + (x − 1) | 1, 5, 11 |
| Hoja | Un terminal por otro terminal (variable o constante). | x → 2 | x*x + 2 | 3, 6, 11 |
3.7 · Inicialización
La inicialización construye al azar los árboles de la primera población, respetando una profundidad máxima.
Define el punto de partida de la búsqueda.
Solo funciones hasta llegar a la profundidad máxima; todas las ramas tienen la misma longitud. Árboles «llenos».
En cada nodo se elige al azar entre funciones y terminales; si sale un terminal, la rama se cierra. Formas irregulares.
Propuesto por Koza: reparte la población entre varias profundidades y, en cada una, mitad Full y mitad Grow. Maximiza la diversidad inicial.
+
x: la rama se cierra
*
y, 1 → x + y*1
3.8 · Criterios de parada
Un criterio de parada decide cuándo termina el bucle y se reporta el mejor individuo encontrado.
En la práctica se combinan varios: el primero que se cumpla detiene la ejecución.
Se fija un presupuesto de iteraciones.
G = 50 generacionesSe alcanzó un error suficientemente pequeño.
MAE ≤ 0.01El mejor fitness no mejora durante varias generaciones.
20 generaciones sin mejoraLímite de tiempo o de evaluaciones de fitness.
60 s · 10⁵ evaluaciones3.9 · Control de bloat
El bloat es el crecimiento del tamaño de los árboles sin una mejora correspondiente del fitness.
Aparece código inútil («intrones») que no cambia la salida, pero vuelve los programas lentos de evaluar y difíciles de leer, justo lo contrario de lo que buscamos.
Se rechazan los hijos que superen una profundidad máxima (Koza usó 17) y se conserva a un padre en su lugar.
Se penaliza el tamaño dentro del fitness: error + α · tamaño.
α = 0.01 → 0.05 (5 nodos) vs 0.13 (13 nodos)El subárbol que entra en el cruce debe tener un tamaño similar al que sale, para que los hijos no crezcan sin control.
Todo junto
«Cada elemento tiene una representación concreta y un rol preciso en el bucle.»
Historia breve
Cuatro décadas de evolución de una idea: que los programas también pueden evolucionar.
Nichael L. Cramer usa por primera vez una representación en árbol dentro de un algoritmo genético para evolucionar programas sencillos.
John R. Koza publica sus primeros trabajos y, en 1992, el libro fundacional Genetic Programming (MIT Press), que da nombre y método al campo.
Aceleración con GPU, resultados «competitivos con humanos» y regresión simbólica en la industria (p. ej. Eureqa, 2009).
Evolutionary Coding Agents que usan LLMs como operadores de variación, regresión simbólica a gran escala y herramientas patentadas como Beagle.
¿Por qué importa en 2026?
Las fórmulas que produce GP pueden auditarse término a término. Eso las hace adecuadas para entornos regulados, donde cada decisión automática debe poder justificarse ante un experto o un auditor.
Los LLMs proponen mutaciones y cruces «inteligentes» de código; GP aporta la búsqueda evolutiva y la evaluación rigurosa. A esto se suman la simplificación simbólica de modelos y los Evolutionary Coding Agents.
La regresión simbólica busca la ecuación que explica los datos, no solo una predicción. Se usa para proponer leyes y relaciones en física, biología y finanzas que luego el científico puede validar.
Aplicaciones concretas
Industria 4.0
Enfoques de optimización con GP (OGP) en fábricas inteligentes: por ejemplo, evolucionar reglas de despacho para planificar tareas en talleres dinámicos.
Reglas que un ingeniero de planta puede leer, entender y aplicar.
Finanzas y defensa
Herramientas como Beagle aplican regresión simbólica a modelos predictivos; sus desarrolladores reportan una mejora del 61 % en la predicción de precios de vivienda.
Precisión competitiva con una fórmula que se puede auditar.
Agroalimentación y biomedicina
Modelos simbólicos para estimar el contenido proteico de alimentos y para el monitoreo de enfermedades a partir de variables clínicas.
El experto del dominio puede validar cada variable del modelo.
Nota: las cifras de casos comerciales (p. ej. el 61 % de Beagle) son las reportadas por sus desarrolladores; conviene contrastarlas con la fuente original antes de citarlas.
Fronteras abiertas
Dónde se está trabajando hoy con más fuerza sobre GP. Cada línea incluye una referencia de entrada para quien quiera profundizar o elegir tema de tesis.
En lugar de evolucionar programas desde cero, GP modifica software ya existente para reparar errores, acelerarlo o reducir su consumo de energía o memoria, sin perder su funcionalidad.
Punto de entrada: Petke, J. et al. (2018). Genetic Improvement of Software: a Comprehensive Survey. IEEE Transactions on Evolutionary Computation, 22(3). · Le Goues, C. et al. (2012). GenProg. IEEE Transactions on Software Engineering, 38(1).
GP como modelo interpretable por diseño y también como herramienta para explicar a posteriori modelos de caja negra mediante fórmulas o reglas simbólicas sustitutas.
Punto de entrada: Mei, Y. et al. (2023). Explainable Artificial Intelligence by Genetic Programming: A Survey. IEEE Transactions on Evolutionary Computation, 27(3).
Comparación rigurosa de métodos con benchmarks comunes, mejores optimizadores de constantes y herramientas abiertas que llevan la regresión simbólica al trabajo científico diario.
Punto de entrada: La Cava, W. et al. (2021). Contemporary Symbolic Regression Methods and their Relative Performance. NeurIPS Datasets and Benchmarks. · Cranmer, M. (2023). PySR, arXiv:2305.01582.
Operadores que actúan sobre el comportamiento (la semántica) del programa y no solo sobre su sintaxis, con un espacio de búsqueda sin óptimos locales; su costo motiva implementaciones paralelas en GPU.
Punto de entrada: Moraglio, A., Krawiec, K. y Johnson, C. G. (2012). Geometric Semantic Genetic Programming. PPSN XII, LNCS 7491, Springer.
Los LLMs actúan como operadores de mutación y cruce sobre código, mientras el bucle evolutivo selecciona con un evaluador automático. Ya ha producido resultados nuevos en matemáticas y algoritmia.
Punto de entrada: Romera-Paredes, B. et al. (2024). Mathematical discoveries from program search with large language models. Nature, 625, 468–475.
GP diseña pipelines completos de aprendizaje automático o reglas de decisión (por ejemplo, de planificación de producción) que luego se reutilizan en problemas nuevos.
Punto de entrada: Olson, R. S. et al. (2016). Evaluation of a Tree-based Pipeline Optimization Tool for Automating Data Science. GECCO 2016.
Preguntas transversales en todas estas líneas: controlar el bloat, mantener la diversidad (p. ej. selección lexicase) y reducir el costo de evaluar el fitness.
Lo que aún no está resuelto
Tras más de treinta años, GP sigue teniendo retos fundamentales sin una solución definitiva. Son también buenas preguntas de tesis.
Los árboles crecen sin mejorar el fitness. Existen paliativos (límites, parsimonia), pero no una explicación completa de por qué ocurre ni una solución general.
¿Cómo obtener programas compactos sin frenar la búsqueda?
Cada individuo se evalúa sobre todos los datos en cada generación. Con millones de registros o simulaciones costosas, el tiempo de cómputo se dispara.
¿Cómo escalar GP a grandes volúmenes de datos sin perder calidad?
Una fórmula puede ajustar perfectamente los datos de entrenamiento y fallar en datos nuevos. Medir y controlar la generalización de un programa sigue siendo difícil.
¿Qué propiedades de un programa predicen que generalizará bien?
GP encuentra bien la estructura de una fórmula, pero ajustar sus constantes numéricas (p. ej. 3.14 o 0.8) solo con mutación y cruce es ineficiente.
¿Cómo combinar búsqueda simbólica y optimización numérica de forma eficiente?
La teoría de GP (esquemas, análisis de tiempo de ejecución) explica casos sencillos, pero aún no predice el comportamiento en problemas realistas.
¿Cuándo y por qué converge GP, y en cuántas generaciones?
Una fórmula legible no es automáticamente interpretable: 40 nodos son «legibles» pero nadie los entiende. Falta una medida aceptada de interpretabilidad.
¿Cómo cuantificar qué tan comprensible es un modelo para un humano?
GP brilla en fórmulas, pero le cuesta evolucionar programas con bucles, recursión, estructuras de datos y módulos reutilizables.
¿Cómo escalar GP de expresiones a software real?
Muchos estudios usan problemas de prueba demasiado fáciles o distintos entre sí, lo que dificulta comparar métodos de forma justa.
¿Qué conjunto de problemas representa de verdad los retos del mundo real?
Para una visión de conjunto: O’Neill, M., Vanneschi, L., Gustafson, S. y Banzhaf, W. (2010). Open issues in genetic programming. Genetic Programming and Evolvable Machines, 11(3–4), 339–363.
Demostración conceptual
Solo damos a GP los datos y los operadores permitidos {+, −, *, /} con terminales {x, 1}. Nadie le dice que la respuesta es cuadrática.
xx + xx*x + 1x*x + x1 → x, en naranja) completa la fórmula exacta.| Generación | Mejor individuo | ŷ(1, 2, 3) | MAE | Fitness | ¿Qué ocurrió? |
|---|---|---|---|---|---|
| G0 | x | 1, 2, 3 | 4.67 | 0.176 | Población inicial aleatoria (ramped half-and-half). |
| G3 | x + x | 2, 4, 6 | 2.67 | 0.273 | El cruce combina hojas x bajo una suma. |
| G6 | x*x + 1 | 2, 5, 10 | 1.00 | 0.500 | El cruce inserta el bloque x*x (como en 3.5). |
| G9 | x*x + x exacto | 2, 6, 12 | 0.00 | 1.000 | Mutación de hoja 1 → x; se cumple el criterio de parada. |
«GP descubre la fórmula sola; el humano solo define datos y operadores.»
10 — Cierre
Cuatro ideas para recordar al salir de la clase.
Para profundizar
Las obras fundacionales de GP y los textos de referencia para seguir estudiando.
Koza, J. R. (1992). Genetic Programming: On the Programming of Computers by Means of Natural Selection. Cambridge, MA: MIT Press.
La obra que da nombre y método al campo: árboles de expresión, cruce de subárboles, ramped half-and-half y decenas de problemas resueltos.
Koza, J. R. (1989). Hierarchical genetic algorithms operating on populations of computer programs. En Proceedings of the 11th International Joint Conference on Artificial Intelligence (IJCAI-89), Vol. 1, pp. 768–774.
Primera presentación de Koza del enfoque que formalizaría en 1992.
Cramer, N. L. (1985). A representation for the adaptive generation of simple sequential programs. En Proceedings of the First International Conference on Genetic Algorithms and their Applications, pp. 183–187.
Primer uso de programas representados como árboles dentro de un algoritmo genético.
Koza, J. R. (1994). Genetic Programming II: Automatic Discovery of Reusable Programs. Cambridge, MA: MIT Press.
Introduce las funciones definidas automáticamente (ADFs) para reutilizar subprogramas.
Banzhaf, W., Nordin, P., Keller, R. E. y Francone, F. D. (1998). Genetic Programming: An Introduction. San Francisco: Morgan Kaufmann.
Introducción académica clásica, útil como texto de curso.
Langdon, W. B. y Poli, R. (2002). Foundations of Genetic Programming. Berlín: Springer.
Fundamentos teóricos: teoría de esquemas, espacio de búsqueda y bloat.
Poli, R., Langdon, W. B. y McPhee, N. F. (2008). A Field Guide to Genetic Programming. Lulu.com.
Guía práctica y gratuita; el mejor punto de partida después de esta clase.
O’Neill, M., Vanneschi, L., Gustafson, S. y Banzhaf, W. (2010). Open issues in genetic programming. Genetic Programming and Evolvable Machines, 11(3–4), 339–363.
Revisión de los problemas abiertos del campo, base de la sección 08.
Schmidt, M. y Lipson, H. (2009). Distilling free-form natural laws from experimental data. Science, 324(5923), 81–85.
Regresión simbólica que redescubre leyes físicas a partir de datos (base de Eureqa).