Обратите внимание, что я отредактировал этот ответ.
Начиная с пункта 2, я предполагаю, что ваша целевая пригодность равна 1. Ваш алгоритм, вероятно, никогда не будет полностью сходиться (найдите локальные минимумы).Это связано с тем, что ваш диапазон случайных значений (0 ~> 1) не меняется, даже если ваши характеристики соответствуют.
Обратите внимание, что это не означает, что лучшие значения соответствия не создаются;Они будут.Но произойдет резкое снижение скорости, с которой создаются лучшие приспособления из-за того, что вы проверяете пригодность (случайные 0 ~> 1).
Рассмотрим этот пример, где все пригодности оказались высокими:
[0.95555, 0.98888, 0.92345, 0.92366]
Здесь все значения, скорее всего, удовлетворят randomNumToJudge<=fitness
.Это означает, что любые значений одинаково вероятно будут выбраны в качестве родительских.Вы не хотите этого - вы хотите, чтобы значения best имели более высокий шанс выбора.
Ваш алгоритм может быть изменен так, чтобы он сходился правильно, если вы установили для randomNumToJudge
значениедиапазон (средняя пригодность в популяции ~> 1), хотя это все еще не оптимально.
Альтернативный метод
Я рекомендую реализовать классическое колесо рулетки метод.
Метод колеса рулетки назначает каждому человеку вероятность быть выбранным в качестве родителя на основании того, насколько они «подходят».По сути, чем выше приспособленность, тем больше будет занимать срез колеса, и тем выше вероятность того, что случайное число выберет эту позицию на колесе.
Пример кода Java для колеса рулеткивыбор