Actualmente estoy escribiendo un algoritmo genético en Haskell en el que mis cromosomas son estructuras bastante complejas que representan los sistemas ejecutables.Recuperación del desbordamiento de la pila o agotamiento del montón en un programa Haskell
Para poder evaluar la aptitud de mis cromosomas tengo que ejecutar una función evolution
que realiza un ciclo computacional de un sistema dado. La condición física se calcula simplemente contando cuántas veces se puede aplicar evolution
antes de que no haya cambios en el sistema (en cuyo caso el sistema finaliza).
El problema ahora es el siguiente: algunos sistemas pueden ejecutarse infinitamente largos y nunca terminarán; quiero penalizarlos (dándoles poca puntuación). Simplemente podría poner un cierto límite en el número de pasos, pero no resuelve otro problema.
Algunos de mis sistemas realizan cálculos exponenciales (es decir, incluso para valores pequeños de los pasos de evloution crecen a tamaño gigante) y causan ERROR - Control stack overflow
. Para el observador humano, está claro que nunca terminarán, pero el algoritmo no tiene forma de saber, por lo que corre y se aplasta.
Mi pregunta es: ¿Es posible recuperarse de dicho error? Me gustaría que mi algoritmo siga funcionando después de encontrar este problema y simplemente ajustar la puntuación del cromosoma en consecuencia.
Me parece que la mejor solución sería decirle al programa: "Oye, intenta hacer esto, pero si no lo haces, no te preocupes. Sé cómo manejarlo". Sin embargo, ni siquiera estoy seguro de si eso es posible. Si no, ¿hay alguna alternativa?
¿Podría publicar un resultado de ejecutar su programa con + RTS -s -K100m -H5M -A5M? Creo que el tiempo de ejecución de GHC no genera nada como "ERROR - Desbordamiento de la pila de control". – Tener
¡Oh, estás ejecutando tu código en Abrazos! Por favor, use GHC, es mucho más rápido y generalmente avanzado. – Tener
Inténtalo de nuevo con GHC, a través de la Plataforma Haskell: es un compilador mucho mejor - http://haskell.org/platform –