Для того, чтобы освоиться с реализацией Генетического Алгоритма, нам было поручено использовать ГА, чтобы найти решение довольно абстрактной карточной игры со следующими правилами:

«Каждому из вас дается 10 карточек, пронумерованных от 1 до 10. Вас просят разделить карточки на две группы, где сумма чисел на карточках в первой группе как можно ближе к 36, а произведение чисел во второй группе как можно ближе к 360».

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

Затем нужно было определить, как будет работать фитнес-функция. Сначала мы определяем, насколько близка сумма первой группы к 36, а затем насколько близко произведение второй группы к 360. Затем мы возвращаем абсолютное значение суммы этих двух чисел в качестве нашей пригодности, которая вернет 0, как только мы достигнем оптимальной комбинации. карт, но первоначально возвращает значения до 10 000 для неоптимальных комбинаций.

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

После завершения реализации я заметил, что мои хромосомы достигают невероятно близких значений пригодности в однозначном диапазоне, но, похоже, так и не нашел оптимального решения, которое давало бы 36 sum и 360 prod. Это приводит меня к выводу, что такое сочетание невозможно.