Я бы подошел к этому традиционным способом обработки начальной книги в шахматных движках:
- Генерация всех возможных ходов
- Для каждого хода:
- Сделатьэтот ход
- Посмотрите получившуюся позицию вверх в вашей базе данных
- Отмените ход
- Сделайте ход с самым высоким счетом в вашей базе данных
Поиск хода
Шахматные движки обычно вычисляют хеш-функцию текущего игрового состояния с помощью Зобристического хеширования , который является простым способом построения хорошей хеш-функциидля игровых состояний.
Большим преимуществом этого подхода является то, что он заботится о транспозициях , то есть, если одно и то же состояние может быть достигнуто через альтернативные пути, вам не нужно беспокоитьсяоб этих альтернативных путях, только о самих игровых состояниях.
Как шахматные движки делают это
Большинство шахматных движков используют статические вводные книги, которые составлены из записанных игр и, следовательно, используют сиmple двоичный файл, который отображает эти хэши на счет;например,
struct book_entry {
uint64_t hash
uint32_t score
}
Записи затем сортируются по хэшу, и благодаря кэшированию операционной системы простой двоичный поиск по файлу очень быстро найдет нужные записи.
Обновление баллов
Однако, если вы хотите, чтобы движок постоянно учился, вам понадобится более сложная структура данных;на этом этапе это обычно не стоит делать самостоятельно, и вы должны использовать доступную библиотеку.Я бы, вероятно, использовал LevelDB , но все, что позволяет хранить пары ключ-значение, подходит (Redis, SQLite, GDBM и т. Д.)
Обучение счетам
КакТочное обновление результатов зависит от вашей игры.В играх с большим количеством доступных данных работает простой подход, такой как просто сохранение процента игр, выигранных после хода, результатом которого стала позиция;если у вас меньше данных, вы можете сохранить результат поиска по игровому дереву из рассматриваемой позиции как счет.Методы машинного обучения, такие как Q learning , также возможны, хотя я не знаю программы, которая фактически делает это на практике.