Почему мой генетический алгоритм, по-видимому, ведет себя беспорядочно?
Я пытаюсь разработать оптимальные стратегии для Итерированная дилемма заключенных с использованием базового генетического алгоритма (Stochastic Universal Sampling, 1-точечный кроссовер, Canonical GA). Я реализовал этот алгоритм в Haskell и недавно добавил вывод диаграммы. К сожалению, полученные графики не соответствуют ожидаемому шаблону для этой проблемы, поэтому, похоже, у меня есть ошибка.
Все графики пригодности, которые я видел для этой проблемы, выглядят примерно так:
![My friend's graph, looking normal]()
Другие примеры можно увидеть в О развитии устойчивых стратегий дилеммы итерированных заключенных, PJ Darwen и X. Yao (1993) p6-7
Однако мой вывод выглядит следующим образом:
![My graph looking very strange]()
Если я установил скорость мутации в 1, я получаю:
![Flipping between two identical values]()
Возможно, предположим, что моя функция выбора не настолько случайна, как я думал, поскольку график подразумевает однородную совокупность.
Мой код находится в этот репозиторий git, если вы хотите его проверить.
Теперь на вопрос: может ли кто-нибудь из вас предположить, что я мог бы сделать неправильно в моей реализации GA, чтобы график выглядел так?
например. Я бы предположил, что это вряд ли будет функцией фитнеса, поскольку я использую ту же функцию пригодности для вывода, что она максимизируется, даже если функция фитнеса в какой-то мере неверна, она все равно будет максимизировать эту неправильную функцию (хотя я уверен Я могу ошибаться здесь, я довольно новичок в генетических алгоритмах)
Мне просто нравятся предложения, для каких функций смотреть, я разрываю волосы, пытаясь исправить это.
EDIT: добавив некоторый код отладки в мою функцию комбайна, кажется, что он всегда передается одним и тем же людям (даже с мутацией, установленной в 1), поэтому, вероятно, выбор где-то происходит неправильно.
EDIT: выбор шел неправильно, но это не вызывало всех проблем, просто гомогенность в населении.
Ответы
Ответ 1
У вас есть функция maybeFlip
, которая изменит аллель на противоположную с данной вероятностью. Следовательно, когда скорость мутации равна 1, вы просто продолжаете листать все аллели между двумя противоположностями. Это объясняет шаблон зигзага, который отображается на вашем графике.
Кроме того, swap
находится в Data.Tuple
:)