Оценка турнира в генетическом алгоритме

В настоящее время каждая генетическая библиотека С# (A.Forge, Genetic Algorithm Framework, GeneticSharp), по-видимому, оценивает только один Chromosome, а затем использует один из различных методов выбора для создания нового поколения.

Поскольку моя проблема включает в себя два ИИ для игры друг против друга, немного сложнее оценить их пригодность в одиночку. Хотя игра достаточно проста, чтобы создать некоторые поверхностные препятствия (AI не взаимодействует напрямую, но препятствия отправляются в игру друг друга), что позволило бы мне получить абстрактную формулу, но это не было бы "реальной" сделкой.

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

Ответ 1

Каждая библиотека генетического алгоритма должна иметь какой-то способ определить функцию фитнеса, которая действительно то, что вы ищете. AForge.NET предоставляет интерфейс IFitnessFunction. GeneticSharp предоставляет интерфейс IFitness. Да, вам нужно будет самостоятельно закодировать функцию фитнеса - ту часть, которая уникальна для вашей проблемной области. Вы можете сделать это как можно проще или сложнее.

После того, как каждая хромосома проходит функцию фитнеса и получает оценку, система использует любые критерии выбора, которые вам нравятся (турнир, колесо рулетки и т.д.), чтобы выбрать, какие хромосомы переходят к следующему поколению через кроссовер и/или мутацию.

Итак, вместо процесса, протекающего следующим образом:

  • Сопоставьте хромосомы в текущем поколении
  • Каждая пара хромосом играет круглую
  • Победители создают следующее поколение

Генетические алгоритмы работают следующим образом:

  • Каждая хромосома играет раунд и получает оценку
  • Алгоритм выбора использует этот счет, чтобы выбрать победителей.
  • Победители создают следующее поколение

В сущности, каждая хромосома уже конкурирует с любой другой хромосомой, всего на один шаг более абстрактной, чем вы, и я бы сыграл в игру.

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

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