Поэтому мне была назначена проблема написания 5x5x5 tic-tac-toe-плеера с использованием генетического алгоритма. Мой подход состоял в том, чтобы начать с 3x3, получить эту работу, а затем расширить до 5x5, а затем до 5x5x5.
Как это работает:
-
Имитировать целую кучу игр, и в каждом повороте каждой игры искать в соответствующей таблице (таблица X или таблица O, реализованная в виде С++ stdlib-карт) для ответа. Если платы там не было, добавьте плату к столу. В противном случае сделайте произвольный ответ.
-
После того, как у меня есть полные таблицы, я инициализирую группу игроков (каждая с копией таблицы доски, инициализированная случайными ответами) и позволяю им играть друг против друга.
- Используя свои выигрыши/потери для оценки работоспособности, я сохраняю определенный процент от лучших, и они продвигаются дальше. Прополощите и повторите для X поколений, и появится оптимальный игрок.
Для 3х3, дисконтирующих плат, которые были отражениями/вращениями других плат, и доски, на которых перемещение либо "выигрывает", либо "блокирует победу", общее количество плат, с которыми я столкнулся, было либо 53, либо 38, в зависимости от того, будете ли вы идти первым или вторым. Фантастика! Оптимальный игрок был создан менее чем через час. Очень круто!
Используя ту же стратегию для 5x5, я знал, что размер таблицы будет увеличиваться, но не понял, что это будет так резко увеличиваться. Даже при дисконтировании поворотов/отражений и обязательных ходов моя таблица составляет ~ 3,6 млн. Записей, без конца.
Хорошо, так что я не собираюсь работать, мне нужен новый план. Что делать, если я не перечисляю все платы, а только некоторые платы. Ну, похоже, что это тоже не сработает, потому что, если у каждого игрока есть только небольшая часть возможных плат, которые они могут увидеть, тогда они собираются совершать много случайных ходов, явно управляя в обратном направлении оптимальности.
Каков реалистичный способ этого? Я собираюсь застрять с использованием функций платы? Цель состоит в том, чтобы жестко закодировать как можно меньше функциональности игры.
Я занимаюсь исследованиями, но все, что я читаю, приводит к минимуму/максимальному сокращению A-B как единственного жизнеспособного варианта. Я, конечно, могу так поступить, но GA действительно классный, мой нынешний метод немного превосходит реальность здесь.
Проблема EDIT была решена в значительной степени:
Используя функцию подобия, которая сочетает в себе отдачу от открытых пространств, возможные условия выигрыша и несколько других мер привели таблицу к вполне управляемым 2500 возможностям, которые std::map
обрабатывает за долю секунды.