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

Данный проект был реализован мною в рамках курсовой работы 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.