Sunfish é um motor de xadrez simples, mas forte, escrito em Python. Com sua interface UCI simples e removendo comentários e espaço em branco, leva apenas 131 linhas de código! ( build/clean.sh sunfish.py | wc -l ). No entanto, toca nas classificações acima de 2000 em Lichess.
Como o Sunfish é pequeno e se esforça para ser simples, o código fornece uma ótima plataforma para experimentar. As pessoas o usaram para testar algoritmos de pesquisa paralela, experimentar funções de avaliação e desenvolver programas de xadrez de aprendizado profundo. Bifra hoje e veja o que você pode fazer!
A maneira mais simples de executar o Sufish é através da interface do terminal "sofisticada":
$ ferramentas/gosta.py -cmd ./sunfish.py
Jogando contra o Sunfish 2023.
Você quer ser branco ou preto? preto
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜
HGFEDCBA
Pontuação: 23, nós: 11752, NPS: 13812, tempo: 0.9
Meu movimento: D4
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4 ♙
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜
HGFEDCBA
Seu movimento (por exemplo, C6 ou G8H6): NF6
A interface do terminal usa a notação algébrica para os movimentos de entrada. Aqui está uma breve visão geral de como funciona: da perspectiva de White, as colunas são rotuladas AH da esquerda para a direita e as linhas são rotuladas de 1 a 8 da parte inferior para a parte superior. Cada quadrado é nomeado com sua respectiva letra que o número (por exemplo, A2, C3, H8). Um movimento é comunicado pela primeira letra da peça em movimento seguida pelo quadrado de destino (o P para movimentos de peão é omitido e n é usado para cavaleiros). Se mais de uma da mesma peça puder se mover para um quadrado, especifique o arquivo da peça em movimento. Se isso ainda for ambíguo, especifique a coluna.
Para usar a interface do terminal, a notação usada deve ter um formato específico, caso contrário, o movimento inserido não será lido corretamente. Às vezes, um "X" é usado para denotar uma captura, mas deve ser omitido (por exemplo, BD4 não BXD4). Não use um "+" para denotar um cheque (por exemplo, BF7 não BF7+). Não use um "=" para denotar a promoção do peão (por exemplo, e8q não e8 = q) para denotar uma captura de peão que a notação necessária é o arquivo de partida seguido pelo quadrado final (por exemplo, gf4 não gf). Castling deve ser denotado com os minúsculos (por exemplo, oo e ooo). Especificar um arquivo ou columm deve estar depois de declarar a peça (por exemplo, RAE1 não Are1). Ao anotar en passante, o quadrado de destino deve ser o quadrado em que o peão acaba, e não o peão que foi capturado (por exemplo, ef6 não ef5).
A interface do terminal também suporta notação explícita. É aqui que o quadrado de origem é declarado seguido pelo quadrado de destino (por exemplo, E2E4).
Observe que isso requer o pacote Python-Chess. Para uma verdadeira experiência minimalista, primeiro podemos "embalar" o peixe -sol em um executável compactado (menos de 3kb!) E executá -lo diretamente:
$ build/pack.sh sunfish.py embalado.sh Comprimento total: 2953 $ ./packed.sh vá wtime 1000 btime 1000 winc 1000 binc 1000 INFO INFORMA INFORMA 1 Pontuação CP 0 PV D2D4 BestMove D2D4
(Veja a especificação UCI para o conjunto completo de comandos.)
Também é possível executar peixes -sol com uma interface gráfica, como Pychess ou Arena.
Finalmente, você pode brincar de peixes -sol agora na lichess ou jogar contra o porto de Rust RURSING, também em Lichess, que é cerca de 100 Elo mais forte.
Existe uma versão experimental usando uma rede neural com eficiência atualizável. Você pode testá -lo usando a interface do terminal sofisticada como acima:
$ ferramentas/gosta.py -cmd "./sunfish_nnue.py nnue/modelos/tanh.pickle" ...
Em contraste com o grande nnue, digamos, os peixes -estoques, essa rede é de apenas 1207 bytes! Isso garante que o Sunfish Nnue ainda possa ser embalado em menos de 4 KB. Usando o nnue, o Sunfish jogará melhor posicionalmente, mas pior taticamente, pois a implementação ainda não é rápida o suficiente.
Sunfish suporta todas as regras de xadrez, exceto as 50 movimentos de desenho de regra.
Existem muitas maneiras pelas quais você pode tentar tornar os peixes -sol mais fortes. Primeiro, você pode mudar de uma representação do conselho para uma matriz mutável e adicionar uma maneira rápida de enumerar peças. Em seguida, você pode implementar a geração de captura dedicada, verifique a detecção e verificar evasões. Você também pode mover tudo para bits, implementar partes do código em C ou experimentar a pesquisa paralela!
A outra maneira de fortalecer o peixe -sol mais forte é dar mais conhecimento do xadrez. A função de avaliação atual usa apenas tabelas quadradas - ela nem distingue entre o meio -jogo e o final do jogo. Você também pode experimentar mais poda - atualmente apenas o movimento nulo é feito - e extensões - atualmente nenhuma é usada. Finalmente, o Sunfish pode se beneficiar de uma ordem mais avançada, MVV/LVA e ver talvez?
Uma maneira fácil de obter um peixe-sol forte é correr com o número inteiro Pypy Just-in-time. Em particular, a versão python2.7 do Pypy oferece um impulso 250 ELO em comparação com os interesters cpython (2 ou 3) em controles de tempo 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%
O nome do sol do sol se refere ao peixe -sol pigmeu, que está entre os poucos peixes para começar com as letras 'py'. O uso de um peixe está no espírito de grandes motores, como peixes -estoque, Zappa e Rybka.
Em termos de herança, o Sunfish toma emprestado muito mais de Micro-Max por Geert Muller e Pychess.
GNU GPL V3