Тесты для движков шахматных: Компьютерные шахматы Позиции для тестирования

Содержание

20 лучших шахматных движков 2021 года на основе их рейтинга

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

Сегодня есть много рейтинг листов, которые измеряют относительную силу шахматных движков по различным критериям. Мы решили составить ТОП-20 движков на основе их рейтинга, используя два наиболее известных рейтинговых списка — CCRL (Computer Chess Rating Lists) и CEGT (Chess Engines Grand Tournament)

20. Andscacs

CCRL Rating: 3264
CEGT Rating: не участвует

Движок был впервые опубликован в 2014 г. Andscacs вскоре превратился в один из лучших шахматных движков в мире. Он использует Magic Bitboard для ускорения вычислений атаки. Он применяет поиск основных вариантов с таблицей транспонирования внутри итеративной структуры.

Andscacs имеет статическую оценку размена и многопоточный параллельный поиск. А также он использует хэш-ход в поиске в состоянии покоя.

Чтобы сделать механизм более мощным и эффективным (или минимизировать стандартное отклонение статической оценки), исследователи оптимизировали 200 функций оценки, использовав 750 000 позиций.

19. Schooner

CCRL Rating: 3266
CEGT Rating: 3172

Schooner использует альфа-бета-поиск, сокращение поздних ходов (LMR), основное окно поиска (PVS) и одиночную запись хеша. Он поддерживает подмножество Универсального Шахматного Интерфейса, чтобы автоматически играть в игры, не тратя много ресурсов.

Его производительность значительно улучшилась за последние годы: за эти улучшения отвечает более простая оценка, основанная на Xiphos, поэтапная генерация ходов и множество тестов и настроек.

18. Fizbo

CCRL Rating: 3273
CEGT Rating: Не участвует

Fizbo – шахматный движок, созданный Американским программистом Youri Matiounine. Впервые программа была выпущена в мае 2014 года. Начиная с 1.2, он выполняет параллельный поиск, основанный на версии расширенного алгоритма разделения PV.

Последняя версия 2.0, которая выпущена в 21 декабря 2017 года.

17. Deep Shredder

CCRL Rating: 3279
CEGT Rating: 3147

Shredder это коммерческий шахматный движок, а это значит, что его может купить и использовать любой. Движок и графический интерфейс были созданы Штефаном Майер-Каленом в Германии в 1993 году. Это один из старейших и успешных шахматных движков на рынке. Данный движок выиграл подряд 19 титулов Чемпионатов Мира по Компьютерным Шахматам.

Это один из немногих движков, доступных практически на всех основных платформах. Его можно приобрести и использовать на Mac OS, Windows, Linux, Android, iOS и даже на Amazon Kindle.

16. Fritz

CCRL Rating: 3280
CEGT Rating: 3157

Фриц коммерческая шахматная программа, разработанная Франсом Моршем. В 1991 году ChessBase начала работать с Моршем и добавила Fritz в свою программу базы данных. В 1995 году Фриц выиграл Чемпионат Мира по компьютерным шахматам, победив раннюю версию Deep-Blue. В 2000 году Pocket Fritz (предназначенный для портативных устройств) выиграл Чемпионат мира по скоростным шахматам на компьютерах.

Fritz доступен для Windows и других платформах. В 2009 году Fritz был выпущен на Nintendo Wii, Nintendo DS и Sony PlayStation 3.

В 2010 году Fritz вошёл в десятку лучших шахматных движков согласно рейтинговому списку Шведской Ассоциации Шахматных Компьютеров (SSDF) с рейтингом 3110. В 2010 году он также входил в десятку лучших в Рейтинге Компьютерных Шахмат (CCRL) с рейтингом 3088.

Fritz постоянно обновляется с 1991 года и в настоящее время уже выпущен Fritz 17. У него было несколько реинкарнаций, включая ранее упомянутые Pocket Fritz, Deep Fritz и Fat Fritz (который доступен с Fritz 17).

15. Laser

CCRL Rating: 3291
CEGT Rating: 3156

Laser — UCI шахматный движок с открытым исходным кодом от Джеффри Ана и Майкла Ана, написанный на C ++ 11, впервые выпущенный летом 2015 года по лицензии GNU General Public License.

Последняя версия Laser 1.7, выпущенный в феврале 2019 года.

14. RubiChess

CCRL Rating: 3295
CEGT Rating: 3209

RubiChess — UCI шахматный движок с открытым исходным кодом от Андреаса Маттиса, написанный на C ++, под лицензией GPL v3.0.

RubiChess стартовал в 2017 году как движок 0x88 и вскоре превратился в bitboard движок, сначала с использованием rotated bitboards, а затем и magic bitboards (примерно на 24% быстрее) для определения атак скользящих фигур.

В сентябре 2020 года Андреас Маттис объявил о RubiChess NNUE.

13. Booot

CCRL Rating: 3301 CEGT Rating: 3207

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

