Schachengine mit API

11

Ich suche eine Schach-Engine, die eine normale API bietet, die ich mit einer höheren Programmiersprache wie C # oder Python verwenden kann. Ich habe die Liste der Führungskräfte (Houdini, Komodo, Stockfish und Rybka) durchgesehen und konnte keine Anzeichen dafür finden, dass diese Engines API bereitstellen (was mich überraschte und darauf hinwies, dass mir etwas fehlt).

Um weniger vage zu sein, brauche ich Folgendes von dieser API:

  • in der Lage sein, ein bestimmtes Spiel in die Engine zu laden
  • in der Lage sein, die Position des Spiels zu bewerten
  • in der Lage sein, sich zu bewegen

Kennt jemand eine Engine, die eine klare API für ihre Funktionen bietet?

Salvador Dali
quelle
2
UCI ist eine API, die Befehle über Befehlszeilenschalter und Standardeingaben erhält. Sie können einen Wrapper um diese Befehle schreiben und Befehle nach Funktionen aufrufen.
Masoud
Ja, UCI ist genau das, wonach Sie suchen. Alle diese Programme unterstützen UCI und werden so in Programme wie ChessBase integriert.
dfan

Antworten:

6

Wie andere bereits gesagt haben, ist UCI die gewünschte API. Die vollständigen Spezifikationen des Protokolls finden Sie hier (die Zip-Datei wird in eine Textdatei extrahiert): http://download.shredderchess.com/div/uci.zip

Es ist eigentlich sehr einfach und unkompliziert. Eine UCI-Engine muss über stdin, stdout und stderr auf Klartext antworten und antworten. Tatsächlich sollten Sie in der Lage sein, die ausführbare Binärdatei einer beliebigen UCI-Engine auf Ihrer Plattform zu starten und die UCI-Befehle manuell auszugeben.

UCI erleichtert Anweisungen von einer GUI oder einer anderen Engine, um die spezifische Engine anzuweisen, alles zu tun, was Sie möchten, einschließlich der Analyse einer bestimmten PGN-Datei (das Laden erfolgt über die GUI oder ein ähnliches Front-End, die Rohbewegungen werden dann in erweiterter algebraischer Form dem Motor zugeführt, z. B. wird e4 zu e2e4). Der zweite und dritte Punkt Ihrer Anforderungen sind Standard bei UCI, aber es liegt an jedem Motorenentwickler, sie zu unterstützen (angesichts der geringen Anforderungen sollten dies die meisten sein).

Hier ist ein Beispiel für UCI in Aktion in der Befehlszeile:

bash-3.2$ ./stockfish-5-64 
Stockfish 5 64 by Tord Romstad, Marco Costalba and Joona Kiiski
uci
id name Stockfish 5 64
id author Tord Romstad, Marco Costalba and Joona Kiiski

option name Write Debug Log type check default false
option name Write Search Log type check default false
option name Search Log Filename type string default SearchLog.txt
option name Book File type string default book.bin
option name Best Book Move type check default false
option name Contempt Factor type spin default 0 min -50 max 50
option name Mobility (Midgame) type spin default 100 min 0 max 200
option name Mobility (Endgame) type spin default 100 min 0 max 200
option name Pawn Structure (Midgame) type spin default 100 min 0 max 200
option name Pawn Structure (Endgame) type spin default 100 min 0 max 200
option name Passed Pawns (Midgame) type spin default 100 min 0 max 200
option name Passed Pawns (Endgame) type spin default 100 min 0 max 200
option name Space type spin default 100 min 0 max 200
option name Aggressiveness type spin default 100 min 0 max 200
option name Cowardice type spin default 100 min 0 max 200
option name Min Split Depth type spin default 0 min 0 max 12
option name Threads type spin default 1 min 1 max 128
option name Hash type spin default 32 min 1 max 16384
option name Clear Hash type button
option name Ponder type check default true
option name OwnBook type check default false
option name MultiPV type spin default 1 min 1 max 500
option name Skill Level type spin default 20 min 0 max 20
option name Emergency Move Horizon type spin default 40 min 0 max 50
option name Emergency Base Time type spin default 60 min 0 max 30000
option name Emergency Move Time type spin default 30 min 0 max 5000
option name Minimum Thinking Time type spin default 20 min 0 max 5000
option name Slow Mover type spin default 80 min 10 max 1000
option name UCI_Chess960 type check default false
uciok
isready
readyok
quit
bash-3.2$ 

Die Befehle, die ich ausgegeben habe, waren uci, isready und quit.

Um die UCI-Befehle zu verwenden, haben Sie im Wesentlichen zwei Hauptoptionen. Sie können eine vorhandene Schnittstelle (z. B. ChessX, Arena und eine Vielzahl anderer) verwenden oder Ihren eigenen Code schreiben, um Anweisungen an eine Engine oder eine Gruppe von Engines zu erteilen. Ich glaube, es gibt möglicherweise bereits Python-Wrapper für den Zugriff auf UCI-Engines, aber ich muss dies noch einmal überprüfen. Es gibt definitiv Python-Schach (Import-Schach) und Pychess (Import-Pychess), ich kann mich nur nicht an den Umfang ihrer Funktionen erinnern. Ich kann mich nicht erinnern, wo Pychess lauert (wahrscheinlich Github oder Google Code), aber Python-Chess kann mit Pip installiert werden.

