Existe um algoritmo desse tipo em que, se obtivesse infinito poder de processamento, um computador pudesse jogar xadrez perfeitamente para nunca perder?
Em caso afirmativo, onde posso encontrar pseudo-código para ele?
Existe um algoritmo desse tipo em que, se obtivesse infinito poder de processamento, um computador pudesse jogar xadrez perfeitamente para nunca perder?
Em caso afirmativo, onde posso encontrar pseudo-código para ele?
Respostas:
Existe um algoritmo? Sim. De acordo com o Teorema de Zermelo , existem três possibilidades para um jogo de dois jogadores com informações perfeitas determinísticas finitas, como o xadrez: ou o primeiro jogador tem uma estratégia vencedora, ou o segundo jogador tem uma estratégia vencedora, ou qualquer um pode forçar um empate. Ainda não sabemos o que é o xadrez. (Damas, por outro lado, foi resolvido : qualquer jogador pode forçar um empate.)
Conceitualmente, o algoritmo é bastante simples: construa uma árvore de jogo completa , analise os nós das folhas (as posições finais do jogo) e faça o movimento inicial vencedor, renuncie ou ofereça um empate.
O problema está nos detalhes: existem aproximadamente 10 43 posições possíveis e um número ainda maior de movimentos (a maioria das posições pode ser alcançada de mais de uma maneira). Você realmente precisa do seu computador infinitamente poderoso para tirar proveito disso, pois um computador que pode tirar proveito desse algoritmo não pode se encaixar no universo conhecido ou não terminará a computação até que o universo acabe.
Veja https://en.wikipedia.org/wiki/Endgame_tablebase .
Com o poder infinito do computador, poderia-se construir uma mesa para a posição inicial e resolver o xadrez .
Na prática, apenas posições com até sete "homens" (peões e peças, contando os reis) foram resolvidas usando os supercomputadores atuais, por isso estamos muito longe de resolver o xadrez. A complexidade do problema aumenta exponencialmente com o número de peças.
Se você realmente tivesse um poder infinito de processamento, esse algoritmo seria realmente trivial para escrever. Como o xadrez tem um número finito de estados possíveis, você poderia, em teoria, percorrer todos eles até encontrar um caminho de jogo perfeito. Seria terrivelmente ineficiente, mas se você tiver um poder infinito de processamento, isso não importaria.
Para abordar diretamente a questão: sim, existe um algoritmo desse tipo. É chamado minimax. (As bases de tabela do final de jogo são geradas usando esse algoritmo (para trás!), Mas o algoritmo simples e minimax simples e antigo é tudo o que você precisa). Esse algoritmo pode jogar perfeitamente qualquer jogo com soma zero de dois jogadores. Encontre o pseudocódigo aqui:
https://en.wikipedia.org/wiki/Minimax
observe que variantes desse algoritmo são usadas por programas modernos de xadrez por computador.
Não apenas existe um algoritmo para jogar xadrez perfeito, como também é possível escrever um programa curto que (com recursos infinitos) reproduzirá perfeitamente qualquer jogo determinístico de dois jogadores com duração perfeita e conhecimento perfeito determinístico .
O mecanismo do jogo nem precisa saber as regras do jogo que está sendo jogado. Tudo o que precisa é de uma representação opaca de um "estado do jogo" e funcione que (a) dado qualquer estado do jogo, forneça uma lista dos próximos estados legais do jogo e (b) dado um estado do jogo, decida se é uma vitória para o jogador 1 , uma vitória para o jogador 2, um empate ou não é um estado final.
Dadas essas funções, um simples algoritmo recursivo "resolve" o jogo.
Esse fato foi mencionado nas respostas anteriores pelo chessprogrammer (minimax) e pelo Acccumulation (que fornece uma versão do programa em python).
Eu escrevi esse programa há mais de 20 anos. Eu testei jogando o jogo do galo, se você é americano. Com certeza, jogou um jogo perfeito.
É claro que isso cairá rapidamente em qualquer computador imaginável para qualquer jogo sério. Por ser recursivo, está efetivamente construindo toda a árvore do jogo na pilha, para que você tenha um "estouro de pilha" (trocadilho pretendido) antes de chegar perto da análise dos 10 ^ 123 estados de xadrez mencionados em outras respostas. Mas é divertido saber que, em princípio, esse pequeno programa faria o trabalho.
Para mim, isso também diz algo interessante sobre a IA: por mais que você pense que "inteligência" seja exibida por Deep Blue, ou Go Zero, ou mesmo por um ser humano jogando xadrez ou Go, há um sentido em que esses jogos têm um ideal trivial e exatamente computável soluções. O desafio é como obter uma solução boa, mas não ótima, em um tempo razoável.
Ignorarei as possibilidades de empates ou seqüências infinitas de movimentos por simplicidade. Uma vez que o algoritmo é entendido, não é particularmente difícil estendê-lo a esses casos.
Primeiro, algumas definições:
Qualquer jogada que ganha o jogo para o jogador que faz essa jogada é uma jogada vencedora.
Qualquer jogada que perde o jogo para o jogador que faz essa jogada é uma jogada perdida.
Qualquer jogada que deixe o outro jogador com pelo menos uma jogada vencedora também é uma jogada perdida. (Como o oponente pode fazer esse movimento e forçar uma perda.)
Qualquer jogada que deixe o outro jogador com apenas jogadas perdidas também é uma jogada vencedora. (Não importa que movimento seu oponente faça, você vencerá.)
Uma estratégia perfeita significa sempre fazer jogadas vencedoras, se houver, e renunciar quando houver apenas uma jogada perdida.
Agora, é trivial escrever uma estratégia perfeita. Simplesmente exploda todas as sequências de movimentos possíveis e identifique movimentos de vitória / derrota. Ignorando o impasse, isso acabará por identificar todos os movimentos como um movimento vencedor ou um movimento perdedor.
Agora, a estratégia é trivial. Veja todos os seus movimentos possíveis. Se alguma jogada vencedora permanecer, pegue uma e vença. Se apenas os movimentos perdedores permanecerem, renuncie, pois seu oponente pode forçá-lo a perder.
Não é difícil ajustar a estratégia para incluir a possibilidade de um impasse.
Atualização : Caso não esteja claro como isso identifica cada jogada como uma jogada vencedora ou perdida, considere:
n
o número de jogadas no jogo de xadrez mais longo possível. Por enquanto, estamos ignorando sequências ilimitadas, embora não seja difícil incluí-las.n
movimentos anteriores que precisamos considerar.n-1
jogadas anteriores é uma jogada vencedora ou uma jogada perdida, pois as n
jogadas terminam o jogo mais longo.n-2
é seguido apenas por movimentos vencedores ou perdidos e, portanto, é um movimento vencedor ou perdedor.1. d4
com ...resigns
?
Suponha que você tem três funções: win_state
, get_player
, e next_states
. A entrada para win_state
é um estado de jogo e a saída é -1 se o branco estiver no xeque-mate, 0 se for um empate, 1 se o preto estiver no xeque-mate e, None
caso contrário. A entrada para get_player
é um estado do jogo e a saída é -1 se for a vez do preto e 1 se for a vez do branco. A entrada para next_states
é uma lista dos possíveis próximos estados do jogo que podem resultar de uma jogada legal. Então, a função a seguir, quando receber um estado de jogo e um jogador, deve informar em que estado de jogo se mover para que esse jogador ganhe.
def best_state(game_state,player)
def best_result(game_state):
if win_state(game_state):
return(win_state)
else:
player = get_player(game_state)
return max([best_result(move)*player for move in next_states(game_state)])*player
cur_best_move = next_states(games_state)[0]
cur_best_outcome = -1
for state in next_states(game_state):
if best_result(state)*player > cur_best_outcome:
cur_best_outcome = best_result(state)*player
cur_best_move = state
return(best_move)
Sim. É fácil. Você nem precisa de poder de processamento infinito. Tudo o que você precisa é de uma mesa de consulta que contenha, para cada posição possível no tabuleiro, a melhor jogada para jogar nessa posição. Aqui está o pseudo-código:
def play-move(my-color, board-position):
return table-of-best-moves[my-color, board-position]
O único problema é que essa tabela de pesquisa teria que ser muito, muito grande - talvez maior que a galáxia da Via Láctea - e levaria muito tempo para construí-la - talvez mais do que a idade atual do universo, a menos que haja alguma regularidade desconhecida no xadrez que a torna muito mais simples do que podemos ver agora. Mas se você tivesse essa tabela de consulta, a sub-rotina para escolher uma jogada perfeita toda vez poderia ser implementada em apenas uma instrução da CPU.
Além disso, dado nosso conhecimento atual de xadrez, não há como ter certeza de que o jogo perfeito garante que você não perderá. Por exemplo, se o jogo perfeito garantir uma vitória para as brancas, as pretas perderão mesmo que as pretas joguem perfeitamente.