Движок применяет PVS со всеми базовыми усовершенствованиями поиска, такими как сокращение поздних ходов, отсечение нулевого хода и внутреннее итеративное углубление. Последняя версия поддерживает многопроцессорную архитектуру и имеет несколько вариантов сборки для 32 и 64 бит.

12. RofChade

CCRL Rating: 3314
CEGT Rating: 3200

RofChade – UCI шахматный движок от Рональда Фридериха, написанный на C++. Хотя дебют этого движка за доской состоялся на PT 53 весной 2018 года, RofChade впервые был выпущен в августе 2018 года.

Однако название движка было придумано в 90-х годах, когда автор объединил свои инициалы и Rochade — Голландский термин для рокировки.

Версия RofChade 1.0 уже играла в диапазоне 2700+ ЭЛО.

В декабре 2018 года вышла версия RofChade 2.0, в которой была улучшена оценка с учётом пешечной структуры и безопасности короля.

11. Fire

CCRL Rating: 3324
CEGT Rating: 3224

Fire — это очень мощный, современный, бесплатный шахматный UCI движок, разработанный для современных систем Windows и современных процессоров.

Fire (ранее называвшийся Firebird) находится в непрерывной разработке с января 2010 года.

Fire 7.1 последняя публичный релиз Fire. Разработка официально завершена, по следующим причинам:

  • Тестирование дополнительных изменений кода — чрезвычайно трудоёмки и утомительный.
  • Становится всё труднее (почти невозможно) найти улучшения.
  • В лучших движках теперь преобладают технологии Нейронных Сетей, которые значительно усложняют движки.

10. Xiphos

CCRL Rating: 3340
CEGT Rating: 3215

Xiphos — UCI шахматный движок с открытым исходным кодом от Милоша Татаревича, написанный на C, под лицензией GNU General Public License v3.0, впервые выпущенный 28 февраля 2018 г.

Xiphos использует битовые доски с отображением BERLEF (a1 = 56, a8 = 63, h2 = 0, h8 = 7). Атаки скользящих фигур определяются либо Magic bitboards, либо, если они скомпилированы для процессоров x86-64 с поддержкой BMI2, битовыми платами PEXT.

Исполняемые файлы Xiphos доступны для запуска под Linux, Mac OS и Windows.

9. Igel

CCRL Rating: 3361
CEGT Rating: 3235

Igel — UCI шахматный движок с открытым исходным кодом от Владимира Щербины под лицензией GPL, изначально основанный на GreKo 2018.01 и далее независимая разработка с 2018 года.

В августе 2020 года Igel переключился на NNUE в качестве основной функции оценки с использованием сети Night Nurse Дитриха Каппе.

В октябре 2020 Igel переключился на собственную сеть, обученную на Igel 2.6.0

8. Slow Chess Blitz

CCRL Rating: 3362
CEGT Rating: 3267

Slow Chess Blitz — шахматный движок, совместимый с WinBoard и UCI, от Джонатана Кройцера, который также имеет собственный графический интерфейс. Более старые версии, Slow Chess 2.82a и Slow Chess 2.96, не относящиеся к более позднему Slow Chess Blitz, имеют открытый исходный код.

Slow Chess написана на C ++ с небольшим вставками на ассемблере и впервые была выпущена в июле 2003 года.

Slow Chess играла в ACCA 2008 под управлением Сваминатана Натараджана. После 14-летнего перерыва в сентябре 2019 года была выпущена новая версия Slow Chess Blitz. Сейчас данный движок регулярно обновляется.

7. Nemorino

CCRL Rating: 3384
CEGT Rating: 3309

Nemorino — UCI шахматный движок с открытым исходным кодом от Кристиана Гюнтера, также поддерживающий протокол обмена данными Chess Engine, написанный на C ++ и впервые выпущенный в сентябре 2016 года по лицензии GPLv3.

Изображение на доске и структура ходов Nemorino взяты из Stockfish. Nemorino поддерживает эндшпильные базы Syzygy, параллельный поиск, а также оценку позиций с помощью NNUE. Данный движок может играть в Фишерские шахматы Chess960.

6. Ethereal

CCRL Rating: 3398
CEGT Rating: 3313

Ethereal — шахматный движок с открытым исходным кодом на UCI, написанный Эндрю Грантом на языке C, под лицензией GNU GPL и впервые официально выпущенный в июне 2016 года.

На Ethereal сильно повлияли Crafty, Stockfish, TSCP, MadChess и Fruit.

9 октября 2020 года Эндрю Грант объявил о своём выходе из разработки Ethereal, выпустив последние версии Ethereal V12.75 и Ethereal 12.75 SF-NNUE.

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

5. Houdini

CCRL Rating: 3401
CEGT Rating: 3337

Houdini известен своим позиционным стилем и способностью защищаться в сложных позициях и умениями уходить от ничьи.

На данный момент он выиграл 3 сезона чемпионата Top Chess Engine Championship.

Новая версия Houdini представлена в двух вариантах — Standard и Pro. В то время как предыдущая версия поддерживала только до 8 ядер процессора, версия Pro поддерживает до 128 ядер и 128 ГБ ОЗУ. Он знает NUMA и может использовать эндшпильные таблицы Налимова.

