Questão:
Retornar pontuações para todos os movimentos possíveis de um mecanismo de xadrez
QuarterlyQuotaOfQuotes
2016-10-26 17:44:30 UTC
view on stackexchange narkive permalink

Estou procurando uma maneira de retornar as pontuações de todos os movimentos possíveis de um mecanismo de xadrez (de preferência, Stockfish).

O protocolo UCI parece não exigir isso, mas parece ser um recurso útil a ser incluído.

Há algum mecanismo de xadrez / extensão do UCI que implementa isso?

Defina multipv como um número grande.
isso não me daria 100 linhas diferentes, todas começando com e4?
Você sabe o que é multi PV?
Legal. Podemos usá-lo para abrir o arquivo pgn que tem múltiplas variações? Estou tentando obter essa avaliação em todos os movimentos das linhas laterais também. Obrigado Nh3 eval = -0.43Nf3 eval = 0.69Nc3 eval = 0.29Na3 eval = -0.35
Um responda:
Ellie
2016-10-31 01:35:43 UTC
view on stackexchange narkive permalink

Claro, há uma maneira: vou mostrar a você uma maneira de fazer isso sozinho, usando apenas software livre. Vamos escrever um pequeno script em Python (estou usando v2.7) e usar apenas a maravilhosa biblioteca python-chess (licenciada sob GPL3, observe que estou usando a versão 0.14.0).

Em suma, o script carregará primeiro o mecanismo, vamos nos ater ao código-fonte livre e aberto usaremos o incrível motor Stockfish [*] e, em seguida, criaremos uma instância do tabuleiro da posição que você deseja analisar (usando a notação FEN) e geraremos todos os movimentos legais e, por fim, peça ao mecanismo para avaliar cada movimento por um período de tempo predefinido (neste exemplo, é definido como 1 segundo de tempo de ponderação). Aqui está um exemplo funcional:

  import chessimport chess.uci # Vamos tentar nosso código com a posição inicial do xadrez: fen = 'rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR w KQkq - 0 1'board = chess.Board (fen) handler = chess.uci.InfoHandler () # Agora certifique-se de fornecer o local correto para o arquivo do mecanismo stockfish # ... na linha a seguir: por exemplo, / home /.../ stockfish_6_x64engine = chess.uci.popen_engine ('stockfish_6_x64') engine.info_handlers.append (handler) engine.position (board) if board.turn: print 'Branco para mover' outro: imprimir 'preto para mover 'para el em board.legal_moves: engine.go (searchmoves = [el], movetime = 1000) print str (board.san (el)),' eval = ', round (handler.info ["score"] [1 ] .cp / 100.0,2)  

Observe que esta não é necessariamente a melhor / mais eficiente maneira de fazer isso, escrevi isso em 5 minutos apenas para mostrá-lo em um nível básico sem usar nenhum recurso avançado do mecanismo, tenho certeza de que você se sairá muito melhor sozinho. De qualquer forma, aqui está a saída depois de executá-lo (supondo que você tenha o python instalado em qualquer sistema operacional que esteja usando, o mesmo vale para a biblioteca python-chess):

  White to moveNa3 eval = -0.39Nc3 eval = 0.15Nf3 eval = 0.15Nh3 eval = -0.37a3 eval = 0.01b3 eval = -0.15c3 eval = -0.03d3 eval = -0.06
e3 eval = 0,12f3 eval = -0,49g3 eval = -0,33h3 eval = 0,0a4 eval = -0,12b4 eval = -0,67c4 eval = 0,07d4 eval = 0,17e4 eval = 0,17f4 eval = -0,15g4 eval = -0,74 h4 eval = -0,15  

Pronto! A beleza de tudo isso é, obviamente, o fato de que você agora tem seu próprio software para trabalhar, modificar e estendê-lo como desejar ... sem limitações. Tudo muito fácil de fazer, apenas familiarize-se com o funcionamento da biblioteca que estamos usando seguindo sua documentação e se surpreenda;)

Não hesite em perguntar se você tiver alguma dúvida sobre o código ou adicionar funcionalidades potenciais.

[*]: que também é um dos motores de xadrez atuais mais fortes.


Edite para atender ao pedido comum:

Aqui está a versão atualizada do mesmo código usando a versão mais recente:

python-chess 0.30.0 e usando o Stockfish mais recente

  import chessimport chess.engineimport os # aqui, assumimos que o arquivo do mecanismo está na mesma pasta que nosso scriptpath python = os.getcwd () # Vamos tentar nosso código com a posição inicial do chess: fen = 'rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR w KQkq - 0 1'board = chess.Board (fen) #Agora certifique-se de fornecer o local correto para seu arquivo de motor stockfish # ... em a linha que segue definindo corretamente pathengine = chess.engine.SimpleEngine.popen_uci (path + '/' + 'stockfish-10-64') if board.turn: print ('White to move') else: print ('black to move ') para el em board.legal_moves: info = engine.analyse (board, chess.engine.Limit (time = 1), root_moves = [el]) t = str (info ["pontuação"]) se t.st artswith ('#'): print (str (board.san (el)), "eval = mate in", t) else: print (str (board.san (el)), "eval =", round (int (t) /100.,2)) engine.quit ()  

A saída para o tempo de ponderação definido como 1 segundo por movimento encontrado chess.engine.Limit (time = 1 ) :

  Brancas para moverNh3 eval = -0.43Nf3 eval = 0.69Nc3 eval = 0,29
Na3 eval = -0,35h3 eval = 0,41g3 eval = -0,2f3 eval = -0,62e3 eval = 0,45d3 eval = 0,03c3 eval = 0,19b3 eval = 0,1a3 eval = 0,46h4 eval = -0,42g4 eval = -1,22f4 eval = -0,07e4 eval = 0,82d4 eval = 0,63c4 eval = 0,57b4 eval = -0,26a4 eval = -0,02  
você pode atualizar o código com a última versão da lib, por favor?
Comentário secundário do @shar's
@JordanMackie veja a edição.


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...