NEAT алгоритм: как пересечь непересекающиеся и лишние гены?
В настоящее время я реализую алгоритм NEAT, разработанный Кеннетом Стэнли, взяв за основу оригинальную статью.
В разделе, где описан метод кроссовера, одна вещь меня немного смущает.
Итак, вышеприведенный рисунок иллюстрирует метод кроссовера для NEAT. Чтобы решить, от какого родителя унаследован ген, в статье говорится следующее:
Соответствующие гены наследуются случайным образом, тогда как непересекающиеся гены (те, которые не совпадают в середине) и избыточные гены (те, которые не совпадают в конце) наследуются от более подходящего родителя.
Для соответствующих генов (1 - 5) это легко понять. Вы просто случайным образом наследуете от Parent1 или Parent2 (с вероятностью 50% для обоих). Но для непересекающихся (6-8) и избыточных (9-10) генов вы не можете наследовать от более подходящего родителя, потому что эти гены есть только в Parent1 или Parent2.
Например:
Пригодность Parent1 выше, чем у Parent2. Несвязанный ген 6 существует только в Parent2 (конечно, потому что непересекающиеся и избыточные гены встречаются только у одного родителя). Таким образом, вы не можете решить наследовать этот ген от более подходящего родителя. То же самое касается всех других непересекающихся и избыточных генов. Вы можете наследовать только те из родителей, в которых они существуют.
Итак, мой вопрос: возможно, вы наследуете все подходящие гены от более подходящего родителя и просто берете непересекающиеся и лишние гены? Или я что-то здесь неправильно понимаю?
Заранее спасибо.
3 ответа
Это может помочь посмотреть на фактическую реализацию и увидеть, как она обрабатывается. В исходном коде C++ (смотрите строки 2085 и далее) непересекающиеся и лишние гены от непригодного родителя, похоже, просто пропущены.
В вашей реализации вы могли бы наследовать непересекающиеся и избыточные гены от непригодного родителя, но отключить их с вероятностью 1, чтобы впоследствии вы могли делать точечные мутации (переключение отключено на включенное). Тем не менее, это может привести к значительному раздуванию генома, поэтому проверьте и посмотрите, что работает.
Имеет больше смысла брать несовпадающие гены только у "более подходящего родителя". Это создаст сильное потомство в результате кроссовера. Для сопоставления генов примените обычный оператор кроссовера. Для улучшения разнообразия создайте второго потомка путем случайного отбора несовпадающих генов от двух родителей.
Таким образом, первое потомство будет более здоровым, а второе будет сохранять разнообразие. Надеюсь это поможет.
На графике изображен особый случай двух родителей с одинаковой пригодностью, поэтому выбор снова случаен и, следовательно, может привести к изображенному случаю. Я согласен с тем, что без этой дополнительной информации это вводит в заблуждение.