Motor de ajedrez con API

11

Estoy buscando un motor de ajedrez que proporcione una API normal que pueda usar con algún lenguaje de programación de alto nivel como C # o python. Revisé la lista de líderes (Houdini, Komodo, Stockfish y Rybka) y no pude encontrar ninguna señal de que estos motores proporcionen API (lo que me sorprendió y sugirió que me falta algo).

Para ser menos vago, esto es lo que necesito de esta API:

  • ser capaz de cargar un juego específico en el motor
  • poder evaluar la posición del juego
  • ser capaz de hacer un movimiento

Entonces, ¿alguien conoce un motor que proporcione una API clara para sus funciones?

Salvador Dalí
fuente
2
UCI es una API que obtiene el comando a través de interruptores de línea de comando y entrada estándar. Puede escribir un contenedor alrededor de esos comandos y llamar a los comandos por funciones.
masoud
Sí, UCI es exactamente lo que estás buscando. Todos esos programas admiten UCI, que es cómo se integran en programas como ChessBase.
dfan

Respuestas:

6

Como otros han dicho, UCI es la API que desea. Las especificaciones completas del protocolo están aquí (el archivo zip se extrae en un archivo de texto): http://download.shredderchess.com/div/uci.zip

En realidad es muy sencillo y sencillo, un motor UCI debe responder y responder en texto plano a través de stdin, stdout y stderr. De hecho, debería poder iniciar el binario ejecutable de cualquier motor UCI en su plataforma y emitir los comandos UCI manualmente.

UCI facilita instrucciones de una GUI u otro motor para indicarle al motor específico que haga lo que sea que desee que haga, incluido el análisis de un archivo PGN específico (la carga es a través de la GUI o un front-end similar, los movimientos sin procesar luego se alimentan al motor en forma algebraica extendida, como que e4 se convierta en e2e4). Los puntos segundo y tercero de sus requisitos son estándar con UCI, pero corresponde a cada desarrollador de motores respaldarlos (dada la escasez de esos requisitos, esa debería ser la mayoría de ellos).

Aquí hay un ejemplo de UCI en acción en la línea de comando:

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$ 

Los comandos que emití fueron uci, isready y quit.

Para utilizar los comandos UCI, esencialmente tiene dos opciones principales; puede usar una interfaz existente (por ejemplo, ChessX, Arena y una gran cantidad de otras) o puede escribir su propio código para emitir instrucciones a un motor o grupo de motores. Creo que ya puede haber envoltorios de Python para acceder a los motores UCI, pero necesitaría verificarlo nuevamente. Definitivamente hay python-chess (import chess) y pychess (import pychess), simplemente no puedo recordar el alcance de sus funciones. No recuerdo dónde está acechando pychess (probablemente github o código de google), pero python-chess se puede instalar con pip.

Ben
fuente
UCI no parece proporcionar una API para establecer el valor de las piezas.
Snowcrash
Ese tipo de cosas debería programarse en el motor mismo y los motores de ajedrez usarán valores estándar. Solo necesitarías cambiarlo para otro juego (por ejemplo, ajedrez de hadas) y es probable que tengas que hacer muchos más cambios además de los valores de las piezas.
Ben
Estoy en desacuerdo. No hay standardvalores
Snowcrash
Entonces, probablemente necesite bifurcar una base de código de motor para rediseñarla con valores variables. Luego establezca una configuración separada para el motor bifurcado y recompilado para usar los nuevos valores. Luego, continúe interactuando a través de UCI como de costumbre. Alternativamente, mira el otro formato de lenguaje de motor que usa GNU Chess, aunque olvido los detalles.
Ben
3

Busqué en Google la "API del motor de ajedrez" pero no he visto ninguna API real. Como se sugiere en los comentarios de su pregunta, iría con UCI. Esta es también la forma en que las GUI se comunican con los motores de ajedrez.

Si realmente eres un programador incondicional, siempre puedes consultar el motor de código abierto Stockfish. Es muy posible que haya algún tipo de API incorporada, o podría hacer un clon y construir su propia API para él.

http://stockfishchess.org/

Rafiek
fuente
1
La API para hablar con Stockfish también es UCI.
dfan
1
De hecho, es. Pero usar UCI o sumergirse en el código dependerá de cómo se usará el motor y no para qué. La pregunta no estaba clara al respecto.
Rafiek
Creo que mencioné exactamente lo que necesito hacer con el motor. Cargue un PNG en particular y evalúe después de cada movimiento.
Salvador Dali
Está perfectamente claro lo que quieres hacer con el motor. Cómo lo usará se deja al descubierto. ¿En qué configuración utilizará el motor? Podría ser que UCI no sea la forma óptima de comunicarse con el motor. Sugerí otra opción si UCI no es suficiente para ti.
Rafiek
Lo siento, pero no puedo entender a qué te refieres con cómo voy a usar el motor. ¿Puedes por favor aclarar esto?
Salvador Dali
1

Batch First es un motor de ajedrez compilado JIT escrito en Python, compilado usando Numba, que permitiría una interfaz C ++ fácil y una interfaz Python aún más fácil.

Si bien Batch First en sí mismo es un motor, no API, utiliza mucho y se basa en el paquete Python-Chess , que es una API increíble.

La compilación JIT de Batch First, y el uso de matrices NumPy para representar tableros, permite una interfaz Python más práctica (al menos un orden de magnitud más rápido) para uso real en un motor de ajedrez.

El núcleo del motor es un algoritmo de búsqueda k-best-first de cero ventanas utilizado para evaluar ANN en lotes.

Divulgación completa, soy el autor del motor Batch First.

Sam Ragusa
fuente
-1

Aquí hay una versión de puerto de Stockfish en .Net: https://github.com/bpfliegel/Portfish

Para usar este motor (una vez que está compilado), necesitará una GUI como Arena http://wwww.playwitharena.com o ScidVSPC http://scidvspc.sourceforge.net . Estas aplicaciones se utilizan para proporcionar una interfaz agradable y le permiten cargar juegos / posiciones, analizarlos (estoy bastante seguro de que puede cargar un juego en pgn y analizarlo por un motor con criterios como "n segundos por movimiento" o " n capas por movimiento "), ejecutar partidos entre motores, etc.

En (casi) cada motor de ajedrez, debe encontrar algo como un archivo uci.cs o xboard.cs que se compromete con esta tarea de comunicación.

(Un "motor de ajedrez" es un programa que es capaz de jugar ajedrez pero no tiene una interfaz gráfica. La forma en que se comunica con aplicaciones como Arena o ScidVSPC es mediante los protocolos UCI o xboard. La mayoría de los programas de ajedrez se escriben de esta manera, por lo que el desarrollador puede olvidarse de las cosas de la GUI y centrarse en el "cerebro").

Emilio Díaz
fuente