Ben
quelle
UCI scheint keine API zum Festlegen des Werts der Teile bereitzustellen.
Snowcrash
So etwas sollte in die Engine selbst programmiert werden, und Schach-Engines verwenden Standardwerte. Sie müssten es nur für ein anderes Spiel ändern (z. B. Feenschach), und dann müssen Sie wahrscheinlich viel mehr Änderungen vornehmen als nur die Stückwerte.
Ben
Ich stimme dir nicht zu. Es gibt keine standardWerte.
Snowcrash
Dann müssten Sie wahrscheinlich eine Engine-Code-Basis aufteilen, um sie stattdessen mit variablen Werten neu zu gestalten. Legen Sie dann eine separate Konfiguration für die gegabelte und neu kompilierte Engine fest, um die neuen Werte zu verwenden. Interagieren Sie dann wie gewohnt über UCI. Alternativ kann ich mir auch das andere Engine-Sprachformat ansehen, das GNU Chess verwendet. Ich vergesse jedoch die Details.
Ben
3

Ich habe auf "chess engine api" gegoogelt, aber keine echten APIs gesehen. Wie in den Kommentaren Ihrer Frage vorgeschlagen, würde ich mit UCI gehen. Auf diese Weise kommunizieren GUIs auch mit Schach-Engines.

Wenn Sie wirklich ein Hardcore-Programmierer sind, können Sie sich jederzeit die Open-Source-Engine Stockfish ansehen. Es könnte sehr gut sein, dass eine Art API darin eingebaut ist, oder Sie könnten einen Klon erstellen und Ihre eigene API dafür erstellen.

http://stockfishchess.org/

Rafiek
quelle
1
Die API für die Kommunikation mit Stockfish ist ebenfalls UCI.
dfan
1
Tatsächlich ist es. Die Verwendung von UCI oder das Eintauchen in den Code hängt jedoch davon ab, wie der Motor verwendet wird und nicht wofür. Die Frage war dazu nicht klar.
Rafiek
Ich glaube, ich habe erwähnt, was genau ich mit dem Motor machen muss. Laden Sie ein bestimmtes PNG und werten Sie es nach jeder Bewegung aus.
Salvador Dali
Es ist völlig klar, was Sie mit dem Motor machen wollen. Wie Sie es verwenden werden, bleibt offen. In welcher Einstellung verwenden Sie den Motor? Es kann sein, dass UCI nicht die optimale Art der Kommunikation mit der Engine ist. Ich habe eine andere Option vorgeschlagen, wenn UCI für Sie nicht ausreicht.
Rafiek
Entschuldigung, aber ich kann nicht verstehen, was Sie damit meinen, wie ich den Motor verwenden werde. Können Sie das bitte klarstellen?
Salvador Dali
1

Batch First ist eine in Python geschriebene JIT-kompilierte Schach-Engine, die mit Numba kompiliert wurde und eine einfache C ++ - Schnittstelle und eine noch einfachere Python-Schnittstelle ermöglicht.

Während Batch First selbst eine Engine ist, die keine API ist, verwendet es stark das Python-Chess- Paket, das eine großartige API ist, und verlässt sich darauf .

Die JIT-Kompilierung von Batch First und die Verwendung von NumPy-Arrays zur Darstellung von Boards ermöglichen eine praktischere Python-Schnittstelle (mindestens eine Größenordnung schneller) für die tatsächliche Verwendung in einer Schachengine.

Der Kern der Engine ist ein Null-Fenster-k-best-first-Suchalgorithmus, der zur Bewertung von ANNs in Stapeln verwendet wird.

Vollständige Offenlegung, ich bin der Autor der Batch First Engine.

Sam Ragusa
quelle
-1

Hier gibt es eine Portversion von Stockfish in .Net: https://github.com/bpfliegel/Portfish

Um diese Engine zu verwenden (sobald sie kompiliert ist), benötigen Sie eine grafische Benutzeroberfläche wie Arena http://wwww.playwitharena.com oder ScidVSPC http://scidvspc.sourceforge.net . Diese Anwendungen werden verwendet, um eine schöne Oberfläche bereitzustellen und es Ihnen zu ermöglichen, Spiele / Positionen zu laden, sie zu analysieren (ich bin mir ziemlich sicher, dass Sie ein Spiel auf pgn laden und es von einer Engine mit Kriterien wie "n Sekunden pro Zug" oder "analysieren" können). n Lagen pro Zug "), Streichhölzer zwischen Motoren usw.

In (fast) jeder Schachengine sollten Sie so etwas wie eine uci.cs- oder eine xboard.cs-Datei finden, die für diese Kommunikationsaufgabe festgeschrieben ist.

(Eine "Schach-Engine" ist ein Programm, das Schach spielen kann, aber keine grafische Oberfläche hat. Die Kommunikation mit Anwendungen wie Arena oder ScidVSPC erfolgt über die UCI- oder xboard-Protokolle. Die meisten Schachprogramme sind also so geschrieben Der Entwickler kann das GUI-Zeug vergessen und sich auf das "Gehirn" konzentrieren.

Emilio Díaz
quelle