Como um computador joga xadrez?
Hikaru Nakamura, que recentemente desafiou um computador.Hámuito tempo que um computador venceu um homem no xadrez, agora os jogadores de xadrez mais fortes não conseguem vencer nem um laptop antigo. Agora, os mecanismos de xadrez são usados para analisar jogos, procurar novas opções e jogar por correspondência.Se você estiver interessado em saber como os mecanismos de xadrez são organizados, seja bem-vindo ao gato.1. Introdução
Uma vez eu tive certeza de que os programas de xadrez (eles também são motores, mas mais sobre isso depois) apenas lembram o grande número de jogos jogados, encontram a posição atual deles e fazem o movimento certo. Na minha opinião, eu li sobre isso em algum livro.Esta é sem dúvida uma opinião muito ingênua. Uma nova posição no xadrez pode ser obtida pelo décimo movimento. Embora haja menos posições no xadrez do que no movimento , no entanto, após 3 movimentos (um movimento é um movimento de branco e preto, um meio movimento é um movimento de apenas um lado) a árvore de movimentos consiste em quase 120 milhões de nós. Além disso, o tamanho da árvore depois de 14 meios movimentos da posição inicial foi considerado pelos entusiastas há mais de um ano, até agora tendo avançado em cerca de um terço.Eu também pensei que os programas de xadrez, apesar da longa datavencer a partida pelo campeão mundial ainda está ao alcance das melhores pessoas. Isso também não é verdade.Em uma mini-partida recente entre homem e máquina, Hikaru Nakamura , um dos jogadores de xadrez mais fortes do mundo, jogou com o Komodo , um dos (dois) programas de xadrez mais fortes do mundo. O programa foi lançado em um Xeon de 24 núcleos. Como as pessoas não podem mais competir em igualdade de condições com um computador, o grande mestre ganhou vantagem em cada um dos quatro jogos:- No primeiro jogo - um peão e uma jogada: o computador jogava preto e sem um peão f7
- No segundo - apenas um peão: o computador jogava branco sem um peão f2
- Na terceira qualidade (a diferença entre uma torre e uma peça de luz é estimada em cerca de 2 peões): um computador branco sem uma torre a1, um homem sem um cavaleiro b8 e uma torre a8 em seu lugar.
- No quarto - quatro movimentos: uma pessoa joga branco e, em vez do primeiro, ele faz 4 movimentos sem cruzar o meio do tabuleiro.
Houve algumas disputas em relação ao handicap - por exemplo, a ausência do peão-f enfraquece um pouco o rei, mas depois do jogo de castelos, a linha é aberta à torre. A ausência de um peão central provavelmente oferece uma vantagem maior. 4 movimentos dão uma boa vantagem posicional, mas se você fizer uma estréia fechada como a defesa do Velho Indiano, essa vantagem não será tão difícil de anular.Além disso, os jogos foram jogados com um controle de 45 "+15 ', ou seja, 45 minutos por jogo e 15 segundos de adiçãocada movimento. Geralmente, controles mais curtos dão uma vantagem adicional ao computador, enquanto os mais longos aumentam levemente as chances de uma pessoa. Mesmo em uma fração de segundo, o computador poderá varrer abertamente os movimentos perdidos, enquanto, devido ao crescimento exponencial da árvore de variantes, cada aprimoramento subsequente na análise leva mais tempo.No entanto, houve uma desvantagem e a pessoa perdeu no jogo 2.5-1.5, tendo empatado os 3 primeiros jogos e perdido o quarto. Ao mesmo tempo, o fraco grão-mestre venceu com bastante confiançacom um handicap de 2 peões. Portanto, a vantagem dos melhores programas sobre as melhores pessoas no momento está entre 1 e 2 peões do handicap. Obviamente, essa avaliação é muito grosseira, mas para uma avaliação precisa é necessário jogar milhares de jogos entre pessoas e programas, e dificilmente alguém fará isso. Observe que a classificação ELO, geralmente indicada para programas, não tem nada a ver com a classificação de pessoas.O que é um mecanismo de xadrez?
Para que uma pessoa possa jogar xadrez com um computador, além de realmente procurar a melhor jogada, você precisa de uma GUI. Felizmente, uma interface universal foi inventada (até duas, Winboard e UCI , mas a maioria dos mecanismos usa UCI) para comunicação entre a GUI e o próprio programa de xadrez (mecanismo). Assim, os programadores podem se concentrar no algoritmo do jogo de xadrez, sem pensar na interface. O outro lado da moeda é que a criação de uma GUI é muito mais chata do que escrever um mecanismo; então, as GUIs gratuitas perdem visivelmente as pagas. Ao contrário dos motores, onde o Stockfish gratuito está lutando com confiança pela primeira linha da classificação com o Komodo pago.Como eles ainda tocam?
Então, como funciona um mecanismo de xadrez moderno?Apresentação do Conselho
A base de qualquer mecanismo é a representação de um tabuleiro de xadrez. Antes de tudo, é necessário "explicar" ao computador todas as regras do xadrez e dar-lhe a oportunidade de manter a posição no xadrez. Sem isso, é impossível avaliar a posição e fazer movimentos.Existem duas maneiras principais de armazenar uma representação de um quadro - por formas ou células . No primeiro caso, armazenamos para cada peça seu lugar no tabuleiro, no segundo - pelo contrário, para cada célula armazenamos o que está lá. Cada método tem suas vantagens e desvantagens, mas no momento todos os principais mecanismos usam a mesma representação da placa - placa de bit.Bitboards
Felizmente, existem 64 células no tabuleiro de xadrez. Portanto, se usarmos um bit para cada célula, podemos armazenar a placa inteira em um número inteiro de 64 bits.Em uma variável, armazenaremos todas as peças brancas, em outra - todas as pretas e em outras 6 - cada tipo de figuras separadamente (outra opção são 12 painéis de bit para cada cor e tipo de figuras separadamente).Qual a vantagem dessa opção?O primeiro é a memória. Como aprendemos mais tarde, durante a análise, a representação do quadro é copiada muitas vezes e, consequentemente, a memória RAM diminui. Os painéis de bits são uma das representações mais compactas do tabuleiro de xadrez.Em segundo lugar, velocidade. Muitos cálculos, por exemplo, o cálculo de possíveis movimentos, se resumem a várias operações de bits. Por esse motivo, por exemplo, o uso da instrução POPCNT fornece ~ 15% de aceleração nos mecanismos modernos. Além disso, durante a existência de placas de bit, muitos algoritmos e otimizações foram inventados, como, por exemplo, placas de bits "mágicas" .Pesquisar
Minimax
No coração da maioria dos mecanismos de xadrez está o algoritmo de busca minimax ou sua modificação de não-max. Em resumo, descemos na árvore, avaliamos as folhas e depois subimos, cada vez que escolhemos o movimento ideal para o jogador atual, minimizando a pontuação de um (preto) e maximizando o segundo (branco). Daí o nome. Uma vez na raiz, temos uma sequência de movimentos ideal para ambos os jogadores. A diferença entre o minimax e o não-hamax é que, no primeiro caso, revezamos a escolha dos movimentos com as classificações máxima e mínima; no segundo, alteramos o sinal para todas as classificações e sempre escolhemos a máxima (entendemos de onde eles vieram). Mais detalhes aqui e aqui .Alpha beta
A primeira otimização é alfa beta . A idéia de alfa-beta é simples - se eu já tiver uma boa jogada, você poderá interromper movimentos obviamente piores. Considere o exemplo da imagem assustadora à esquerda. Suponha que o jogador A tenha 2 movimentos possíveis - a3 e b3. Após analisar o curso de a3, o programa recebeu uma classificação de +1,75. Começando a avaliar o movimento b3, o programa viu que o jogador B tem dois movimentos - a6 e a5. Avaliação do curso a6 +0.5. Como o jogador B escolhe um lance com uma pontuação mínima, ele não escolherá um lance com pontuação maior que 0,5, o que significa que a estimativa do lance b3 é menor que 0,5 e não faz sentido considerá-lo. Assim, a subárvore restante de b3 é cortada.Para recorte, armazenamos os limites superior e inferior - alfa e beta. Se durante a análise um movimento obtiver uma pontuação maior que beta, o nó atual será cortado. Se a pontuação for maior que alfa, o alfa será atualizado.Os nós no alfa beta são divididos em 3 categorias:- Nós PV - nós cuja avaliação caiu na janela (entre alfa e beta). A raiz e o nó mais à esquerda são sempre nós desse tipo.
- Nós de corte (ou nós com falha alta ) - nós nos quais ocorreu o corte beta.
- Todos os nós (ou nós com falha baixa ) - nós nos quais nenhuma movimentação excedeu o alfa de acordo com a avaliação.
Classificando movimentos
Ao usar alfa beta, a ordem dos movimentos se torna importante. Se pudermos colocar a melhor jogada em primeiro lugar, as demais jogadas serão analisadas muito mais rapidamente devido aos pontos de corte beta.Além de usar o hash e a melhor movimentação da iteração anterior, existem várias técnicas para classificar as movimentações.Para capturas, por exemplo, uma simples heurística MVV-LVA (vítima mais valiosa - agressor menos valioso) pode ser usada . Classificamos todas as capturas em ordem decrescente do valor da "vítima" e, por dentro, classificamos novamente em ordem crescente do valor do "agressor". Obviamente, geralmente é mais lucrativo pegar a rainha por peão do que vice-versa.Para movimentos “silenciosos”, é utilizado o método de movimentos “matadores” - movimentos que causavam corte beta. Esses movimentos geralmente são verificados imediatamente após os movimentos do hash e capturas.Tabelas de hash ou tabelas de permutação
Apesar do tamanho enorme da árvore, muitos nós nela são idênticos. Para não analisar a mesma posição duas vezes, o computador armazena os resultados da análise em uma tabela e cada vez verifica se já existe uma análise pronta dessa posição. Normalmente, essa tabela armazena o hash real da posição, classificação, melhor movimento e idade da classificação. É necessária idade para substituir as posições antigas ao preencher a tabela.Pesquisa iterativa
Como você sabe, se não pudermos analisar a árvore inteira completamente, o minimax precisará de uma função de avaliação. Depois de atingir uma certa profundidade, paramos a busca, avaliamos a posição e começamos a subir na árvore. Mas esse método requer uma profundidade predeterminada e não fornece resultados intermediários de alta qualidade.A pesquisa iterativa resolve esses problemas. Primeiro, analisamos a uma profundidade de 1, depois a uma profundidade de 2, etc. Assim, cada vez que descemos um pouco mais fundo do que na última vez, até a análise ser interrompida. Para reduzir o tamanho da árvore de pesquisa, os resultados da última iteração geralmente são usados para eliminar movimentos deliberadamente ruins na atual. Esse método é chamado de janela de aspiração e é usado universalmente.Pesquisa de Quiescência
Este método foi desenvolvido para combater o "efeito horizonte". Parar a pesquisa na profundidade certa pode ser muito perigoso. Imagine que paramos no meio da troca de rainhas - o branco levou a rainha negra e, no próximo passo, o preto deve escolher branco. Mas no momento no quadro - as brancas têm uma rainha extra e uma avaliação estática estará fundamentalmente errada.Para fazer isso, antes de fazer uma avaliação estática, verificamos todas as capturas (às vezes até damas) e descemos a árvore para uma posição em que não há capturas e damas possíveis. Naturalmente, se todas as capturas piorarem a estimativa, retornamos a estimativa da posição atual.Pesquisa seletiva
A idéia de uma pesquisa seletiva é levar mais tempo para considerar movimentos "interessantes" e menos para considerar desinteressantes. Para fazer isso, use extensões que aumentam a profundidade da pesquisa em determinadas posições e abreviações que reduzem a profundidade da pesquisa.A profundidade é aumentada no caso de capturas, damas, se o movimento for o único ou muito melhor que as alternativas ou se houver um peão passado.Recorte e corte
Com cortes e cortes, tudo é muito mais interessante. Eles podem reduzir significativamente o tamanho da árvore.Brevemente sobre recorte:- - — , . , , . , , , , .
- — , -. , , . (1-2).
- — , , . . PV . .
- Multi-Cut — M(, 6) C(, 3) Cut-node, .
- null- — null- ( ) , . , , , , .
Abreviações são usadas quando não temos tanta certeza de que o movimento é ruim e, portanto, não o cortamos, mas simplesmente reduzimos a profundidade. Por exemplo, razoring é uma abreviação, desde que a estimativa estática da posição atual seja menor que alfa.Devido à classificação de movimentos e cortes de alta qualidade, os motores modernos conseguem atingir um coeficiente de ramificação abaixo de 2 . Devido a isso, infelizmente, eles às vezes não percebem vítimas e combinações fora do padrão.NegaScout e PVS
Duas técnicas muito semelhantes que usam o fato de que depois de encontrarmos o nó PV (supondo que nossos movimentos sejam muito bem classificados), provavelmente não mudará, ou seja, todos os nós restantes retornarão uma classificação mais baixa que alfa. Portanto, em vez de pesquisar com uma janela de alfa para beta, pesquisamos com uma janela de alfa para alfa + 1, o que nos permite acelerar a pesquisa. Obviamente, se em algum nó obtivermos recorte beta, ele deverá ser reavaliado, já por uma pesquisa normal.A diferença entre os dois métodos está apenas na redação - eles foram desenvolvidos aproximadamente ao mesmo tempo, mas de forma independente e, portanto, são conhecidos sob nomes diferentes.Pesquisa paralela
A paralelização do alfa beta é um grande tópico separado. Vou abordá-lo brevemente, e quem se importa, confira a Pesquisa alfa-beta paralela em multiprocessadores de memória compartilhada . A dificuldade é que, com uma pesquisa paralela, muitos nós de corte são analisados antes que outro encadeamento encontre uma refutação (instala uma versão beta), enquanto em uma pesquisa seqüencial, com boa classificação, muitos desses nós seriam cortados.Lazy SMP
Um algoritmo muito simples. Apenas começamos todos os tópicos ao mesmo tempo com a mesma pesquisa. A comunicação dos fluxos ocorre devido à tabela de hash. O SMP preguiçoso mostrou-se inesperadamente eficaz, tanto que o Stockfish de ponta mudou para ele com o YBW. É verdade que alguns acreditam que a melhoria ocorreu devido à má implementação do YBWC e ao recorte agressivo demais, e não por causa da vantagem do Lazy SMP.Jovens irmãos esperam conceito (YBWC)
O primeiro nó (irmão mais velho) deve ser totalmente analisado, após o qual é iniciada uma análise paralela dos nós restantes (irmãos mais novos). A idéia é a mesma: o primeiro passo melhorará significativamente o alfa ou até permitirá que você corte todos os outros nós.Divisão Dinâmica de Árvores (DTS)
Algoritmo rápido e complexo. Um pouco sobre a velocidade: a velocidade da pesquisa é medida através de ttd (tempo em profundidade), ou seja, o tempo durante o qual a pesquisa atinge uma certa profundidade. Esse indicador geralmente pode ser usado para comparar o trabalho de diferentes versões de um mecanismo ou mecanismo executando em um número diferente de núcleos (embora o Komodo, por exemplo, aumente a largura da árvore com mais núcleos disponíveis). Além disso, durante a operação, o mecanismo exibe a velocidade de pesquisa em nps (nós por segundo). Essa métrica é muito mais popular, mas não permite que nem o mecanismo se compare a si mesmo. O SMP preguiçoso, no qual não há sincronização, aumenta quase linearmente os nps, mas devido à grande quantidade de trabalho desnecessário, seu ttd não é tão impressionante. Enquanto para DTS, nps e ttd mudam quase o mesmo .Para ser sincero, ainda não consegui descobrir completamente esse algoritmo, que, apesar de sua alta eficiência, é usado literalmente em dois motores. Para quem é muito interessante, siga o link acima.Classificação
Então, atingimos a profundidade necessária, fizemos uma busca pela calma e, finalmente, precisamos avaliar a posição estática.O computador avalia a posição em peões: +1,0 significa que as brancas têm uma vantagem igual a 1 peão, -0,5 significa que as pretas têm uma vantagem de meio peão. O tapete é estimado em 300 peões, e a posição na qual o número de movimentos para o tapete x é conhecido é em (300-0,01x) peões. +299,85 significa que as brancas combinam em 15 jogadas. Nesse caso, o próprio programa geralmente opera com estimativas inteiras em centipes (1/100 peões).Quais parâmetros o computador leva em consideração ao avaliar uma posição?Material e mobilidade
A coisa mais simples. A rainha tem 9-12 peões, a torre 5-6, o cavaleiro e o bispo 2,5-4 e o peão, respectivamente, um peão. Em geral, o material é uma heurística digna para avaliar uma posição e qualquer vantagem posicional geralmente se transforma no final em uma material.A mobilidade é considerada simples - o número de movimentos possíveis na posição atual. Quanto mais deles, mais móvel o exército do jogador.Tabelas de posição de forma
O cavaleiro no canto do tabuleiro geralmente é ruim, os peões mais próximos da retaguarda inimiga estão se tornando mais valiosos e assim por diante. Para cada figura, uma tabela de bônus e penalidades é compilada dependendo da sua posição no tabuleiro.Estrutura do peão
- Peões duplos - dois peões na mesma vertical. Muitas vezes, é difícil protegê-los com outros peões, é considerado uma fraqueza.
- — , . , .
- — , . ,
- — , . , .
Todos os parâmetros acima afetam a avaliação do jogo de maneiras diferentes, dependendo da fase do jogo. Na abertura, não há sentido no peão passado, mas no final do jogo você precisa trazer o rei para o centro do tabuleiro, e não se esconder atrás dos peões.Portanto, muitos mecanismos têm uma classificação separada para o final do jogo e a estreia. Eles avaliam a fase do jogo dependendo do material restante no tabuleiro e, de acordo com isso, consideram a classificação - quanto mais próximo do final do jogo, menos influências na pontuação de abertura e mais final de jogo.Outros
Além desses fatores básicos, os motores podem adicionar outros fatores à avaliação - por exemplo, a segurança do rei, peças trancadas, ilhas de penhor, controle do centro etc.Classificação precisa ou pesquisa rápida?
Disputa tradicional: o que é mais eficaz, avalie com precisão a posição ou alcance maior profundidade de pesquisa. A experiência mostrou que funções de avaliação excessivamente "pesadas" são ineficazes. Por outro lado, uma avaliação mais detalhada, levando em consideração mais fatores, geralmente leva a um jogo mais "bonito" e "agressivo".Livros de estreia e tabelas de final de jogo
Livros de estreia
No início do xadrez do computador, os programas tiveram um desempenho muito fraco na abertura. A estréia geralmente requer decisões estratégicas que afetarão o jogo inteiro. Por outro lado, a teoria da abertura foi bem desenvolvida nas pessoas, a abertura foi repetidamente analisada e reproduzida a partir da memória. Portanto, uma "memória" semelhante foi criada para computadores. A partir da posição inicial, uma árvore de movimentos foi construída e cada movimento foi avaliado. Durante o jogo, o mecanismo simplesmente escolheu um dos movimentos "bons" com uma certa probabilidade.Desde então, os livros de estreia cresceram, muitas estreias são analisadas usando computadores até o final do jogo. Não há necessidade deles, motores fortes aprenderam a jogar a estréia, mas estão deixando as linhas principais rapidamente.Tabelas de final de jogo
Voltar para a introdução. Lembre-se da idéia de armazenar muitas posições na memória e escolher a correta. Lá está ela. Para um número pequeno (até 7) de números, todas as posições existentes são calculadas. Ou seja, nessas posições o computador começa a jogar perfeitamente, ganhando no número mínimo de jogadas. Menos - o tamanho e o tempo de geração. A criação dessas tabelas ajudou no estudo dos jogos finais.Geração de tabela
Geramos todas as posições possíveis (considerando a simetria) com um determinado conjunto de formas. Entre eles, encontramos e designamos todas as posições em que o tapete está parado. No próximo passe, indicamos todas as posições em que você pode entrar em posições com um tapete - nessas posições, um tapete é colocado em 1 turno. Assim, encontramos todas as posições com um companheiro 2,3,4, 549 movimentos. Em todas as posições não marcadas - um empate.Nalimov Tables
As primeiras tabelas de final de jogo publicadas em 1998. Para cada posição, o resultado do jogo e o número de jogadas no tatame com um jogo ideal são armazenados. O tamanho de todas as terminações de seis dígitos é de 1,2 terabytes.Mesas Lomonosov
Em 2012, todos os finais de sete dígitos (exceto 6 versus 1) foram contados no supercomputador Lomonosov na Universidade Estadual de Moscou . Essas bases estão disponíveis apenas por dinheiro e essas são as únicas tabelas completas de sete dígitos para final de jogo.Syzygy
O padrão de fato. Essas bases são muito mais compactas que as bases de Nalimov. Eles consistem em duas partes - WDL (Win Draw Lose) e DTZ (Distância para zerar). Os bancos de dados WDL destinam-se ao uso durante a pesquisa. Uma vez que o nó da árvore é encontrado na tabela, temos o resultado exato do jogo nesta posição. As DTZ destinam-se ao uso na raiz - armazenam o número de movimentos em um contador nulo dos movimentos (movimento por peão ou captura). Assim, as bases WDL são suficientes para análise e as bases DTZ podem ser úteis na análise de jogos finais. Syzygy é muito menor - 68 gigabytes para WDL de seis dígitos e 83 para DTZ. Não existem bases de sete dígitos, pois sua geração requer aproximadamente terabytes de RAM.Use
As tabelas de final de jogo são usadas principalmente para análise, o aumento da força dos motores de jogo é pequeno - 20-30 pontos ELO . No entanto, como a profundidade de pesquisa dos mecanismos modernos pode ser muito grande, as consultas para bases de final de jogo da árvore de pesquisa ainda ocorrem na estreia.Outro interessante
Girafa ou redes neurais jogam xadrez
Alguns de vocês já devem ter ouvido falar de um mecanismo de xadrez em redes neurais que atingiu o nível de IM (o que, como entendemos na introdução, não é tão legal para o mecanismo). Foi escrito e postado no Bitbucket por Matthew Lai, que infelizmente parou de trabalhar porque começou a trabalhar no Google DeepMind .Parâmetros de ajuste
Não é difícil adicionar um novo recurso ao mecanismo, mas como posso verificar se ele deu amplificação? A opção mais simples é jogar vários jogos entre as versões antiga e nova e ver quem ganha. Mas se a melhoria for pequena, e geralmente acontece depois que todos os principais recursos foram adicionados, deve haver vários milhares de jogos, caso contrário não haverá confiabilidade.Stockfish
Muitas pessoas estão trabalhando nesse mecanismo, e cada uma de suas idéias precisa ser verificada. Com a força atual do mecanismo, cada melhoria aumenta um par de pontos de classificação, mas no final, um crescimento constante de várias dezenas de pontos é obtido anualmente.Sua solução é típica do código aberto - os voluntários fornecem seu poder para conduzir centenas de milhares de jogos a eles.CLOP
Um programa que otimiza parâmetros por meio de regressão linear usando os resultados de jogos de mecanismo com diferentes parâmetros. Das desvantagens - um tamanho de tarefa muito limitado: para otimizar cem parâmetros (um número completamente adequado para o mecanismo), não é possível, pelo menos por um tempo adequado.Afinação de Texel
Resolve o problema do método anterior. Assumimos um grande número de posições (o autor ofereceu 9 milhões de posições em 64.000 jogos, eu tirei 8 milhões em quase 200.000), para cada uma delas salvamos o resultado do jogo (as brancas venceram 1, empate 0.5, derrotaram 0). Agora minimizamos o erro, que é a soma dos quadrados da diferença do resultado e o sigmóide da estimativa. O método é eficaz e popular, mas não funciona em todos os mecanismos.Ajuste do bacalhau
Outra técnica do líder. Pegamos um parâmetro igual a x e comparamos (em várias dezenas de milhares de lotes) o mecanismo com um parâmetro igual a x-sigma e x + sigma. Se o mecanismo com um parâmetro grande vencer, mova-o um pouco para cima, caso contrário - um pouco para baixo e repita.Competições de motores
De todos os testes de competição realizados, eu gostaria de distinguir separadamente o TCEC . Difere de todos os outros em seu hardware poderoso, seleção cuidadosa de aberturas e controle longo. Na última final, 100 jogos foram disputados em 2 x Intel Xeon E5-2690v3 com 256 gigabytes de RAM com controle de 180 '+ 30 ". Nessas condições, o número de empates era enorme e apenas 11 eram eficazes.Conclusão
Então, brevemente neste longo artigo, falei sobre a estrutura dos motores de xadrez. Muitos detalhes não foram divulgados, simplesmente não sabia de algo ou esqueci de dizer. Se você tiver alguma dúvida, escreva-a nos comentários. Além disso, aconselhamos dois recursos que você provavelmente notou se abriu cuidadosamente todos os links espalhados por todo o artigo:Source: https://habr.com/ru/post/pt390821/
All Articles