Crie uma IA simples de xadrez: 5 etapas fáceis



Traduzimos para você um artigo de Lauri Hartikka sobre a criação da IA ​​mais simples para o xadrez. Foi redigido em 2017, mas os princípios básicos permaneceram os mesmos. Todos os arquivos que Lori usou também estão disponíveis.

Inteligência artificial simples que pode jogar xadrez pode ser criada com base em quatro conceitos:

  1. 1. Movendo-se;
  2. 2. Avaliação do conselho;
  3. 3. Minimax ;
  4. 4. Recorte alfa alfa . Em cada estágio do trabalho com o algoritmo, um deles será usado, isso melhorará gradualmente os recursos de jogo da IA.

A Skillbox recomenda: O Curso Online Aplicado do Python Data Analyst .

Lembramos que: para todos os leitores de "Habr" - um desconto de 10.000 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

O código-fonte pronto pode ser encontrado no GitHub .


Etapa 1. Visualização de um tabuleiro de xadrez com a geração de movimentos


Neste ponto, usaremos as bibliotecas chess.js para gerar movimentos e chessboard.js para renderizar o tabuleiro de xadrez. A biblioteca, responsável pela geração de jogadas, permite aplicar todas as regras do xadrez, para que possamos calcular cada ação para um arranjo específico de peças.


Quando você clicar na imagem, ela será aberta em resolução total.

Trabalhar com essas bibliotecas permite que você se concentre na tarefa principal - pesquisando e criando um algoritmo que permite encontrar a jogada ideal. Iniciamos o trabalho escrevendo uma função que retorna um movimento aleatório de uma lista de todos os possíveis.

var calculateBestMove =function(game) { //generate all the moves for a given position var newGameMoves = game.ugly_moves(); return newGameMoves[Math.floor(Math.random() * newGameMoves.length)]; }; 

Apesar do fato de o algoritmo não ser um jogador de xadrez ideal, isso será suficiente para a maioria dos jogadores de seu nível.


O preto se move aleatoriamente. ( fonte e jogo online )

Etapa 2. Avaliação da Posição


Agora vamos descobrir qual lado tem a vantagem nesta ou naquela posição. A maneira mais fácil é calcular a força relativa das peças no tabuleiro, isso pode ser feito usando a tabela.



Usando a função de avaliação, temos a oportunidade de criar um algoritmo que seleciona o movimento com a classificação máxima.

 var calculateBestMove = function (game) { var newGameMoves = game.ugly_moves(); var bestMove = null; //use any negative large number var bestValue = -9999; for (var i = 0; i < newGameMoves.length; i++) { var newGameMove = newGameMoves[i]; game.ugly_move(newGameMove); //take the negative as AI plays as black var boardValue = -evaluateBoard(game.board()) game.undo(); if (boardValue > bestValue) { bestValue = boardValue; bestMove = newGameMove } } return bestMove; }; 

Em princípio, o nível é o mesmo, mas o algoritmo já pode assumir a figura de outra pessoa quando existe essa oportunidade.


As pretas tiveram a oportunidade de pegar peças brancas. (Fontes e jogo estão aqui ).

Etapa 3. Árvore de pesquisa com minimax


Depois disso, criamos uma árvore de pesquisa. Agora o programa pode escolher a melhor opção. Isso é feito usando o algoritmo minimax.

Aqui, uma árvore recursiva com a exibição de todos os movimentos possíveis é analisada até uma determinada profundidade. A posição é estimada pelas folhas da nossa árvore.

Em seguida, retornamos o valor mínimo ou máximo do filho ao nó pai. Tudo depende de qual lado está calculando mal atualmente. Em outras palavras, o resultado é maximizado ou minimizado em cada nível.


Aqui, b2-c3 é a melhor jogada para as brancas, pois ele garante que o jogador chegue à posição com uma pontuação de -50.

 var minimax = function (depth, game, isMaximisingPlayer) { if (depth === 0) { return -evaluateBoard(game.board()); } var newGameMoves = game.ugly_moves(); if (isMaximisingPlayer) { var bestMove = -9999; for (var i = 0; i < newGameMoves.length; i++) { game.ugly_move(newGameMoves[i]); bestMove = Math.max(bestMove, minimax(depth - 1, game, !isMaximisingPlayer)); game.undo(); } return bestMove; } else { var bestMove = 9999; for (var i = 0; i < newGameMoves.length; i++) { game.ugly_move(newGameMoves[i]); bestMove = Math.min(bestMove, minimax(depth - 1, game, !isMaximisingPlayer)); game.undo(); } return bestMove; } }; 

Com o algoritmo minimax, nossa IA já começou a entender as táticas básicas do xadrez.

Minimax com profundidade de 2 (Fontes e o jogo aqui )

Vale ressaltar que a eficiência do algoritmo minimax aumenta com a profundidade da pesquisa. O próximo passo é responsável por isso.

Estágio 4. Clipe Beta Beta


Este é um método de otimização de algoritmo minimax que possibilita ignorar algumas ramificações na árvore de pesquisa. E isso permite aumentar a profundidade da pesquisa, gastando a mesma quantidade de recursos.

O recorte alfa beta é baseado em uma situação em que podemos parar de avaliar uma ramificação específica, se for constatado que uma nova ação levará a uma situação pior do que a que vimos ao avaliar a anterior.

A otimização não afeta o resultado do minimax, mas tudo começa a funcionar mais rapidamente.

Esse algoritmo é muito mais eficiente se você verificar primeiro os caminhos que levam a boas jogadas.


A imagem mostra movimentos desnecessários ao usar o recorte alfa beta.

Como você pode ver, com o recorte alfa-beta, o minimax é otimizado e muito significativamente.


O número de posições que você deseja avaliar no caso de uma pesquisa com profundidade de 4 e a posição inicial, mostrada acima. (fonte e jogo estão disponíveis aqui )

Etapa 5. Função de avaliação aprimorada


A função de avaliação inicial é bastante simples, porque simplesmente conta os pontos das peças no tabuleiro. Para otimizar, você pode levar em consideração a posição das figuras. Por exemplo, se você colocar o cavalo no centro do tabuleiro, ele se tornará mais caro - o leque de movimentos disponíveis para esta peça se expandirá.

Neste ponto, trabalharemos com uma versão ligeiramente modificada das tabelas quadradas originalmente descritas no wiki de programação de xadrez .



E agora nosso algoritmo já está jogando muito bem, é claro, comparado ao jogador médio.


Fontes e jogos estão disponíveis aqui.

Conclusão


A vantagem do algoritmo proposto é que ele não comete erros muito estúpidos. Obviamente, a estratégia aqui dificilmente pode ser considerada perfeita, mas mesmo assim.

A implementação do nosso algoritmo é de apenas 200 linhas de código, portanto os princípios básicos são bastante simples. A versão final do programa pode ser <a href= target github.com/lhartikk/simple-chess-ai'> vista no GitHub.

Outros módulos podem ser adicionados ao algoritmo, incluindo:



Mais sobre algoritmos de xadrez podem ser encontrados no Wiki de programação de xadrez .

A Skillbox recomenda:

Source: https://habr.com/ru/post/pt437524/


All Articles