BookinglyTech News
Software

gabble, una librería de algoritmos genéticos en Haskell montada sobre recursion schemes

Un post de 2019 vuelve a circular: su autor prototipa en Haskell una librería de algoritmos genéticos y aprovecha para practicar recursion schemes y computación monádica.

2 min de lecturaLobsters0 vistas

Un post de blog de 2019 sobre Haskell vuelve a circular y sigue teniendo material aprovechable para quien programa en este lenguaje. Su autor prototipó gabble, una librería de algoritmos genéticos, y usó el ejercicio para practicar recursion schemes y computación monádica. Lo interesante no es el algoritmo genético, resuelto ya en cualquier lenguaje, sino el andamiaje funcional que lo envuelve.

El estado va en una mónada

Toda la ejecución vive en GAContext, un newtype sobre la mónada RWS con un generador PureMT como estado. Con eso, el código pide la configuración con ask, actualiza el generador con get y put, y escribe trazas con tell, sin arrastrar parámetros a mano por cada función. El autor reconoce que hace falta GeneralizedNewtypeDeriving para que la definición salga limpia.

La interfaz de la librería es un único registro de configuración: probabilidad de mutación por individuo y por gen, tasa de cruce, tamaño de población y las funciones que aporta el usuario —mutate, crossover, randomIndividual, selectionMethod, fitness—, además del número de generaciones y una función de log.

Cada generación es un paso de una función step que recibe un GASnapshot y devuelve el siguiente. Dentro selecciona padres, genera hijos cruzando y mutando, actualiza el hall of fame y registra lo ocurrido. El snapshot guarda la última generación, el número de generación y ese hall of fame, modelado como un min-heap: cuando aparece un individuo mejor que el peor de la colección, el peor sale por arriba. Es la misma idea que usa deap en Python.

El cruce y la mutación se resuelven en una sola pasada con un hylomorphism, hyloM, aplicado sobre el vector de padres. El autor remite a la documentación existente sobre recursion schemes en lugar de explicarlos desde cero, y avisa de que todo esto es un prototipo.

Qué saca de aquí quien no escriba Haskell

El interés está en el diseño, no en el rendimiento. Configurar la librería con un registro de funciones la convierte en algo que se enchufa sin herencia ni jerarquías, y la mónada resuelve el problema de arrastrar aleatoriedad y trazas por todo el código. Quien tenga que montar un bucle evolutivo en otro lenguaje reconoce ahí dos decisiones que se pueden copiar tal cual.

Para uso real el propio autor apunta a moo, una librería de algoritmos genéticos en Haskell bastante más completa. gabble nació como práctica de recursion schemes y como tal hay que leerlo: no hay benchmarks, ni comparación con alternativas, ni demo más allá del código.