Sunfish - это простой, но сильный шахматный двигатель, написанный на Python. Благодаря его простому интерфейсу UCI и удалением комментариев и пробелов, он занимает всего 131 строки кода! ( build/clean.sh sunfish.py | wc -l ). И все же он играет в рейтингах выше 2000 года в лихессе.
Поскольку Sunfish небольшая и стремится быть простым, код обеспечивает отличную платформу для экспериментов. Люди использовали его для тестирования алгоритмов параллельных поисков, экспериментов с функциями оценки и разработки шахматных программ глубокого обучения. Поиграйте сегодня и посмотрите, что вы можете сделать!
Самый простой способ запуска SUFISH - это «причудливый» интерфейс терминала:
$ tools/fancy.py -cmd ./sunfish.py
Играя против Sunfish 2023.
Вы хотите быть белым или черным? черный
1 ♖ ♘ ♔ ♕ ♗ ♘ ♖ ♖ ♖ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♚ ♛ ♝ ♞ ♜ ♜ ♜ ♜
Hgfedcba
Оценка: 23, узлы: 11752, NPS: 13812, время: 0,9
Мой ход: D4
1 ♖ ♘ ♔ ♕ ♗ ♘ ♖ ♖ ♖ ♖ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4 ♙
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♚ ♛ ♝ ♞ ♜ ♜ ♜ ♜
Hgfedcba
Ваш ход (например, C6 или G8H6): NF6
Интерфейс терминала использует алгебраическую нотацию для ввода перемещения. Вот краткий обзор того, как это работает: С точки зрения Уайта столбцы помечены ах слева направо, а ряды помечены 1-8 снизу до вершины. Каждый квадрат назван соответствующей буквой, чем число (например, A2, C3, H8). Движение сообщается первой буквой движущейся части, за которой следует квадрат назначения (P для пешки перемещается, и N используется для рыцарей). Если более чем одна из тех же продуктов может перейти к квадрату, укажите файл движущегося кусочка. Если это все еще неоднозначно, укажите столбец.
Чтобы использовать интерфейс терминала, используемые нотации должны быть определенного формата, в противном случае введенный ход не будет чтением правильно. «X» иногда используется для обозначения захвата, но должен быть опущен (например, BD4, а не BXD4). Не используйте «+» для обозначения проверки (например, BF7 не BF7+). Не используйте «=» для обозначения продвижения пешки (например, e8q, а не e8 = q), чтобы обозначить захват пешки. Требуемый файл запускается, за которым следует окончательный квадрат (например, GF4 не GF). Касл должен быть обозначен с нижним регистом (например, оо и ооо). Указание файла или Columm должно быть после указания произведения (например, rae1 не at1). При примечании к En Passant квадрат назначения должен быть квадратом, на котором заканчивается пешка, а не зафиксированная пешка, которая была захвачена (например, ef6 не ef5).
Интерфейс терминала также поддерживает явную нотацию. Здесь указан исходный квадрат, за которым следует квадрат назначения (например, E2E4).
Обратите внимание, что это требует пакета Python-chess. Для истинного минималистского опыта, сначала мы можем «упаковать» Sunfish в сжатый исполняемый файл (менее 3 КБ!) И запустить ее напрямую:
$ build/pack.sh sunfish.py packed.sh Общая длина: 2953 $ ./packed.sh Go Wtime 1000 Btime 1000 WINC 1000 BINC 1000 Информация глубина 1 Оценка CP 0 PV D2D4 BestMove D2D4
(См. Спецификацию UCI для полного набора команд.)
Также возможно запустить Sunfish с графическим интерфейсом, таким как Pychess или Arena.
Наконец, теперь вы можете сыграть Sunfish на лихессе или играть против порта ржавчины Recursing, также на лихессе, что примерно на 100 ELO сильнее.
Существует экспериментальная версия с использованием эффективно обновляемой нейронной сети. Вы можете проверить его, используя фейсфейс модного терминала, как указано выше:
$ tools/fancy.py -cmd "./sunfish_nnue.py nnue/models/tanh.pickle" ...
В отличие от крупного NNUE, скажем, Stockfish, эта сеть составляет всего 1207 байтов! Это гарантирует, что Sunfish nnue все еще может быть упакована в менее чем 4 КБ. Используя NNUE, Sunfish будет играть лучше позиционно, но хуже, так как реализация все еще недостаточно быстро.
Sunfish поддерживает все шахматные правила, за исключением правила привлечения 50 движений.
Есть много способов, которыми вы можете попытаться сделать Sunfish сильнее. Сначала вы можете перейти от представления платы на изменяемый массив и добавить быстрый способ перечисления деталей. Затем вы можете реализовать выделенную генерацию захвата, проверить обнаружение и проверить уклонения. Вы также можете переместить все на битборды, реализовать части кода в C или экспериментировать с параллельным поиском!
Другой способ сделать Sunfish сильнее - дать ему больше знаний о шахматах. Текущая функция оценки использует только кусочки квадратных таблиц - она даже не различает в середине игры и эндшени. Вы также можете экспериментировать с большей обрезкой - в настоящее время выполняется только нулевое движение - и расширения - в настоящее время не используется. Наконец, Sunfish может извлечь выгоду из более продвинутого заказа хода, MVV/LVA и, возможно, увидеть, возможно,?
Легкий способ получить сильную солнечную рыбу-это бежать с Pypy Just In Time Intepreter. В частности, версия Pypy Pyphon2.7 дает увеличение ELO 250 по сравнению с интендерами CPYTHON (2 или 3) при быстром контроле времени:
Rank Name Elo +/- Games Score Draws
1 pypy2.7 (7.1) 166 38 300 72.2% 19.7%
2 pypy3.6 (7.1) 47 35 300 56.7% 21.3%
3 python3.7 -97 36 300 36.3% 20.7%
4 python2.7 -109 35 300 34.8% 24.3%
Название Sunfish на самом деле относится к пигмею Sunfish, которая является одним из немногих рыб, чтобы начать с букв «py». Использование рыбы находится в духе великих двигателей, таких как Stockfish, Zappa и Rybka.
С точки зрения наследия, Sunfish заимствует гораздо больше из Micro-Max от Geert Muller и Pychess.
GNU GPL V3