Генетический алгоритм часовщика, сочетающий в себе условия завершения

Использование стагнации (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 в качестве аргумента, чтобы вы могли принимать решения на основе этого в конце каждого поколения. Вам просто нужно уметь определять "гнилое население" с точки зрения среднего значения и / или наилучшей пригодности и количества поколений на данный момент.

Другие вопросы по тегам