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ó (n0 de Jogadas)
1
9
9x8
9x8x7
9x8x7x6
9x8x7x6x5
9x8x7x6x5x4
9x8x7x6x5x4x3
9x8x7x6x5x4x3x2
9x8x7x6x5x4x3x2x1
Nível
1
2
3
4
5
6
7
8
9
10
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.
Download

Implementação dos Algoritmos Minimax e AlfaBeta aplicados ao