Генетический алгоритм часовщика, сочетающий в себе условия завершения
Использование стагнации (numGenerations, true) для прекращения эволюции в часовщике.
Я хотел бы, чтобы numGenerations зависели от того, насколько хорошо продвигается эволюция. Если у меня гнилая популяция (низкий уровень физической подготовки), я бы хотел выручить пораньше. Если население работает хорошо, я бы хотел уделить ему больше времени.
Как бы я это сделал?
Я прочитал руководство пользователя, поработал с примерами на http://watchmaker.uncommons.org/, посмотрел на API и поискал в Интернете. Не видел этой темы, адресованной специально. Я новичок в Java и генетических алгоритмах, так что я мог легко что-то пропустить.
2 ответа
Перечитывая API, я обнаружил, что в engine.evolvePopulation() можно предоставить несколько TerminationConditions. Это позволило мне написать рекурсивную функцию, которая продолжает работать до тех пор, пока физическая форма продолжает улучшаться.
process (Parameters params) {
result = engine.evolvePopulation(params.size, 0,
new Stagnation(params.stagnation, true),
new TargetFitness(params.target, true));
if (result.get(0).getFitness() >= params.target)
process(params.increase());
return;
}
В моем случае цель увеличивается на фиксированную величину каждый раз. Размер и застой увеличиваются в зависимости от куба цели. Таким образом, чем лучше становится конкретное население, тем больше времени вкладывается в него. Не уверен, что это лучший подход, но для этой проблемы он получил ответ, который я искал.
Кстати, моя программа не похожа на ту, что я вставил выше. Я довольно паршивый программист, и мой код намного ужаснее этого. Просто пытаюсь показать суть идеи.
Stagnation
условие завершения прерывает эволюцию только в том случае, если лучший показатель пригодности в популяции не улучшается в течение определенного количества последовательных поколений. Он не отключается после фиксированного количества поколений с самого начала (для этого вы бы использовали GenerationCount
условие), оно начинает действовать только тогда, когда эволюция перестает прогрессировать. Таким образом, если ваша популяция работает хорошо (под этим я понимаю, вы имеете в виду, что приспособленность продолжает улучшаться), состояние стагнации вряд ли будет вызвано.
Если вы хотите что-то другое, вы можете написать свой собственный TerminationCondition
, Это всего лишь один метод, который принимает PopulationData
в качестве аргумента, чтобы вы могли принимать решения на основе этого в конце каждого поколения. Вам просто нужно уметь определять "гнилое население" с точки зрения среднего значения и / или наилучшей пригодности и количества поколений на данный момент.