В настоящее время я пишу генетический алгоритм на Хаскеле, в котором мои хромосомы представляют собой довольно сложные структуры, представляющие исполняемые системы.
Чтобы оценить пригодность моих хромосом, я должен запустить функцию evolution
, которая выполняет один вычислительный цикл данной системы. Пригодность тогда вычисляется, просто посчитав, сколько раз evolution
может быть применено, прежде чем не произойдет изменений в системе (в этом случае система завершается).
Проблема теперь заключается в следующем: некоторые системы могут работать бесконечно долго и никогда не прекратят работу - я хочу наказать их (давая им мало очков). Я мог бы просто установить определенное ограничение на количество шагов, но это не решает другую проблему.
Некоторые из моих систем выполняют экспоненциальные вычисления (т. Е. Даже для небольших значений шагов эволюции они достигают гигантских размеров), и они вызывают ERROR - Control stack overflow
. Для наблюдателя-человека очевидно, что они никогда не завершатся, но алгоритм не может знать, поэтому он работает и разрушается.
У меня такой вопрос: можно ли вылечиться от такой ошибки? Я бы хотел, чтобы мой алгоритм продолжал работать после возникновения этой проблемы и просто соответствующим образом скорректировал счет хромосом.
Мне кажется, что лучшим решением было бы сказать программе: «Эй, попробуй, но если не получится, не волнуйся. Я знаю, как с этим справиться». Однако я даже не уверен, возможно ли это. Если нет - есть ли альтернативы?