Личный проектPython, python-chess

Dumbfish — шахматный движок на Python

UCI-совместимый шахматный движок с однопоточным поиском и трёхфазной ручной оценкой позиции.

Dumbfish — шахматный движок на Python

Данный проект был реализован мною в рамках курсовой работы 3 курса направления «Программная инженерия» факультета КНиИТ СГУ им. Чернышевского на тему «Разработка шахматного движка Dumbfish на основе оценочной функции с использованием позиционных признаков и трёхфазной интерполяцией»

UCI-совместимый шахматный движок на Python — несмотря на название, играет не так уж и глупо: на глубине по умолчанию показывает около 1300 Эло (около 1800 на Lichess). Очевидно, что покажет лучшие результаты на большей глубине.

Задача

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

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

Однако обратите внимание, что ни в одном из решений выше не учитывались особенности дебюта. Например, в миттельшпиле фигуры следует вести в бой (а-ля «в глубину»), тогда как в дебюте в целом следует отдать предпочтение развитию фигур и рокировке (а-ля «в ширину»).

Собственно, Dumbfish — это первый существующий прототип шахматного движка с трёхфазной интерполяцией, различающий дебютные и миттельшпильные оценки. Использование такого подхода позволило более точно оценивать позиции, находящиеся между крайними значениями признаков. Это позволило движку намного точнее избирать дебютные планы, в сравнении с аналогичными движками (например, Sunfish).

Архитектура

Dumbfish реализует UCI-совместимый шахматный движок на Python. В движке включены:

  • базовый UCI-протокол (без управления временем и ponder-hit);
  • таблица транспозиций с Zobrist-хешированием;
  • однопоточный поиск с альфа-бета отсечением, итеративным углублением и рядом эвристических оптимизаций;
  • трёхфазная ручная оценка на основе позиционных признаков и таблиц «фигура-клетка».

Структура проекта выглядит так:

  • main.pyТочка входа
  • uci.pyОбработчик протокола UCI
  • game.pyУправление игровым состоянием
  • search.pyИтеративный поиск
  • score.pyОценка позиции (HCE)
  • tt.pyТранспозиционная таблица с Zobrist-хешированием
  • pst.pyТаблицы PST и данные для оценки
  • config.pyКонфигурация движка

Запуск

git clone https://github.com/tolstovrob/dumbfish
cd dumbfish
pip install -r requirements.txt
python main.py

Запустится UCI-цикл — движок можно подключить к любому UCI-совместимому интерфейсу (Arena, Cute Chess, и т.д.).

Интеграция с Lichess

Для игры на Lichess нужно прописать токен бота и путь к исполняемому файлу в config.yml.