Восстановление после переполнения стека или исчерпания кучи в программе на Haskell

В настоящее время я пишу генетический алгоритм на Haskell, в котором мои хромосомы представляют собой довольно сложные структуры, представляющие исполняемые системы.

Для того, чтобы я мог оценить приспособленность моих хромосом. мои хромосомы. Я должен запустить функцию эволюции , которая выполняет один вычислительный цикл данной системы. Пригодность затем вычисляется просто путем подсчета того, сколько раз можно применить эволюцию до того, как в системе не произойдет никаких изменений (в этом случае система прекратит работу).

Теперь проблема заключается в следующем: некоторые системы могут работать бесконечно долго и никогда не прекратят работу - я хочу наказать их (выставив им небольшую оценку). Я мог бы просто установить определенное ограничение на количество шагов, но это не решит другой проблемы.

Некоторые из моих систем выполняют экспоненциальные вычисления (т.е. даже для небольших значений шагов эволюции они вырастают до гигантских размеров), и они вызывают ОШИБКА - переполнение стека управления . Для человека-наблюдателя ясно, что они никогда не завершатся, но алгоритм не может знать, поэтому он запускается и вылетает.

Мой вопрос: можно ли исправить такую ​​ошибку? Я бы стал как мой алгоритм, чтобы продолжить работу после столкновения с этой проблемой и просто соответствующим образом скорректировать оценку хромосомы.

Мне кажется, что лучшим решением было бы сказать программе: «Эй, попробуй сделать это, но если у тебя не получится, не волнуйся. Я знаю, как с этим справиться». Однако я даже не уверен, возможно ли это. Если нет - есть ли альтернативы?

5
задан Don Stewart 19 April 2011 в 18:30
поделиться