Почему мой генетический алгоритм ведет себя случайным образом? - PullRequest
15 голосов
/ 17 октября 2011

Я пытаюсь разработать оптимальные стратегии для Итерированной дилеммы заключенного с использованием базового генетического алгоритма ( Стохастическая универсальная выборка , 1-точечный кроссовер , каноническийGA).Я реализовал этот алгоритм в Haskell и недавно добавил вывод диаграммы.К сожалению, полученные графики не соответствуют ожидаемому шаблону для этой проблемы, поэтому, похоже, у меня ошибка.

Все графики пригодности, которые я видел для этой проблемы, выглядят примерно так:

My friend's graph, looking normal

Другие примеры можно увидеть в Об эволюции надежных стратегий для дилетмы итеративного заключенного, PJ Darwen и X. Яо (1993) стр. 6-7

Однако мой выводвыглядит так:

My graph looking very strange

Если я установлю частоту мутаций в 1, я получу:

Flipping between two identical values

Возможно, предположив, что моя функция выбораэто не так случайно, как я думал, поскольку график подразумевает однородную совокупность.

Мой код находится в этом git-репозитории , если вы хотите его проверить.

Теперь вопрос: может ли кто-нибудь из вас предположить, что я могу делать неправильно в моей реализации GA, чтобы график выглядел следующим образом?

например, я бы предположил, что вряд ли это будет функция пригодности, которую я используюта же фитнес-функция Fили выведите, что оно максимизируется, поэтому даже если фитнес-функция неправильна, она все равно будет максимизировать эту неправильную функцию (хотя я уверен, что я могу ошибаться, я довольно новичок в генетических алгоритмах)

Я просто хотел бы получить предложения по поводу того, на какие функции смотреть. Я вырываю голову, пытаясь это исправить.

РЕДАКТИРОВАТЬ: После добавления некоторого кода отладки в мою функцию объединения кажется, что он всегдапрошли тех же особей (даже с мутацией, установленной на 1), так что, предположительно, где-то выбор идет не так.

РЕДАКТИРОВАТЬ: Выбор шел неправильно, но это не вызывало всех проблем, только однородность в популяции.

1 Ответ

3 голосов
/ 17 октября 2011

У вас есть функция maybeFlip, которая изменит аллель на его противоположность с заданной вероятностью. Следовательно, когда частота мутаций равна 1, вы будете просто переворачивать все аллели взад-вперед между двумя противоположностями. Это объясняет зигзагообразный паттерн, видимый на вашем графике.

Также swap находится в Data.Tuple:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...