Skip to content

RGiskard7/genetic-programming-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Genetic Programming in Java

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.


Índice


Requisitos

  • JDK 11 o superior
  • Maven 3.6+

Construcción y ejecución

# Compilar
mvn compile

# Tests
mvn test

Aplicación con interfaz gráfica (JavaFX):

mvn javafx:run

Desde 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.TesterDemoValores

El 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.


Qué es la Programación Genética

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.

Idea central

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).

Flujo típico

  1. Población inicial: se generan al azar muchos árboles (individuos) con una profundidad y un conjunto de funciones/terminales fijos.
  2. Evaluación: para cada individuo se calcula su fitness (p. ej. −RMSE en regresión, o precisión en clasificación).
  3. Selección: se eligen padres (en este proyecto, por torneo: se toman varios candidatos al azar y se eligen los mejores).
  4. 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.
  5. Reemplazo: la nueva generación se forma con los mejores de la actual (elitismo) y los hijos obtenidos por cruce y mutación.
  6. Se repite desde el paso 2 hasta cumplir un criterio de parada (número de generaciones, fitness objetivo o estancamiento).

Por qué es útil

  • 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.


Funcionalidad

  • 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.

Estructura del proyecto

├── 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).

Tests

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 test

Documentación

  • doc/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.

Licencia

MIT License. Copyright (c) Eduardo Díaz Sánchez. Ver LICENSE.

About

Genetic programming (GP) implementation in Java. Evolves expression trees for symbolic regression, binary classification, and logic synthesis. Includes JavaFX GUI, CSV/TSV data loading, and reproducible runs.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages