Почему мой генетический алгоритм, по-видимому, ведет себя беспорядочно?

Я пытаюсь разработать оптимальные стратегии для Итерированная дилемма заключенных с использованием базового генетического алгоритма (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:)