Implementación en Java de Programación Genética (GP): evolución de árboles de expresiones para regresión simbólica, clasificación binaria y síntesis de funciones booleanas. Incluye interfaz gráfica (JavaFX) para configuración, ejecución y visualización de resultados.
- Requisitos
- Construcción y ejecución
- Qué es la Programación Genética
- Funcionalidad
- Estructura del proyecto
- Tests
- Documentación
- Licencia
- JDK 11 o superior
- Maven 3.6+
# Compilar
mvn compile
# Tests
mvn testAplicación con interfaz gráfica (JavaFX):
mvn javafx:runDesde el IDE: ejecutar la clase gui.AppGP con el classpath de Maven y módulos JavaFX (por ejemplo, en VS Code usar la configuración de lanzamiento que incluye --module-path para JavaFX).
Ejecución por línea de comandos (sin GUI):
mvn compile
java -cp target/classes test.TesterAlgoritmoProgramacionGenetica [fichero_datos]
java -cp target/classes test.TesterDemoValoresEl directorio de trabajo debe ser la raíz del proyecto para que se resuelvan los ficheros de datos. Ver más abajo la lista de ficheros de ejemplo.
La Programación Genética (GP) es una técnica de optimización y búsqueda inspirada en la evolución natural. Pertenece a la familia de los algoritmos evolutivos y fue popularizada por John Koza en los años 90.
En lugar de evolucionar parámetros (como en los algoritmos genéticos clásicos), la GP evoluciona estructuras de programa: en este proyecto, árboles de expresiones. Cada individuo es un árbol cuyos nodos internos son funciones (operadores como +, −, ×, ÷, sin, cos, etc.) y cuyas hojas son terminales (variables como x o constantes). Al evaluar el árbol con valores concretos se obtiene un resultado numérico; la calidad del individuo se mide con una función de fitness que depende del problema (p. ej. error cuadrático medio frente a datos observados).
- Población inicial: se generan al azar muchos árboles (individuos) con una profundidad y un conjunto de funciones/terminales fijos.
- Evaluación: para cada individuo se calcula su fitness (p. ej. −RMSE en regresión, o precisión en clasificación).
- Selección: se eligen padres (en este proyecto, por torneo: se toman varios candidatos al azar y se eligen los mejores).
- Variación:
- Cruce: se intercambian subárboles entre dos padres para producir dos hijos.
- Mutación: se sustituye un subárbol por uno generado al azar.
- Reemplazo: la nueva generación se forma con los mejores de la actual (elitismo) y los hijos obtenidos por cruce y mutación.
- Se repite desde el paso 2 hasta cumplir un criterio de parada (número de generaciones, fitness objetivo o estancamiento).
- Regresión simbólica: descubrir fórmulas que se ajusten a datos sin imponer a priori la forma de la ecuación (a diferencia de una regresión lineal o polinómica fija).
- Clasificación: evolucionar expresiones que, evaluadas con las entradas, separen clases (p. ej. salida > 0.5 → clase 1).
- Síntesis de circuitos lógicos: encontrar expresiones booleanas que reproduzcan una tabla de verdad.
La GP es estocástica: distintas ejecuciones (o distintas semillas) pueden dar distintos resultados. Por eso suele usarse con semilla fija para reproducibilidad y múltiples ejecuciones para estudios estadísticos.
- Representación: individuos como árboles de expresiones en notación prefija. Funciones binarias (+, −, *, / con división protegida) y unarias (sin, cos, neg, abs, exp, log, sqrt, sqr). Terminales: variables y constantes (fijas o efímeras aleatorias).
- Inicialización: ramped half-and-half (mitad “full”, mitad “grow”) para diversidad.
- Operadores: selección por torneo, cruce por subárbol (soporta cualquier aridad), mutación por sustitución de subárbol, elitismo. Límite de profundidad y de nodos; parada por generaciones sin mejora.
- Dominios:
- Regresión: pares (x, y) desde fichero; fitness = −RMSE − α·nodos.
- Clasificación binaria: columnas numéricas + etiqueta 0/1; fitness = precisión − α·nodos.
- Booleano: tabla de verdad; fitness = aciertos − α·nodos.
- Datos: carga desde TSV/CSV; detección de cabecera; soporte multivariado en regresión.
- GUI (JavaFX): selector de fichero, tipo de problema (Regresión / Clasificación), parámetros del algoritmo, conjunto de funciones y constantes, gráfico de evolución del fitness, mejor expresión, gráfico datos vs curva (regresión) y visualización del árbol. Exportación de la mejor expresión y registro opcional en CSV.
- Reproducibilidad: semilla configurable en el algoritmo.
├── pom.xml
├── README.md
├── LICENSE
├── changelog.md
├── valores*.txt, clasificacion*.csv, tablaVerdad*.txt # Ficheros de datos de ejemplo
├── doc/
│ ├── DOCUMENTACION.md # Arquitectura y referencia técnica
│ └── ROADMAP.md # Ideas de evolución
└── src/
├── main/java/
│ ├── algoritmogenetico/ # AlgoritmoGenetico, dominio, individuo, nodos, util
│ ├── excepciones/
│ └── gui/ # AppGP (JavaFX)
└── test/java/test/ # Tests JUnit y runners (Tester*)
Ficheros de datos de ejemplo
| Fichero | Tipo | Descripción |
|---|---|---|
valores.txt, valoresLineal.txt, valoresX2.txt, valoresCubica.txt |
Regresión | Univariado (x, y): polinomios sencillos. |
valoresPolinomio4.txt |
Regresión | y = x⁴ − 2x² (polinomio grado 4). |
valoresTrigComplejo.txt |
Regresión | y = sin(x) + 0.5·cos(2x). |
valoresExpGauss.txt |
Regresión | y = exp(−x²) (campana de Gauss). |
valoresX2Ruido.txt |
Regresión | y ≈ x² con ruido (ajuste robusto). |
valoresMultiVar.txt |
Regresión multivariada | (x, y) → z ≈ x² + y². |
valoresMultivariadoComplejo.txt |
Regresión multivariada | (x, y) → z = x + y + x·y. |
benchmark_nguyen1.txt |
Regresión (benchmark) | Nguyen-1: y = x³ + x² + x en [−1, 1]. Ver doc/BENCHMARKS.md. |
clasificacionEjemplo.csv |
Clasificación | AND de dos entradas. |
clasificacionXOR.csv |
Clasificación | XOR (no lineal). |
clasificacionCirculo.csv |
Clasificación | Dentro/fuera de círculo (x²+y² < 1). |
tablaVerdad.txt |
Booleano | Mayoría de 3 bits. |
tablaVerdad4vars.txt |
Booleano | Parity de 4 bits. |
tablaVerdadMayoria4.txt |
Booleano | Mayoría de 4 bits (≥3 de 4). |
Suite JUnit 5 para individuos, cruce, mutación, dominio (aritmético, booleano, clasificación), integración del algoritmo (población impar, funciones unarias) y logger de evolución.
mvn testdoc/DOCUMENTACION.md— Arquitectura (interfaces, implementaciones), operadores, dominios y uso.doc/BENCHMARKS.md— Benchmarks de regresión simbólica (p. ej. Nguyen-1): ficheros de datos, parámetros recomendados y resultados típicos.doc/ROADMAP.md— Posibles extensiones y mejoras.changelog.md— Historial de cambios.
MIT License. Copyright (c) Eduardo Díaz Sánchez. Ver LICENSE.