4. Leela Chess Zero

CCRL Rating: нет
CEGT Rating: 3472

Leela Chess Zero (также известная как Lc0, LCZero и Leela) — это шахматный движок на основе нейронной сети (NN) с открытым исходным кодом. О проекте Lc0 было объявлено в начале 2018 года, и Гэри Линскотт (разработчик Stockfish) возглавил его разработку. Поскольку данный движок бесплатный и имеет открытый исходный код, его можно запускать на многих платформах, включая Windows, Mac, Linux, Android и Ubuntu. Lc0 — самый мощный движок NN, доступный для публики.

Чтобы реализовать весь потенциал данного движка, вам необходимо иметь на компьютере графический процессор с поддержкой CUDA.

3. Komodo Dragon

CCRL Rating: 3488
CEGT Rating: 3492

Komodo — один из самых мощных и успешных на рынке шахматных движков с универсальным шахматным интерфейсом (UCI). Первоначально он был разработан Доном Дэйли в 2010 году и был развит Марком Лефлером в 2013 году. GM Ларри Кауфман также много лет поддерживает и улучшает движок.

В отличие от обычных движков прямого перебора, Komodo в первую очередь оценивает саму позицию, что придаёт ему позиционный стиль игры. По заявлению разработчика Дона Дэйли у Komodo лучшая оценочная функция среди конкурентов. А это способствует долгосрочному успеху Komodo и внушительному количеству титулов Чемпионатов мира.

В 2020 году было выпущено дополнение к этому движку Dragon на основе нейронных сетей.

2. Fat Fritz 2

CCRL Rating: 3520
CEGT Rating: Пока нет

Fat Fritz 2 обучается и разрабатывается с использованием технологии NNUE, работающей внутри двоичного кода Stockfish с открытым исходным кодом, но с совершенно новой и другой нейронной сетью, которая значительно отличается от Stockfish по нескольким ключевым моментам:

  • Оценки и позиции используются из исходной нейронной сети Fat Fritz.
  • Нейронная сеть в Fat Fritz 2 вдвое больше, чем Stockfish 12, и использует 512 нейронов вместо 256, что даёт возможность удвоить знания и понимание.

1. Stockfish 12.0 NNUE

CCRL Rating: 3566
CEGT Rating: 3517

Stockfish это самый мощный шахматный движок, доступный публике, и он существует уже довольно давно. Это бесплатный движок с открытым исходным кодом, который в настоящее время активно развивается.

Stockfish был основан на шахматном движке, созданном Тордом Ромстадом в 2004 году, который был развит Марко Костальба в 2008 году. Джуна Кииски и Гэри Линскотт также считаются основателями.

В сентябре 2020 г. выпущен Stockfish 12, и было объявлено, что Stockfish поглотил проект Stockfish + NNUE (NNUE означает эффективно обновляемая нейронная сеть). Теперь грубый перебор Stockfish улучшен за счёт оценочных возможностей нейронной сети — потрясающая комбинация!

Примечание: поскольку рейтинги CCRL и CEGT постоянно меняются, то данный топ может меняться время от времени.

Шахматные движки стр. 2

Шахматный компьютер Deep Blue

Шахматный компьютер Deep Blue Александр Шека

Дата публикации: 19/01/2021 г.

Люди веками были сильнейшими шахматными существами на планете. Даже в 1980-е казалось смешным, что компьютер когда-либо может победить сильнейших игроков-людей. Затем в 1997 году случилось это — компьютер победил чемпиона мира. Какой компьютер, спросите вы? Deep Blue.

  • Просмотров: 1899
  • Нет комментариев

Шахматный движок Houdini

Шахматный движок Houdini Александр Шека

Дата публикации: 15/01/2021 г.

В наши дни существует много сильных шахматных движков, но Houdini был одним из самых сильных движков за последнее десятилетие. Некоторое время он был ведущим шахматистом на планете, побеждая своих современников, таких как Rybka, Stockfish, и Komodo. Давайте узнаем больше об этом движке.

  • Просмотров: 1813
  • Нет комментариев

Шахматный движок HIARCS

Шахматный движок HIARCS Александр Шека

Дата публикации: 14/01/2021 г.

Согласно рейтингу Компьютерных шахмат на январь 2021 года, существует 60 движков с ЭЛО 3000+. Движок, который существует дольше всех — HIARCS.

  • Просмотров: 897
  • Нет комментариев

Шахматный Движок Fat Fritz

Шахматный Движок Fat Fritz Александр Шека

Дата публикации: 12/01/2021 г.

Наверняка вы знаете АльфаЗерро, который произвёл фурор в компьютерных шахматах. Этот шахматный движок применил совершенно другой подход, чем классические программы. Уже на протяжении многих лет сформировались правила и принципы при разработке программ, а вот АльфаЗерро смог поставить их под сомнение.

  • Просмотров: 641
  • Нет комментариев

Шахматный движок Fritz

Шахматный движок Fritz Александр Шека

Дата публикации: 31/12/2020 г.

Сегодня при наличии выхода в Интернет можно бесплатно загрузить сильный шахматный движок, но так было не всегда! В начале 1990-х одним из самых мощных коммерческих шахматных движков был Fritz, который все еще существует и очень силен.

  • Просмотров: 3713
  • Нет комментариев

Шахматный движок Shredder

Шахматный движок Shredder Александр Шека

Компьютерные шахматы

Дата публикации: 30/12/2020 г.

Не секрет, что мы живём в мире, где в самые точные шахматы играют шахматные движки. Шредер — одним из самых сильных коммерческих шахматных движков.

  • Просмотров: 2124
  • Нет комментариев

Шахматный движок Рыбка

Шахматный движок Рыбка Александр Шека

Компьютерные шахматы

Дата публикации: 30/12/2020 г.

С тех пор как на сцену вышли шахматные компьютеры, появилось много коммерческих движков, но Рыбка известна как одна из самых сильных. Она победила нескольких сильных гроссмейстеров в различных матчах с форой и выиграла несколько титулов Чемпионата Мира по Компьютерным Шахматам.

Давайте узнаем больше об этом шахматном движке.

  • Просмотров: 2236
  • Нет комментариев

Альфа-Зеро, Владимир Крамник и изобретение новых шахмат

Альфа-Зеро, Владимир Крамник и изобретение новых шахмат Александр Шека

Дата публикации: 12/09/2020 г.

Почти три года прошло с тех пор, как DeepMind’s AlphaZero шокировал шахматный мир, потратив всего четыре часа на то, чтобы пройти путь от нуля до лучшей шахматной программы в мире, теперь они вернулись с еще одной идеей. На этот раз AlphaZero использовала свою способность самообучения для изучения вариантов игры в шахматы, чтобы увидеть, как такие изменения, как запрет рокировки, решение признать пат выигрышем или разрешение пешкам ходить вбок или назад изменят игру. 14-й чемпион мира по шахматам Владимир Крамник был в этой команде и оценил результаты.

  • Просмотров: 1095
  • Нет комментариев

Пора переосмыслить шахматы?

Пора переосмыслить шахматы? Александр Шека

Дата публикации: 28/11/2019 г.

Для развития шахмат нам нужно шагнуть вперед.

Растущая сила шахматных движков, миллионы партий компьютерных программ и тысячи томов дебютной теории, доступные каждому шахматисту, постепенно лишают шахматы на высшем уровне творческого начала. Количество результативных партий в супертурнирах снижается, и среди них все меньше заслуживающих эпитета «творческие».

  • Просмотров: 224
  • Нет комментариев

Новая версия AlphaZero разгромила Stockfish в матче из 1,000 партий

Новая версия AlphaZero разгромила Stockfish в матче из 1,000 партий Александр Шека

Дата публикации: 07/12/2018 г.

DeepMind, компания-разработчик искусственного интеллекта AlphaZero, ушедшая в тень на год после первой ошеломительной публикации в прошлом декабре, опубликовала потрясающий воображение отчет о новой версии своего проекта машинного обучения.

  • Просмотров: 527
  • Нет комментариев

Программа-оболочка Teddy и тесты КДП

На англоязычном форуме Mat Plus увидел тему Teddy 1. 9.0 released (2019). Решил посмотреть, что это за компьютерная программа. Оказалось, это оболочка наподобие Olive Дмитрия Туревского, к которой нужно подключать движки. Автор Teddy – Bjørn Enemark. Программа умеет работать с 4 (!) бесплатными шахматными движками: Popeye, Natch, Euclide, Jacobi. Напомню для новичков, что движки (engines) применяются в шахматной композиции для проверки задач.
Popeye обычно используют для кооперативов и несложных задач на прямой и обратный мат. Также «Попай» поддерживает огромное количество «сказочных» условий.
Natch и Euclide шахматные композиторы используют для тестирования задач на ретроградный анализ (РА) / retrograde analysis (RA). На немецком PDB-сервере эти движки являются де-факто стандартом.
Jacobi используют в сказочном ретрожанре. Как сообщают, он может решать и обычные КДП / SPG, однако делает это медленнее, чем Натч и Евклид.
Бесплатная программа Teddy выступает своего рода графической надстройкой для DOS-овских движков, и она отлично работает на моей Windows 7 64-bit.


Teddy открыта на вкладке Natch. Для начала анализа жмем кнопку внизу Start Natch and wait. В локальную Teddy-базу 01.tdy введена задача Дмитрия Пронкина. В базе она под номером 3 (число в окошке возле диаграммы). Передвигаться по базе можно стрелками под FEN-окошком. Условие задачи КДП в 12,5 ходов указываем в окошке Stipulation как dia12.5 (аналогично в Olive).

* * *
Интерфейс Teddy не слишком дружелюбный для пользователя. В этом программа-оболочка уступает Olive. Я потратил около 20 минут, чтобы разобраться, как подключить движки, настроить их и запустить тестирование шахматной задачи. Хотя возможно, это дело привычки?
Popeye и Natch нужно скачать из интернета, распаковать и для удобства положить в ту папку, в которую установлена оболочка. В моем случае это c:\Program Files (x86)\Teddy\Teddy-1.9.1\ Затем в самой программе нужно подключить движки, зайдя в настройки Settings/Libraries (т.е. указать программе, где движки лежат на вашем жестком диске).
Euclide устанавливается как обычная программа, затем в оболочке Teddy подключаем его в настройках Settings/Libraries/Euclide.
Добавлю, что когда Euclide завершает анализ, внизу черного окошка появляется надпись на французском: «Appuyez sur une touche pour continuer…» (Нажмите любую клавишу, чтобы продолжить…)
Jacobi является веб-приложением, которое откроется в вашем браузере, например в Firefox или Chrome. Teddy лишь отправит ему команду (текстовый код), что именно нужно решить. При анализе позиции, насколько я понял, трудиться будет процессор вашего собственного компьютера.
Jacobi имеет также два решательских режима PG demolition mode и Heuristic mode. Почитать о них подробнее можно здесь.

* * *
Для Popeye, Natch и Euclide каждому отдельно нужно выделить память (Hash size) в настройках. Принцип такой – чем больше, тем лучше. Размер хэша, разумеется, будет в том числе зависеть от количества оперативной памяти вашего компьютера.
Из минусов: Popeye максимум можно выставить 4096 МБ (в Olive я ставлю вдвое больше: 8192 МБ), а ретроаналитические движки по моим прикидкам потребляют не более 1024–2048 МБ.
Все движки одноядерные, т.е. на вашем к примеру 8-ядерном процессоре для вычислений будет задействовано только одно ядро.

* * *
Протестируем несколько шахматных задач КДП (Кратчайшая доказательная партия / Shortest proof game).

Задача № 1. Дмитрий Пронкин, 1985 P0000486
КДП в 12,5 ходов, 2 решения

FEN:
2k4r/1bpp1ppp/1p1r1p2/2b5/4n3/q7/P1PPPPPP/RNBQKBNR

Popeye Windows-64Bit v4.61 (4096 MB) — 1 мин 27 сек
Natch проанализировал задачу за 1 секунду (скрин)
Euclide — менее 1 сек (скрин)
Jacobi — 12 сек (скрин)
_______________________________

Задача № 2. Унто Хейнонен, 2001
КДП в 26 ходов

FEN:
4n1n1/1ppbr1p1/4kpp1/2rp4/P6P/b4q2/1PPPPPP1/3nKBN1

Natch — 17 мин (скрин)
Euclide — 1 мин (скрин)
_______________________________

Задача № 3. Рето Ашванден и Мишель Кайо, 2003 P1009426
КДП в 19 ходов

FEN:
2n2nb1/2pr2qp/p2p1k1r/1p4p1/8/8/P1PP3P/RNBQKBNR

Natch — 23 мин (скрин)
Euclide — 4 ч 34 мин (скрин)
_______________________________

На примере второй и третьей задачи убеждаемся, что для шахматного композитора полезны оба движка: в одном случае гораздо быстрее был Euclide, в другом – Natch. Вацлав Котешовец утверждает у себя на сайте, что для многих позиций программа Natch всё же работает быстрее.
Natch обзавелся собственной оболочкой iNatch, можно запускать его там, я не пробовал. Говорят, iNatch чрезвычайно удобна для составления подобных задач.
Кстати, при тестировании КДП не стоит недооценивать нашего старого знакомого Popeye. Следующую задачу P1274526 SPG 9.0 (автор Andrew Buchanan, 2013) Popeye в оболочке Olive протестировал всего за 35 минут, тогда как Natch и Euclide нужно несколько часов.


Natch работает. Когда Natch завершит анализ позиции, черное окошко исчезнет и данные появятся в центральном окошке Teddy.

* * *
Подведу итоги. Остается поблагодарить создателя программы Бьерна Энемарка за столь полезный продукт! От программы очень хорошее впечатление, она работает стабильно и без нареканий.
Надеюсь, знатоки не будут в обиде на автора этих строк за подробные описания. Заметка ориентировалась на простых пользователей. Спасибо за внимание.

Дополнение. РА в интернете:

Три причины любить ретроанализ
Николай Белухов об Александре Кисляке
Уроки РА
КДП
Glossary — Shortest Proof Game (SPG)
Retros and Proof Games (StrateGems)

Метки: программы, ретроанализ, шахматные программы

Несколько мыслей о тестировании шахматных движков

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

Ручное тестирование неточно

Proxima b, мой первый шахматный движок и в то же время самый простой, не реализовывал какой-либо полезный протокол для шахматных графических интерфейсов, таких как Arena. У него был собственный графический интерфейс с различными режимами (игрок против ИИ, ИИ против ИИ, ИИ против FICS), поэтому единственным способом протестировать его (пока я пропускаю режим AI против FICS) было играть в игры вручную. Как вы можете себе представить, это было очень ненадежно, потому что зависело не только от производительности движка, но и от моей, поэтому, хотя это могло работать для очень простых программ, где введение основных алгоритмов, таких как альфа-бета, действительно может показать очень заметную разницу, это довольно много. бесполезен для более тонкой настройки.

Тестирование на основе интернет-серверов ненадежно

Как Proxima b, так и Proxima b 2. 0 имели возможность подключения к FICS (бесплатному интернет-шахматному серверу) — это было время, когда у lichess.org еще не было открытого API, поэтому это был единственный известный мне способ играть по сети. Хотя это был отличный способ понаблюдать за игрой вживую, на приведенной ниже диаграмме вы можете легко увидеть, насколько динамичными и непредсказуемыми могут быть рейтинги:0003

Что-то очень похожее можно увидеть, если посмотреть на график Козетты ниже. Между первой и последней версией по CCRL разница около 600 Эло, что как-то видно и здесь, но рост был виден спустя долгое время и далеко не стабилен (если только мы не определяем «стабильный» как ± 100 Эло).

Рейтинг Cosette на lichess в период с августа 2020 по декабрь 2021

Еще одна проблема заключается в том, что пул (а значит и все противники) тоже постоянно меняется, что может привести к завышению или занижению рейтинга движка, даже когда изменений не было. Это также видно на изображении выше, поскольку Козетта не обновлялась в течение длительного времени, прежде чем бот был окончательно закрыт, и тем не менее Эло медленно повышался.

Самостоятельная игра может быть ловушкой

Тестирование, основанное на самостоятельной игре, поэтому запуск движка против его старой версии является одним из наиболее популярных способов проверки изменений. Это также был мой основной подход во время разработки Cosette (где я даже сделал свое собственное приложение под названием Arbiter), и хотя оно работало, у него также было два основных недостатка:

  • различия в рейтингах часто сильно преувеличены: потому что оба плеера на одном и том же движке (обычно с небольшой разницей), они склонны использовать слабые места в функции оценки или самом поиске
  • изменение, которое сработало здесь, может совсем не сработать при игре с другими противниками, у которых другие функции оценки и поиска

В прошлом году я почти полностью отказался от этого метода, т.к. надежнее (см. ниже) — наличие хотя бы нескольких разных движков в турнире очень хорошо защищает от таких эксплойтов.

Итак, как проверить?

Во-первых, я использую cutechess-cli, пожалуй, одно из лучших приложений для тестирования — оно работает без графического интерфейса, поэтому я могу оставить его на своем VPS на несколько часов.

Приведенная ниже команда — мой основной способ проверки изменений в Inanis, поэтому ниже я объясню, что делает каждая опция и почему это важно.

 ./cutechess-cli \
    -параллельность 4 \
    -турнирная перчатка -раунды 5000 -игры 2 -повторение -рейтинговый интервал 1 -восстановление \
    -engine cmd="./engines/inanis" name="Inanis DEV" proto=uci option."Crash Files"=true \
    -engine cmd="./engines/2500-2800/k2_095" proto=uci \
    -engine cmd="./engines/2500-2800/Counter-v2.9-linux-64" proto=uci \
    -engine cmd="./engines/2500-2800/weiss" proto=uci \
    -engine cmd="./engines/2500-2800/scorpio_2_84" proto=xboard \
    -engine cmd="./engines/2500-2800/GreKo-Linux-64" proto=uci \
    -engine cmd="./engines/2500-2800/ethereal_823" proto=uci \
    -engine cmd="./engines/2500-2800/inanis_1_0_1" proto=uci option."Crash Files"=true \
    -каждая книга tc=inf/5+0,1=Perfect2019.bin bookdepth=8 option.Hash=32 \
    -уйти в отставку количество ходов=3 счет=500 \
    -draw число ходов=50 число ходов=5 счет=20 \
    -tb /home/ubuntu/syzygy/ -tbpieces 6
 
  • -concurrency 4 — чем больше у вас доступных ядер, тем больше параллельных игр можно будет сыграть. У меня свободно около 6 ядер, но для того, чтобы планировщик операционной системы не портил результаты (особенно важно в очень коротких играх, где каждая миллисекунда имеет значение), у меня всегда есть очень безопасный запас
  • -турнирная перчатка — нас не интересует точный рейтинг других движков, кроме Inanis, поэтому в целях экономии времени они не будут проводить матчи друг с другом
  • -раунды 5000 — я всегда вручную останавливаю тесты , поэтому значение здесь достаточно велико, чтобы никогда не делать это автоматически.
  • -games 2 -repeat — это гарантирует, что каждое начало будет сыграно два раза с переключением цветов — это снижает риск нестабильности результата из-за несбалансированные начальные позиции книги
  • -ratinginterval 1 — отображать информацию о результатах после каждой игры
  • -recover — некоторые движки любят зависать и мы ничего не можем с этим поделать, поэтому попробуйте перезапустить их вместо прерывания турнира
  • -each tc=inf/5+0. 1 book=Perfect2019.bin bookdepth=8 option.Hash=32 — использовать контроль времени 5+0.1 без увеличения после n ходов, открывающая книга Perfect2019 с ограничением глубины 8 и 32 МБ Размер хэша
  • -resign movecount=3 score=500 — остановить игру, если оба движка показали, что счет равен или больше 500 хотя бы за три хода — такие игры, вероятно, в любом случае почти выиграны, так что нет смысла тратить здесь время
  • -draw movenumber=50 movecount=5 score=20 — предотвращать слишком долгие игры, объявляя ничью, когда после 50 ходов есть как минимум 5 ходов со счетом меньше 20
  • -tb /home/ubuntu /syzygy/ -tbpieces 6 — использовать столы Syzygy на 6 человек, чтобы закончить игру, когда результат уже известен, что позволяет сэкономить немного времени

Эта конфигурация позволяет играть около 20000 сверхбыстрых игр за 24 часа. Хотя их качество может быть не самым лучшим из-за ограничений по времени и глубине, их количество делает результат довольно стабильным, с погрешностью измерения около ± 4 Эло (что кажется правдой, исходя из моего опыта).

Пример теста, проведенного после 20204 игр

Еще один важный момент – как выбрать хороших спарринг-партнеров. Как вы можете видеть на изображении выше, все противники Inanis DEV на данный момент слабее из-за постоянного улучшения моего движка. Общее правило заключается в том, что разница между обоими двигателями должна быть менее 200 Эло, в идеале менее 100 Эло, чтобы получить наиболее надежные результаты. Обычно я просто просматриваю список CCRL Blitz, чтобы выбрать лучшие с помощью sdchess.

Вы не упомянули про SPRT!

Одним из критических замечаний, которые я получил после написания этой статьи, было: почему изначально я не упомянул о методе, который широко используется для тестирования изменений: Sequential Probability Ratio Test (SPRT). Как я уже писал в предыдущих разделах, я не верю, что игра с самим собой и рукавицы дают гораздо лучшее представление о том, как некоторые изменения повлияли на мощность двигателя. Я не буду описывать здесь всю методику, автор движка Rustic отлично поработал: https://rustic-chess. org/progress/sprt_testing.html.

Резюме

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

Тестирование шахматного движка

Написано Роем ван Рейном (royvanrijn.com) на 7 февраля 2011 г. 10:02:46

Около недели назад я решил попробовать написать шахматный движок. Я уже сталкивался с битбордами, и мне очень нравилось с ними работать. Большинство ссылок, которые я нашел, были связаны с шахматными движками, поэтому я решил попробовать.

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

Но откуда вы знаете, что ваш двигатель работает и дает правильные результаты? Многие разработчики шахматных движков по всему миру нашли отличное решение этой проблемы. То, что я могу описать только как универсальные интеграционные тесты! Они называют это «perft» (из теста производительности). Первое, что они делают, это создают на шахматной доске определенную ситуацию. Это можно описать как в нотации FEN.
Например:

 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
    (исходная шахматная стартовая позиция) 

Все шахматные движки используют этот небольшой язык и понимают, как настроить свою внутреннюю доску. Следующим шагом является генерация всех возможных ходов. Из приведенного выше примера FEN все возможные ходы составляют всего 20 ходов. Но зачем останавливаться здесь? Из этих 20 ходов вычислите все допустимые ходы, которые может сделать противник (также 20), что дает 400 ходов. Продолжайте делать это, и вы получите такую ​​таблицу:

Глубина
Узлы
Захваты
Э.п.
Замки
Акции
Чеки
Маты
1
20
0
0
0
0
0
0
2
400
0
0
0
0
0
0
3
8902
34
0
0
0
12
0
4
197281
1576
0
0
0
469
8
5
4865609
82719
258
0
0
27351
347
6
119060324
2812008
5248
0
0
809099
10828

Как видите, цифры в этих таблицах быстро становятся огромными. Это гарантирует, что многие ситуации будут протестированы. Используя эти таблицы, вы можете проверить, выводит ли ваша программа одинаковые значения и, следовательно, соответствует ли она всем правилам. В сети есть множество таких таблиц, в которых используется FEN в качестве начальной позиции, а также таблица со всеми узлами, которые можно сгенерировать.

Следующая проблема заключается в том, что, когда ваши числа не складываются, как вы находите ход на 6 уровней в глубину, который идет не так? Ну, некоторые двигатели могут помочь вам в этом. Лично я использовал ROCE (Roman’s Own Chess Engine). Его двигатель имеет функцию «разделения». Сначала вы устанавливаете доску в определенное положение с помощью FEN, а затем вызываете функцию деления, например «делить 6». Теперь он показывает такую ​​таблицу:

 перемещение: узлы
    e2e4 1249
    е2е3 2356
    f2f3 5356
    f2f4 6436
    (и т. д.) 

Это перечисляет каждый узел на уровне 1, и после этого каждое количество узлов приводит к глубине 6. Если у вас также есть эта функция в вашем собственном шахматном движке, вы можете сравнить числа. Теперь вы можете определить, какой из первых узлов содержит ошибку. Сделайте этот ход и попробуйте разделить 5. Это приведет вас к конкретному ходу, который создан (или еще не создан)! Это было огромным подспорьем, и мне нравится, как разработчики шахматного движка разработали своего рода универсальные интеграционные тесты, которые укажут на наиболее часто встречающиеся ошибки. Вы можете взять эти таблицы, загрузить их в автоматический тест и продолжать запускать их каждую ночь, чтобы увидеть, все ли работает так, как должно.

Чем закончился мой двигатель? Что ж, это работало идеально в том смысле, что могло генерировать все хорошие юридические ходы. Затем я добавил простую функцию оценки, и она могла играть в шахматы. После этого я реализовал простой алгоритм поиска (альфа-бета с использованием negamax), и он смог победить два простых других шахматных движка и меня. И, конечно же, через неделю я снова потерял интерес, и запись в блоге об этом обычно является гвоздем в гроб большинства моих проектов.

Итак, чем мне заняться дальше? Я с нетерпением жду нового соревнования AZsPC, но я думаю, что это может занять некоторое время…

Обновление: Несколько читателей указали, что эти тесты, очевидно, не являются модульными тестами , а скорее интеграционными или приемочными тестами. Вы совершенно правы. Я назвал их модульными тестами, потому что использовал JUnit, и они запускаются в автоматической сборке. Но они тестируют интеграцию..!

Поднимитесь на уровень инженера-программиста, написав шахматный движок | Тони Ореглиа

Тестирование

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

Шахматному движку требуется функция генерации ходов для расчета допустимых ходов. Это основополагающий компонент общего качества шахматного движка.

Поскольку шахматы детерминированы, известно точное количество разрешенных ходов из позиции. Одним из распространенных способов проверки генерации ходов является подсчет всех возможных ходов из сложных позиций и проверка правильности подсчета. Этот подход называется перечислением пути перемещения или иногда «идеальным» тестированием.

Например, у белых есть 48 разрешенных ходов из следующей позиции:

r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq —

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

листовых узла в нижней части дерева

Каждый листовой узел не обязательно является уникальным положением. Однако упорядоченная комбинация ходов, ведущих к конечным позициям, уникальна. При расширении до шести ходов получается ровно 88 031 647 685 листовых узлов из позиции, показанной выше.

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

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

Подробнее о тестировании компонентов читайте здесь.

Примечание по разработке через тестирование

Тестирование на наличие ошибок можно начать до того, как у вас будет работающее программное обеспечение. Фактически, идея разработки через тестирование (TDD) состоит в том, чтобы записать ожидаемую функциональность в тесты и только затем разработать программное обеспечение, которое позволит пройти тесты. Это отличная стратегия, и у нее есть дополнительное преимущество — начинать с определенного поведения, которое обеспечивается тестами.

Я рекомендую создавать тесты перечисления пути перемещения перед реализацией генерации перемещения. Это обеспечит постоянную обратную связь во время работы.

Узнайте больше о TDD здесь.

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

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

Усовершенствования функции поиска и оценки позиций требуют, чтобы у нас были некоторые тесты для оценки того, насколько хорошо работает шахматный движок. Для некоторых движков, которые не имеют пользовательского интерфейса, этот уровень тестирования по сути является End to End. Если движок интегрируется с определенным протоколом или пользовательским интерфейсом, то это скорее тест с широким стеком. По сути, это сквозное тестирование двигателя. Он учитывает все аспекты генерации ходов, поиска и методов оценки. Дополнительную информацию об этих категориях тестирования см. в руководстве по тестированию Мартина Фаулера.

Подобно перечисление пути перемещения тестирование , есть ресурсы онлайн с тестовыми позициями и соответствующим лучшим ходом. Например, тест Братко-Копеча — уважаемый набор тестов, который используется уже более сорока лет.

Подробнее об общем подходе к тестированию широкого стека читайте здесь.

Модульное тестирование — это еще одна возможность попрактиковаться в разработке через тестирование (TDD).

Допустим, вы используете битовую доску для представления положения шахматного движка. Полезно иметь интерфейс, который реализует общие механизмы битовой панели, такие как, например, вычисление наименее значимого бита. Это прекрасная возможность использовать TDD для определения точных результатов методов интерфейса перед реализацией фактического метода.

В качестве примера, некоторые тесты, написанные для интерфейса bitboard моего шахматного движка, находятся здесь.

Хотя эти низкоуровневые методы не должны меняться часто, вы можете включить их, если один из них является узким местом в производительности. Затем полезно иметь тест, охватывающий ожидаемое поведение.

«Качество никогда не бывает случайным; это всегда результат разумных усилий». — Джон Раскин

Тестирование имеет решающее значение. Написание шахматного движка — отличная возможность отточить эти навыки. Если вы решите принять этот вызов и написать свой собственный движок, дайте мне знать в комментариях!

Надеюсь, эта статья оказалась вам полезной! Если вы хотите глубже погрузиться в шахматное программирование вместе со мной, присоединяйтесь к Medium, следите за новостями, подписывайтесь на мою рассылку или присоединяйтесь к Twitter и LinkedIn.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *