Implementação dos Algoritmos Minimax e AlfaBeta aplicados ao Jogo da Velha Autores: Rafael Renato Introdução • • • • • Definição do Problema Análise dos Algoritmos Implementação Resultados Discussão Definição do Problema • Jogo com adversário • Definir – Estado Inicial – Grupo de Operadores – Teste de terminação – Função Utilidade O Jogo • Estado Inicial – posição atual e uma indicação do próximo estado • 06 casas vazias a serem preenchidas intercaladamente • Grupo de Operadores – movimentos aceitos pelas regras, que o jogador pode fazer • Marcar um ´X´ (jogador A) ou um ´0´ (jogador B) em qualquer casa vazia • Teste de Terminação – define quando o jogo terminou e se houve um ganhador • Termina quando uma linha, coluna ou diagonal está totalmente preenchida por ´X` ou ´0´ • Função Utilidade – analisa quantitativamente uma jogada através de pesos • +1 , 0, -1 respectivamente, ganhar, empatar e perder Árvore de Decisão Nível 1 Nível 1 2 3 4 5 6 7 8 9 10 Nó (n0 de Jogadas) 1 9 9x8 9x8x7 9x8x7x6 9x8x7x6x5 9x8x7x6x5x4 9x8x7x6x5x4x3 9x8x7x6x5x4x3x2 9x8x7x6x5x4x3x2x1 Resultado 1 9 72 504 3.024 15.120 60.480 181.440 362.880 362.880 986.410 X X X X X Nível 2 X X 0 0 0 X X 0 0 0 Nível 10 MINIMAX 1 2 2 MIN 3 4 6 5 7 1 MAX 1 2 MAX 7 4 8 2 MAX 2 1 5 6 7 MIN 3 MAX 7 1 8 2 1 C.T. = O(b**d) onde b é o Fator de Ramificação e d é a profundidade da árvore 2 MAX 2 1 5 6 4 MIN 3 MAX 7 C.E. = O(b*d) 2 7 1 8 AlfaBeta 2 1 2 2 4 2 6 1 2 B 3 5 7 1 A A 7 8 A <=1 2 4 B 3 A 6 5 7 2 7 1 8 Implementação • • • • • • • • • • • seleciona_algoritmo – permite que se escolha qual o algoritmo a ser executado jogada_humana – a inserção dos valores escolhidos pelo humano no programa jogada_maquina – o valor que a máquina escolheu inicializa – a inicialização do algoritmo teste_terminacao – a verificação se a última jogada levou a um ganhador ou a um empate imprime – impressão de cada uma das matrizes para orientação gráfica do humano imprime_vencedor – impressão das mensagens de quem foi o ganhador ou se deu empate (velha) gerar_filhos – a cada jogada é necessário calcular os filhos a paritr daquele nó para fazer a execução dos algoritmos MINIMAX ou ALFABETA avaliacao – verifica se nas folhas o resultado foi 1(´0´ – a máquina ganhou) -1(´X´ – o humano ganhou) ou 0 (empate – deu velha) apagar_filhos – a cada jogada temos que apagar os filhos e recomeçar copia - Está função copia a matriz de jogo de um nó para outro com o intuito de propagar uma jogada Exemplo da Implementação Resultados • Foram realizados 09 testes com o algoritmo MINIMAX e 02 com o algoritmo AlfaBeta Teste 1 MM Teste 1 Jogadas 1a – Humano 0/0 2a – Máquina 1/1 3a – Humano 2/2 4a – Máquina 0/1 5a – Humano 2/1 6a – Máquina 2/0 7a – Humano 0/2 8a – Máquina 1/2 9a – Humano 1/0 10a – Final - Velha 1 3 2 59.704 X X 4 1.052 X X 0 0 0 0 X 5 X X 0 X 7 6 46 0 0 X 0 X X 9 X 0 X X 0 0 0 X X X 0 X X 0 X 0 X X 0 8 4 0 X 0 0 X X Teste 2 MM 1 549.945 Teste 2 Jogadas 0 3 7.331 0 2 0 0 X 1a – Máquina 0/0 2a – Humano 1/1 3a – Máquina 0/1 4a – Humano 0/2 5a – Máquina 2/0 6a – Humano 1/0 7a – Máquina 1/2 8a – Humano 2/1 9a – Máquina 2/2 10a – Final - Velha 5 0 0 0 0 X X X 0 X 0 0 X X 0 0 X 0 8 13 0 0 X 0 0 X X X 0 X X 0 0 X 0 1 X X X 7 6 9 0 X 197 0 X 0 4 Teste 3 MM Teste 3 1 Jogadas 1a – Humano 1/1 2a – Máquina 0/0 3a – Humano 1/2 4a – Máquina 1/0 5a – Humano 2/0 6a – Máquina 0/2 7a – Humano 0/1 8a – Máquina 2/1 9a – Humano 2/2 10a – Final - Velha 0 0 X 5 0 X X X 0 X X 6 0 4 830 0 X 0 3 2 55.504 X X 0 X 0 0 X X X 0 X X X 7 48 8 4 0 0 X 0 0 X 0 X 0 X X 0 X X X 0 X 9 0 Teste 4 MM Teste 4 Jogadas 1a – Máquina 0/0 2a – Humano 2/2 3a – Máquina 0/2 4a – Humano 0/1 5a – Máquina 2/0 6a – Humano 1/0 E 1/1 7a – Máquina 1/1 8a – Final – Máquina Ganhou 1 549.945 0 3 7979 2 0 0 0 X 5 257 0 X 0 0 X 0 X 0 X 0 0 X 0 0 X 0 X 7 11 X 0 0 X 6 4 0 X Teste 5 MM Teste 5 1 Jogadas X 1a – Humano 0/1 2a – Máquina 0/0 3a – Humano 2/2 4a – Máquina 1/1 5a – Humano 1/0 6a – Máquina 0/2 7a – Humano 2/0 8a – Máquina 2/1 9a – Humano 1/2 10a – Final - Velha 2 0 3 63.904 X 0 1.456 4 X 0 X 0 X 5 6 60 0 0 X 0 X X 0 X 0 X X 9 0 X 0 X 0 X X 0 X X 7 0 X X 0 X 8 0 X 0 X X 0 X 0 4 0 X 8 Teste 6 MM 1 Teste 6 0 3 2 549.945 0 0 7.979 0 0 0 X Jogadas 1a – Máquina 0/0 2a – Humano 2/2 3a – Máquina 0/2 4a – Humano 1/1 5a – Máquina 0/1 6a – Final – Máquina Ganhou 4 X 5 0 173 0 0 X X X X Teste 7 MM 1 Teste 7 3 2 63.904 0 0 0 X X X 4 1.456 0 Jogadas X – Humano 1/0 – Máquina 0/0 3a – Humano 2/2 4a – Máquina 0/2 5a – Humano 0/1 6a – Máquina 1/1 7a – Humano 2/0 8a – Máquina 2/1 9a – Humano 1/2 10a – Final - Velha 1a X 2a 5 0 X 7 6 0 X 0 60 X 0 0 X X 0 X 0 X X 9 0 X 0 X 0 X X 0 X X X 0 X 8 4 0 X 0 X 0 X 0 X 8 Teste 8 MM 1 549.945 Teste 8 0 3 7.979 2 0 0 0 4 0 X 0 Jogadas 1a – Máquina 0/0 2a – Humano 2/2 3a – Máquina 0/2 4a – Humano 0/1 5a – Máquina 2/0 6a – Humano 1/0 E 1/1 7a – Máquina 1/0 8a – Final – Máquina Ganhou X 5 257 0 X 0 X X 0 X 0 X 7 10 0 0 0 0 X 6 0 0 X X 0 X Teste 9 MM Teste 9 1 2 X 0 X 6 0 X 0 X 0 X 5 X 0 X 9 X 0 X X 0 0 0 X X X 7 46 X 0 X 0 0 X 1.052 4 X Jogadas 1a – Humano 2/2 2a – Máquina 1/1 3a – Humano 0/0 4a – Máquina 0/1 5a – Humano 2/1 6a – Máquina 2/0 7a – Humano 0/2 8a – Máquina 1/2 9a – Humano 1/0 10a – Final - Velha 3 59.704 0 8 X X 0 X 0 X X 0 4 0 X 0 0 X X Teste 1 AB Teste 1 Jogadas 1a – Humano 0/0 2a – Máquina 1/1 3a – Humano 2/2 4a – Máquina 0/1 5a – Humano 2/1 6a – Máquina 2/0 7a – Humano 0/2 8a – Máquina 1/2 9a – Humano 1/0 10a – Final - Velha 1 2 X 3 3.463 X X X 0 432 4 0 0 0 X 5 X 6 0 X 0 X 7 44 0 X 0 X X 9 X 0 X X 0 0 0 X X X 0 8 X X 0 X 0 X X 0 4 0 X 0 0 X X Teste 2 AB Teste 2 Jogadas 1a – Máquina 0/0 2a – Humano 1/1 3a – Máquina 0/1 4a – Humano 0/2 5a – Máquina 2/0 6a – Humano 1/0 7a – Máquina 1/2 8a – Humano 2/1 9a – Máquina 2/2 10a – Final - Velha 1 25.226 0 3 1.193 2 0 0 0 X 0 X X 0 0 0 0 X X 0 X 0 0 X X X 0 0 X 0 X 11 0 0 X 0 0 X X X 0 X X 0 0 X 0 1 X 7 6 9 0 X 5 93 0 4 8 Discussão • Baseados no resultado dos testes realizados podemos ver que o algoritmo ALFABETA tem expansões muito menores do que o algoritmo MINIMAX (ALFABETA = 25.256, quando a máquina inicia, contra MINIMAX = 549.945 o que nos dá uma ordem de grandeza 20 vezes maior, e ALFABETA = 3.463, quando o humano inicia, contra MINIMAX = 59.704 o que nos dá uma ordem de grandeza 17 vezes maior.) • Um valor que resultou diferente da análise teórica foi, quando a máquina inicia (MINIMAX = 549.945), pois este valor deveria ter dado 986.410. A explicação para esta discrepância vem do fato do algoritmo MINIMAX estar cortando a continuação da geração dos filhos quando algum jogador ganha, não chegando ao nível 10, mas parando no nível 7 ou 5 como visto nos resultados “teste 6” e “teste 8”. • Outra análise que podemos fazer é que o jogo da velha tem simetria em torno de algumas posições, portanto não haveria necessidade de se expandir todos os ramos pois estes são simétricos e, utilizando técnicas de álgebra linear tais como rotação e translação, poderíamos chegar ao resultado sem ocupar tanta memória. Este fato pode ser visto comparando os testes 7 e 5 (MINIMAX) e 1 e 10 (MINIMAX), neles podemos ver que no teste 7 a jogada 4/5/6 é invertida do teste 5, jogada 4/5/6, e o resto das posições é igual. O mesmo ocorre para o teste 1 e 10 nas jogadas 1/2/3.