Sunfish es un motor de ajedrez simple pero fuerte, escrito en Python. Con su simple interfaz UCI, y eliminar comentarios y espacios en blanco, ¡ocupa solo 131 líneas de código! ( build/clean.sh sunfish.py | wc -l ). Sin embargo, juega en las clasificaciones superiores a 2000 en Lichess.
Debido a que el pez luna es pequeño y se esfuerza por ser simple, el código proporciona una gran plataforma para experimentar. Las personas lo han usado para probar algoritmos de búsqueda paralelos, experimentar con funciones de evaluación y desarrollar programas de ajedrez de aprendizaje profundo. ¡Bifurca hoy y mira qué puedes hacer!
La forma más sencilla de ejecutar Sufish es a través de la interfaz terminal "elegante":
$ herramientas/fancy.py -cmd ./sunfish.py
Jugando contra Sunfish 2023.
¿Quieres ser blanco o negro? negro
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜
hgfedcba
Puntuación: 23, nodos: 11752, NP: 13812, Tiempo: 0.9
Mi movimiento: D4
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4 ♙
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜
hgfedcba
Tu movimiento (por ejemplo, C6 o G8H6): NF6
La interfaz terminal utiliza notación algebraica para ingresar movimientos. Aquí hay una breve descripción general de cómo funciona: desde la perspectiva de White, las columnas están etiquetadas como AH de izquierda a derecha y las filas están etiquetadas 1-8 de abajo hacia arriba. Cada cuadrado se nombra con su letra respectiva que el número (por ejemplo, A2, C3, H8). Se comunica un movimiento por la primera letra de la pieza en movimiento seguida de la plaza de destino (se omite la P para los movimientos de peones y N se usa para los Caballeros). Si más de una de la misma pieza puede moverse a un cuadrado, especifique el archivo de la pieza móvil. Si todavía es ambiguo, especifique la columna.
Para usar la interfaz terminal, la notación utilizada debe ser de un formato específico; de lo contrario, el movimiento ingresado no se leerá correctamente. A veces se usa una "X" para denotar una captura, pero debe omitirse (por ejemplo, BD4 no BXD4). No use un "+" para denotar un cheque (por ejemplo, BF7 no BF7+). No use un "=" para denotar la promoción de peones (por ejemplo, E8Q no E8 = Q) para denotar una captura de peón, la notación requerida es un archivo inicial seguido del cuadrado final (por ejemplo, GF4 no GF). El castillo debe denotarse con minúsculas 'O (por ejemplo, oo y ooo). La especificación de un archivo o columm debe ser después de indicar la pieza (por ejemplo, RAE1 no Are1). Al notar en Passant, el cuadrado de destino debe ser el cuadrado en el que termina el peón, no el quenado del peón que fue capturado (por ejemplo, EF6 no EF5).
La interfaz terminal también admite notación explícita. Aquí es donde se indica el cuadrado de origen seguido por el cuadrado de destino (por ejemplo, E2E4).
Tenga en cuenta que esto requiere el paquete Python-Shoess. Para una verdadera experiencia minimalista, primero podemos "empacar" el pez luna en un ejecutable comprimido (¡menos de 3 kb!) Y ejecutarlo directamente:
$ build/pack.sh sunfish.py empacado.sh Longitud total: 2953 $ ./packed.sh Vaya WTIME 1000 BTIME 1000 WINC 1000 BINC 1000 profundidad de información 1 puntaje CP 0 PV D2D4 bestmove d2d4
(Consulte la especificación UCI para el conjunto completo de comandos).
También es posible ejecutar el pez luna con una interfaz gráfica, como Pychess o Arena.
Finalmente, puedes jugar Sunfish ahora en Lichess o jugar contra el puerto de óxido de Recursing, también en Lichess, que es aproximadamente 100 elo más fuerte.
Hay una versión experimental que utiliza una red neuronal eficientemente actualizable. Puede probarlo utilizando la interfaz terminal elegante como se indicó:
$ herramientas/fancy.py -cmd "./sunfish_nnue.py nnue/modelos/tanh.pickle" ...
En contraste con el gran NNUE en digamos, Stockfish, ¡esta red es de solo 1207 bytes! Eso asegura que Sunfish Nnue todavía se pueda empacar en menos de 4KB. Usando NNUE, Sunfish jugará mejor posicionalmente, pero peor tácticamente, ya que la implementación aún no es lo suficientemente rápida.
Sunfish admite todas las reglas de ajedrez, excepto la regla de los 50 movimientos.
Hay muchas formas en que puede intentar fortalecer el pez luna. Primero, podría cambiar de una representación de tablero a una matriz mutable y agregar una forma rápida de enumerar las piezas. Luego puede implementar la generación de captura dedicada, verificar la detección y verificar las evasiones. ¡También puede mover todo a Bitboards, implementar partes del código en C o experimentar con búsqueda paralela!
La otra forma de fortalecer el pez luna es darle más conocimiento del ajedrez. La función de evaluación actual solo usa tablas cuadradas piezas: ni siquiera distingue entre el medio juego y el juego final. También puede experimentar con más poda, actualmente solo se realiza un movimiento nulo, y las extensiones, actualmente no se usa ninguna. Finalmente, el pez luna podría beneficiarse de un orden de movimiento más avanzado, MVV/LVA y ver ¿Quizás?
Una manera fácil de obtener un pez luna fuerte es correr con el intencion justo a tiempo de Pypy. En particular, la versión Python2.7 de Pypy ofrece un impulso de 250 ELO en comparación con los intepretadores CPYTHON (2 o 3) en controles de tiempo rápido:
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%
El nombre SUNfish en realidad se refiere al pez luna pigmeo, que se encuentra entre los pocos peces para comenzar con las letras 'py'. El uso de un pez está en el espíritu de grandes motores como Stockfish, Zappa y Rybka.
En términos de patrimonio, el pez luna toma mucho más de Micro-Max por Geert Muller y Pychess.
GNU GPL V3