Пару месяцев назад я сделал генетический алгоритм, но у меня получилось очень недолго решать любые проблемы. Моей первоначальной целью было использовать генетический алгоритм в игровых приложениях.
Сейчас я воссоздаю все это целиком и пытаюсь взглянуть с другой стороны.
Теперь, когда я собираюсь определить шаги, на которых будет установлено следующее поколение.
Моя последняя идея была:
Возьмите гены с самым высоким рейтингом у текущего поколения и продублируйте их в следующем (количество определяется элитарностью)
Возьмите два случайных гена и скрестите их (шансы быть выбранными коррелируют с рангом гена), я применил несколько методов скрещивания (одноточечный, двухточечный, трех родительский, средний, равномерный ...)
Наполните новое поколение генами описанным выше методом.
Примените некоторую мутацию к генам (шанс быть выбранным определяется скоростью мутации), и это изменит только часть ДНК (исключены гены с самым высоким рейтингом)
Это оказалось очень неэффективным (что я не знаю почему), а также очень требовательным к вычислениям, поскольку процесс кроссовера проходил по всем генам несколько раз.
Теперь думаю о новом подходе.
В основном я стремлюсь сохранить гены и удалить «плохие», а также заполнить генофонд скрещенными генами.
В генофонде с 1.000 особей я бы:
Отбросьте 500 наименьших рангов.
Дублируйте рейтинг лучших (в 10% элитарности это 100)
Сгенерируйте 400 новых генов с помощью кроссовера.
Применить мутацию
Я воспринимал понятие «поколения» слишком буквально и заставлял их всех умирать (кроме самых рейтинговых), теперь я позволю им всем жить, ожидая плохих. И при необходимости заселяйте заново.
Я что-нибудь упускаю? Будет ли этот новый метод лучше?