У меня проблемы с пониманием эволюционных алгоритмов. Я пытался использовать эту технику несколько раз, но всегда сталкивался с одной и той же проблемой: вырождение в искусственный отжиг.
Допустим, мое начальное население с пригодностью в скобках:
A (7), B (9), C (14), D (19)
после спаривания и мутации у меня есть следующие дети:
AB (8,3), AC (12,2), AD (14,1), BC (11), BD (14,7), CD (17)
после устранения самого слабого мы получаем
A, AB, B, AC
в следующем ходу, AB снова спаривается с результатом около 8, выталкивая AC. В следующем повороте AB снова выталкивает B (при условии, что мутация меняет приспособленность в основном в диапазоне> 1).
теперь, после нескольких поворотов пул заполняется изначально наиболее подходящими кандидатами (A, B) и мутациями этих двух (AB). это происходит независимо от размера исходного пула, это занимает немного больше времени. скажем, при начальной популяции 50 это занимает 50 витков, затем все остальные исключаются, превращая всю установку в более сложный моделируемый отжиг. вначале я также спаривал с собой кандидатов, что усугубляло проблему.
Итак, что я скучаю? мои мутации просто слишком малы и они исчезнут, если я увеличу их?
вот проект, который я использую для:
http://stefan.schallerl.com/simuan-grid-grad/
да, код содержит ошибки и интерфейс отстой, но я слишком ленив, чтобы исправить это прямо сейчас - и будьте осторожны, это может заблокировать ваш браузер. Лучше использовать Chrome, даже если подумать, что Firefox на этот раз не медленнее, чем Chrome (вероятно, трассировка для сравнения изображений окупается, ура!). если кому-то интересно, код можно найти здесь .
здесь я просто отбросил идею ev-alg и пошел на имитацию отжига.
пс: я даже не уверен насчет имитации отжига - это похоже на эволюционные алгоритмы, просто с численностью населения один, верно?