TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
Procuras Adversas, Teste Jogo Em Linha

Execução de exemplo com base no problema do Jogo Em Linha, uma generalização do Jogo do Galo. Pode acompanhar o teste executando as ações localmente.

No Visual Studio, selecione o projeto TProcuraAdversa, e execute. No Linux na pasta .../TProcura/Adversa/Teste$ execute make seguido de ./bin/Release/TProcuraAdversa

Sumário

┌─ Teste TProcuraAdversa ──────┐
│ 1 - Jogo do Galo             │
│ 2 - Jogo Em Linha            │
└──────────────────────────────┘
Opção:  2

Este jogo tem várias instâncias, com as dimensões e tamanho da linha para ganhar. Existe ainda a variante em que as peças caem pela ação da gravidade.

Ação 1 - Ver instâncias

Vamos entrar no Jogo Em Linha, insira: 2.

Jogo Em Linha
┌─ ⚙ Parâmetros ──────────────────────────────────────────────────────
│ P1(ALGORITMO): MiniMax alfa/beta | P2(NIVEL_DEBUG): NADA | P3(SEMENTE): 1
│ P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 0 | P6(VER_ACOES): 4 | P7(LIMITE): 0
│ P8(ESTADOS_REPETIDOS): ignorar | P10(RUIDO_HEURISTICA): 0 | P11(BARALHAR_SUCESSORES): 0
│ P12(ORDENAR_SUCESSORES): 2 | P13(PODA_HEURISTICA): 0 | P14(PODA_CEGA): 0
│ P15(HEUR_BASE): 200
└──────────────────────────────────────────────────────────────────────
 │ 3 em Linha (3x3)
 │    A B C
 │  1 . . . 1 
 │  2 . . . 2 
 │  3 . . . 3 
 │    A B C
┌─ ☰ Menu ─────────┬────────────────┬─────────────────────┬──────────────┐
│ 1 📄   Instância  │ 2 🔍  Explorar │ 3 ⚙   Parâmetros    │ 4 ✔  Solução │
│ 5 ⚖   Indicadores │ 6 ►   Executar │ 7 🛠️  Configurações │ 8 🧪  Teste  │
└───────────────────┴────────────────┴─────────────────────┴──────────────┘
Opção: 

O primeiro jogo é o Jogo do Galo, em que se tem de fazer 3 em linha, num tabuleiro de 3x3. Vamos ver outras instâncias.

Insira:

  • 1; 2. jogo 4 em Linha (4x4)
  • 1; 3. jogo 4 em Linha (6x4)
  • 1; 4. jogo 4 em Linha (7x6) gravidade
  • 1; 5. jogo 4 em Linha (14x6) gravidade
  • 1; 6. jogo 5 em Linha (8x8)
  • 1; 7. jogo 5 em Linha (12x8)
  • 1; 8. jogo 5 em Linha (9x9)
  • 1; 9. jogo 6 em Linha (11x9)
  • 1; 10. jogo 6 em Linha (12x12)

4 em Linha (5x5)
   A B C D E
 1 . . . . . 1 
 2 . . . . . 2 
 3 . . . . . 3 
 4 . . . . . 4 
 5 . . . . . 5 
   A B C D E
_______________________________________________________________________________
4 em Linha (6x5)
   A B C D E F
 1 . . . . . . 1 
 2 . . . . . . 2 
 3 . . . . . . 3 
 4 . . . . . . 4 
 5 . . . . . . 5 
   A B C D E F
_______________________________________________________________________________
4 em Linha (7x6) gravidade
   A B C D E F G
 1 . . . . . . . 1 
 2 . . . . . . . 2 
 3 . . . . . . . 3 
 4 . . . . . . . 4 
 5 . . . . . . . 5 
 6 . . . . . . . 6 
   A B C D E F G
_______________________________________________________________________________
4 em Linha (14x6) gravidade
   A B C D E F G H I J K L M N
 1 . . . . . . . . . . . . . . 1 
 2 . . . . . . . . . . . . . . 2 
 3 . . . . . . . . . . . . . . 3 
 4 . . . . . . . . . . . . . . 4 
 5 . . . . . . . . . . . . . . 5 
 6 . . . . . . . . . . . . . . 6 
   A B C D E F G H I J K L M N
_______________________________________________________________________________
5 em Linha (12x8) gravidade
   A B C D E F G H I J K L
 1 . . . . . . . . . . . . 1 
 2 . . . . . . . . . . . . 2 
 3 . . . . . . . . . . . . 3 
 4 . . . . . . . . . . . . 4 
 5 . . . . . . . . . . . . 5 
 6 . . . . . . . . . . . . 6 
 7 . . . . . . . . . . . . 7 
 8 . . . . . . . . . . . . 8 
   A B C D E F G H I J K L
_______________________________________________________________________________
5 em Linha (12x8)
   A B C D E F G H I J K L
 1 . . . . . . . . . . . . 1 
 2 . . . . . . . . . . . . 2 
 3 . . . . . . . . . . . . 3 
 4 . . . . . . . . . . . . 4 
 5 . . . . . . . . . . . . 5 
 6 . . . . . . . . . . . . 6 
 7 . . . . . . . . . . . . 7 
 8 . . . . . . . . . . . . 8 
   A B C D E F G H I J K L
_______________________________________________________________________________
5 em Linha (9x9)
   A B C D E F G H I
 1 . . . . . . . . . 1 
 2 . . . . . . . . . 2 
 3 . . . . . . . . . 3 
 4 . . . . . . . . . 4 
 5 . . . . . . . . . 5 
 6 . . . . . . . . . 6 
 7 . . . . . . . . . 7 
 8 . . . . . . . . . 8 
 9 . . . . . . . . . 9 
   A B C D E F G H I
_______________________________________________________________________________
6 em Linha (11x9)
   A B C D E F G H I J K
 1 . . . . . . . . . . . 1 
 2 . . . . . . . . . . . 2 
 3 . . . . . . . . . . . 3 
 4 . . . . . . . . . . . 4 
 5 . . . . . . . . . . . 5 
 6 . . . . . . . . . . . 6 
 7 . . . . . . . . . . . 7 
 8 . . . . . . . . . . . 8 
 9 . . . . . . . . . . . 9 
   A B C D E F G H I J K
_______________________________________________________________________________
6 em Linha (12x12)
   A B C D E F G H I J K L
 1 . . . . . . . . . . . . 1 
 2 . . . . . . . . . . . . 2 
 3 . . . . . . . . . . . . 3 
 4 . . . . . . . . . . . . 4 
 5 . . . . . . . . . . . . 5 
 6 . . . . . . . . . . . . 6 
 7 . . . . . . . . . . . . 7 
 8 . . . . . . . . . . . . 8 
 9 . . . . . . . . . . . . 9 
10 . . . . . . . . . . . . 10 
11 . . . . . . . . . . . . 11 
12 . . . . . . . . . . . . 12 
   A B C D E F G H I J K L
_______________________________________________________________________________

Temos diferentes tabuleiros, resultando em ramificações distintas. A variante da gravidade, reduz consideravelmente a ramificação.

Ação 2 - Heurística

Vamos começar por verificar se a heurística implementada, que tem em atenção aspetos mínimos, como bloquear ameaças de vitória a uma jogada. Queremos procurar maximizar as ameaças a 1 de vitória, e minimizar as mesmas ameaças a 1 de derrota. O mesmo ocorre para ameaças a 2, e 3, até ao valor K da instância. Mas por cada maior valor, a penalização é diluída pelo fator HEUR_BASE / 100.

Para conseguir observar a heurística em funcionamento vamos fazer um jogo com profundidade 1, para que a heurística seja o fator dominante.

Introduza:

  • 1; 2; 3; 7; 2; ENTER; 6. executa um lance, fica com 8 ameaças a 3 jogadas (duas por cada direção)
  • 6. responde anulando duas das ameaças, e faz 4 ameaças a 3 jogadas
  • 6. duas das ameaças passa a 2 jogadas, e anula simultaneamente 2 ameaças adversárias a 3 jogadas
  • 6; 6; 6; .... termine o jogo, verificando que todas as ameaças são respondidas

 │ 4 em Linha (5x5)
 │    A B C D E
 │  1 . . . . . 1 
 │  2 . . . . . 2 
 │  3 . . x . . 3 
 │  4 . . . . . 4 
 │  5 . . . . . 5 
 │    A B C D E
 │ 4 em Linha (5x5)
 │    A B C D E
 │  1 . . . . . 1 
 │  2 . . . . . 2 
 │  3 . . x . . 3 
 │  4 . o . . . 4 
 │  5 . . . . . 5 
 │    A B C D E
 │ 4 em Linha (5x5)
 │    A B C D E
 │  1 . . . . . 1 
 │  2 . . . . . 2 
 │  3 . x x . . 3 
 │  4 . o . . . 4 
 │  5 . . . . . 5 
 │    A B C D E
 │ 4 em Linha (5x5)
 │    A B C D E
 │  1 o x x . . 1 
 │  2 x . o x . 2 
 │  3 . x x o o 3 
 │  4 . o x o x 4 
 │  5 o x . o . 5 
 │    A B C D E

Este teste é importante para despistar algum erro na heurística.

Podemos fazer o mesmo para um tabuleiro maior. Introduza: 1; 10; 6. O lance inicial vai para o meio do tabuleiro, onde há mais ameaças em simultâneo, ou seja, vai para a jogada que maximiza o valor da heurística. Execute também um jogo, verificando que as ameaças vão sendo respondidas: 6; 6; ...

Chegando ao final verificamos que há empate:

 │ 6 em Linha (12x12)
 │    A B C D E F G H I J K L
 │  1 x x x o o o o x x o o o 1 
 │  2 o o o x x x o x x x x x 2 
 │  3 x o x x o o x o o x o o 3 
 │  4 o o o x x x x o o o o o 4 
 │  5 o x x o o o x o x x x x 5 
 │  6 x x x x x o o o x o x x 6 
 │  7 o o o x o x x x o x o o 7 
 │  8 x x o o o x o x o o x x 8 
 │  9 o o x o x o x o x x o o 9 
 │ 10 x x o x o o x o o o x x 10 
 │ 11 x o o x x x x x o o o x 11 
 │ 12 o x x o o x x o x o x o 12 
 │    A B C D E F G H I J K L

Não temos portanto motivo para não considerar a heurística válida.

Na variante da gravidade as ameaças a W jogadas são também as jogadas necessárias de jogar, se fosse o jogador sempre a jogar, para ganhar o jogo. Mas neste caso, numa linha em que exista um espaço suspenso, tem que se adicionar as casas em baixo do espaço suspenso como distância para o objetivo. Se essa ameaça for mais de K jogadas, ou seja, o número de marcas em linha, então não é contabilizada.

Esta heurística está implementada a nível global em TProcuraAdversa, tendo de ser específico o calculo do número de ameaças e distância. Acaba por ser parecido com uma heurística num agente de procura, estimando a distância até ao estado final, mas neste caso temos várias vias para o jogador e adversário, já que a procura é adversa, e assim beneficia-se os estados em que estamos mais perto de chegar ao estado final que o adversário.

Ação 3 - MiniMax com cortes Alfa/Beta

Vamos fazer um jogo com o MiniMax com cortes alfa/beta no 4 em linha, de modo a observar o MiniMax com cortes Alfa/Beta num jogo com heurística.

Insira: 2; 1; 2; 3; 2; 3; 7; 3; ENTER; 6.

═╤═ ►  Execução iniciada ═══
 ├□═╤═ 💰 g:0  ═══ α=-10000 β=10000 ═══
 │  ├■═╤═ 🔖 13 💰 g:1 🎯 h:-7 ⚖  1|25|25 ═══ α=-10000 β=10000 ═══ ⚡ c3
 │  │  ├□═╤═ 🔖 26 💰 g:2 ⚖  2|49|25 ═══ α=-10000 β=10000 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□ -4 → α
 │  │  ├□═╤═ 🔖 27 💰 g:2 ⚖  2|49|26 ═══ α=-4 β=10000 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□ -3 → α
 │  │  ├□═╤═ 🔖 28 💰 g:2 ⚖  2|49|27 ═══ α=-3 β=10000 ═══ ⚡ a3
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 o . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□═╤═ 🔖 29 💰 g:2 ⚖  2|49|28 ═══ α=-3 β=10000 ═══ ⚡ a2
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 o . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□═╤═ 🔖 30 💰 g:2 ⚖  2|49|29 ═══ α=-3 β=10000 ═══ ⚡ a1
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 o . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□═╤═ 🔖 31 💰 g:2 ⚖  2|49|30 ═══ α=-3 β=10000 ═══ ⚡ b5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . o . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□═╤═ 🔖 32 💰 g:2 ⚖  2|49|31 ═══ α=-3 β=10000 ═══ ⚡ b4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . o . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 → α
 │  │  ├□═╤═ 🔖 33 💰 g:2 ⚖  2|49|32 ═══ α=-1 β=10000 ═══ ⚡ b3
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . o x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 34 💰 g:2 ⚖  2|49|33 ═══ α=-1 β=10000 ═══ ⚡ b2
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . o . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 35 💰 g:2 ⚖  2|49|34 ═══ α=-1 β=10000 ═══ ⚡ b1
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . o . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□═╤═ 🔖 36 💰 g:2 ⚖  2|49|35 ═══ α=-1 β=10000 ═══ ⚡ c5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . o . . 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□═╤═ 🔖 37 💰 g:2 ⚖  2|49|36 ═══ α=-1 β=10000 ═══ ⚡ c4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . o . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 38 💰 g:2 ⚖  2|49|37 ═══ α=-1 β=10000 ═══ ⚡ c2
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . o . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 39 💰 g:2 ⚖  2|49|38 ═══ α=-1 β=10000 ═══ ⚡ c1
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . o . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□═╤═ 🔖 40 💰 g:2 ⚖  2|49|39 ═══ α=-1 β=10000 ═══ ⚡ d5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . o . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□═╤═ 🔖 41 💰 g:2 ⚖  2|49|40 ═══ α=-1 β=10000 ═══ ⚡ d4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . o . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 42 💰 g:2 ⚖  2|49|41 ═══ α=-1 β=10000 ═══ ⚡ d3
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x o . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 43 💰 g:2 ⚖  2|49|42 ═══ α=-1 β=10000 ═══ ⚡ d2
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . o . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□═╤═ 🔖 44 💰 g:2 ⚖  2|49|43 ═══ α=-1 β=10000 ═══ ⚡ d1
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . o . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□═╤═ 🔖 45 💰 g:2 ⚖  2|49|44 ═══ α=-1 β=10000 ═══ ⚡ e5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . o 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□═╤═ 🔖 46 💰 g:2 ⚖  2|49|45 ═══ α=-1 β=10000 ═══ ⚡ e4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . o 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  ├□═╤═ 🔖 47 💰 g:2 ⚖  2|49|46 ═══ α=-1 β=10000 ═══ ⚡ e3
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . x . o 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -4
 │  │  ├□═╤═ 🔖 48 💰 g:2 ⚖  2|49|47 ═══ α=-1 β=10000 ═══ ⚡ e2
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . o 2 
 │  │  │  3 . . x . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -3
 │  │  └□═╤═ 🔖 49 💰 g:2 ⚖  2|49|48 ═══ α=-1 β=10000 ═══ ⚡ e1
 │  │    4 em Linha (5x5)
 │  │       A B C D E
 │  │     1 . . . . o 1 
 │  │     2 . . . . . 2 
 │  │     3 . . x . . 3 
 │  │     4 . . . . . 4 
 │  │     5 . . . . . 5 
 │  │       A B C D E ─── 🍃 -4
 │  ├■ -1 → β
 │  ├■═╤═ 🔖 18 💰 g:1 🎯 h:-5 ⚖  2|49|49 ═══ α=-10000 β=-1 ═══ ⚡ d3
 │  │  ├□═╤═ 🔖 50 💰 g:2 ⚖  3|73|49 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . x . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 51 💰 g:2 ⚖  3|73|50 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . x . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 52 🔖 53 🔖 54 … 🔖 71 🔖 72 🔖 73 } #22
 │  ├■═╤═ 🔖 9 💰 g:1 🎯 h:-5 ⚖  3|73|51 ═══ α=-10000 β=-1 ═══ ⚡ b2
 │  │  ├□═╤═ 🔖 74 💰 g:2 ⚖  4|97|51 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . x . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 75 💰 g:2 ⚖  4|97|52 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . x . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 76 🔖 77 🔖 78 … 🔖 95 🔖 96 🔖 97 } #22
 │  ├■═╤═ 🔖 12 💰 g:1 🎯 h:-5 ⚖  4|97|53 ═══ α=-10000 β=-1 ═══ ⚡ c4
 │  │  ├□═╤═ 🔖 98 💰 g:2 ⚖  5|121|53 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . x . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 99 💰 g:2 ⚖  5|121|54 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o . x . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 100 🔖 101 🔖 102 … 🔖 119 🔖 120 🔖 121 } #22
 │  ├■═╤═ 🔖 17 💰 g:1 🎯 h:-5 ⚖  5|121|55 ═══ α=-10000 β=-1 ═══ ⚡ d4
 │  │  ├□═╤═ 🔖 122 💰 g:2 ⚖  6|145|55 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . x . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 123 💰 g:2 ⚖  6|145|56 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o . . x . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 124 🔖 125 🔖 126 … 🔖 143 🔖 144 🔖 145 } #22
 │  ├■═╤═ 🔖 14 💰 g:1 🎯 h:-5 ⚖  6|145|57 ═══ α=-10000 β=-1 ═══ ⚡ c2
 │  │  ├□═╤═ 🔖 146 💰 g:2 ⚖  7|169|57 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . x . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 147 💰 g:2 ⚖  7|169|58 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . x . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 148 🔖 149 🔖 150 … 🔖 167 🔖 168 🔖 169 } #22
 │  ├■═╤═ 🔖 8 💰 g:1 🎯 h:-5 ⚖  7|169|59 ═══ α=-10000 β=-1 ═══ ⚡ b3
 │  │  ├□═╤═ 🔖 170 💰 g:2 ⚖  8|193|59 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . x . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 171 💰 g:2 ⚖  8|193|60 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . x . . . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 172 🔖 173 🔖 174 … 🔖 191 🔖 192 🔖 193 } #22
 │  ├■═╤═ 🔖 19 💰 g:1 🎯 h:-5 ⚖  8|193|61 ═══ α=-10000 β=-1 ═══ ⚡ d2
 │  │  ├□═╤═ 🔖 194 💰 g:2 ⚖  9|217|61 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . x . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 195 💰 g:2 ⚖  9|217|62 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . x . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 196 🔖 197 🔖 198 … 🔖 215 🔖 216 🔖 217 } #22
 │  ├■═╤═ 🔖 7 💰 g:1 🎯 h:-5 ⚖  9|217|63 ═══ α=-10000 β=-1 ═══ ⚡ b4
 │  │  ├□═╤═ 🔖 218 💰 g:2 ⚖  10|241|63 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . x . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 -2
 │  │  ├□ -2 → α
 │  │  ├□═╤═ 🔖 219 💰 g:2 ⚖  10|241|64 ═══ α=-2 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o x . . . 4 
 │  │  │  5 . . . . . 5 
 │  │  │    A B C D E ─── 🍃 -1
 │  │  ├□ -1 ─── 🪓 β(-1) { 🔖 220 🔖 221 🔖 222 … 🔖 239 🔖 240 🔖 241 } #22
 │  ├■═╤═ 🔖 20 💰 g:1 🎯 h:-3 ⚖  10|241|65 ═══ α=-10000 β=-1 ═══ ⚡ d1
 │  │  ├□═╤═ 🔖 242 💰 g:2 ⚖  11|265|65 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . x . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 243 🔖 244 🔖 245 … 🔖 263 🔖 264 🔖 265 } #23
 │  ├■═╤═ 🔖 16 💰 g:1 🎯 h:-3 ⚖  11|265|66 ═══ α=-10000 β=-1 ═══ ⚡ d5
 │  │  ├□═╤═ 🔖 266 💰 g:2 ⚖  12|289|66 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . x . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 267 🔖 268 🔖 269 … 🔖 287 🔖 288 🔖 289 } #23
 │  ├■═╤═ 🔖 2 💰 g:1 🎯 h:-3 ⚖  12|289|67 ═══ α=-10000 β=-1 ═══ ⚡ a4
 │  │  ├□═╤═ 🔖 290 💰 g:2 ⚖  13|313|67 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 x . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 291 🔖 292 🔖 293 … 🔖 311 🔖 312 🔖 313 } #23
 │  ├■═╤═ 🔖 6 💰 g:1 🎯 h:-3 ⚖  13|313|68 ═══ α=-10000 β=-1 ═══ ⚡ b5
 │  │  ├□═╤═ 🔖 314 💰 g:2 ⚖  14|337|68 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o x . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 315 🔖 316 🔖 317 … 🔖 335 🔖 336 🔖 337 } #23
 │  ├■═╤═ 🔖 10 💰 g:1 🎯 h:-3 ⚖  14|337|69 ═══ α=-10000 β=-1 ═══ ⚡ b1
 │  │  ├□═╤═ 🔖 338 💰 g:2 ⚖  15|361|69 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . x . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 339 🔖 340 🔖 341 … 🔖 359 🔖 360 🔖 361 } #23
 │  ├■═╤═ 🔖 4 💰 g:1 🎯 h:-3 ⚖  15|361|70 ═══ α=-10000 β=-1 ═══ ⚡ a2
 │  │  ├□═╤═ 🔖 362 💰 g:2 ⚖  16|385|70 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 x . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 363 🔖 364 🔖 365 … 🔖 383 🔖 384 🔖 385 } #23
 │  ├■═╤═ 🔖 24 💰 g:1 🎯 h:-3 ⚖  16|385|71 ═══ α=-10000 β=-1 ═══ ⚡ e2
 │  │  ├□═╤═ 🔖 386 💰 g:2 ⚖  17|409|71 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . x 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 387 🔖 388 🔖 389 … 🔖 407 🔖 408 🔖 409 } #23
 │  ├■═╤═ 🔖 22 💰 g:1 🎯 h:-3 ⚖  17|409|72 ═══ α=-10000 β=-1 ═══ ⚡ e4
 │  │  ├□═╤═ 🔖 410 💰 g:2 ⚖  18|433|72 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . x 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 411 🔖 412 🔖 413 … 🔖 431 🔖 432 🔖 433 } #23
 │  ├■═╤═ 🔖 21 💰 g:1 🎯 h:-2 ⚖  18|433|73 ═══ α=-10000 β=-1 ═══ ⚡ e5
 │  │  ├□═╤═ 🔖 434 💰 g:2 ⚖  19|457|73 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . x 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 435 🔖 436 🔖 437 … 🔖 455 🔖 456 🔖 457 } #23
 │  ├■═╤═ 🔖 23 💰 g:1 🎯 h:-2 ⚖  19|457|74 ═══ α=-10000 β=-1 ═══ ⚡ e3
 │  │  ├□═╤═ 🔖 458 💰 g:2 ⚖  20|481|74 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . x 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 459 🔖 460 🔖 461 … 🔖 479 🔖 480 🔖 481 } #23
 │  ├■═╤═ 🔖 1 💰 g:1 🎯 h:-2 ⚖  20|481|75 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  ├□═╤═ 🔖 482 💰 g:2 ⚖  21|505|75 ═══ α=-10000 β=-1 ═══ ⚡ a4
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 o . . . . 4 
 │  │  │  5 x . . . . 5 
 │  │  │    A B C D E ─── 🍃 1
 │  │  ├□ 1 ─── 🪓 β(-1) { 🔖 483 🔖 484 🔖 485 … 🔖 503 🔖 504 🔖 505 } #23
 │  ├■═╤═ 🔖 11 💰 g:1 🎯 h:-2 ⚖  21|505|76 ═══ α=-10000 β=-1 ═══ ⚡ c5
 │  │  ├□═╤═ 🔖 506 💰 g:2 ⚖  22|529|76 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . x . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 507 🔖 508 🔖 509 … 🔖 527 🔖 528 🔖 529 } #23
 │  ├■═╤═ 🔖 15 💰 g:1 🎯 h:-2 ⚖  22|529|77 ═══ α=-10000 β=-1 ═══ ⚡ c1
 │  │  ├□═╤═ 🔖 530 💰 g:2 ⚖  23|553|77 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . x . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 531 🔖 532 🔖 533 … 🔖 551 🔖 552 🔖 553 } #23
 │  ├■═╤═ 🔖 3 💰 g:1 🎯 h:-2 ⚖  23|553|78 ═══ α=-10000 β=-1 ═══ ⚡ a3
 │  │  ├□═╤═ 🔖 554 💰 g:2 ⚖  24|577|78 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 . . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 x . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 555 🔖 556 🔖 557 … 🔖 575 🔖 576 🔖 577 } #23
 │  ├■═╤═ 🔖 5 💰 g:1 🎯 h:-2 ⚖  24|577|79 ═══ α=-10000 β=-1 ═══ ⚡ a1
 │  │  ├□═╤═ 🔖 578 💰 g:2 ⚖  25|601|79 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │  │  │ 4 em Linha (5x5)
 │  │  │    A B C D E
 │  │  │  1 x . . . . 1 
 │  │  │  2 . . . . . 2 
 │  │  │  3 . . . . . 3 
 │  │  │  4 . . . . . 4 
 │  │  │  5 o . . . . 5 
 │  │  │    A B C D E ─── 🍃 0
 │  │  ├□ 0 ─── 🪓 β(-1) { 🔖 579 🔖 580 🔖 581 … 🔖 599 🔖 600 🔖 601 } #23
 │  └■═╤═ 🔖 25 💰 g:1 🎯 h:-2 ⚖  25|601|80 ═══ α=-10000 β=-1 ═══ ⚡ e1
 │     ├□═╤═ 🔖 602 💰 g:2 ⚖  26|625|80 ═══ α=-10000 β=-1 ═══ ⚡ a5
 │     │ 4 em Linha (5x5)
 │     │    A B C D E
 │     │  1 . . . . x 1 
 │     │  2 . . . . . 2 
 │     │  3 . . . . . 3 
 │     │  4 . . . . . 4 
 │     │  5 o . . . . 5 
 │     │    A B C D E ─── 🍃 0
 │     ├□ 0 ─── 🪓 β(-1) { 🔖 603 🔖 604 🔖 605 … 🔖 623 🔖 624 🔖 625 } #23 HT: reutilização 0.31 vezes 
 ├─ Parâmetros ─ P1=2 P2=3 P3=1 P4=10 P5=0 P6=4 P7=3 P8=1 P10=0 P11=0 P12=2 P13=0 P14=0
 ├─ ⚙   ─ P15=200
═╧═ 🏁  Execução terminada ⏱   8ms  ═══
Jogo Em Linha
┌─ ⚙ Parâmetros ──────────────────────────────────────────────────────
│ P1(ALGORITMO): MiniMax alfa/beta | P2(NIVEL_DEBUG): DETALHE | P3(SEMENTE): 1
│ P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 0 | P6(VER_ACOES): 4 | P7(LIMITE): 3
│ P8(ESTADOS_REPETIDOS): ignorar | P10(RUIDO_HEURISTICA): 0 | P11(BARALHAR_SUCESSORES): 0
│ P12(ORDENAR_SUCESSORES): 2 | P13(PODA_HEURISTICA): 0 | P14(PODA_CEGA): 0
│ P15(HEUR_BASE): 200
└──────────────────────────────────────────────────────────────────────
 │ 4 em Linha (5x5)
 │    A B C D E
 │  1 . . . . . 1 
 │  2 . . . . . 2 
 │  3 . . x . . 3 
 │  4 . . . . . 4 
 │  5 . . . . . 5 
 │    A B C D E
┌─ ⚖ Indicadores ─────────────────────────────────────────────────────
│ I1(IND_CUSTO): 0 | I2(Tempo(ms)): 8 | I3(Iterações): 81 | I4(IND_EXPANSOES): 26 | 
│ I5(IND_GERACOES): 625 | I6(IND_LOWER_BOUND): 0
└──────────────────────────────────────────────────────────────────────
...
Opção: 

Realçamos os seguintes pontos:

  • alfa que inicialmente é -10000 é atualizado para para -4 no estado 26 (├□ -4 → α),
  • logo no estado 27 ocorre nova atualização para -3 (├□ -3 → α)
  • o estado 29 é igual ao estado 27 (eixo horizontal), no entanto não é removido devido a não existir simetrias implementadas.
  • o segundo ramo com d3, estado 18, expande para o estado 50 e depois 51 com custo -1, é imediatamente cortado (├□ -1 ─── 🪓 β(-1) { 🔖 52 🔖 53 🔖 54 … 🔖 71 🔖 72 🔖 73 } #22).
  • o mesmo ocorre em muitos outros lances, poupando a análise de inúmeros estados

O motivo para não se implementar simetrias é que em tabuleiros grandes acabam por ocorrer apenas no início do jogo. Todo o resto do tempo a normalizar o estado é tempo que é desperdiçado sem que exista real vantagem. No entanto, se o mesmo estado ocorrer exatamente no mesmo formato, a hashtable está ligada e o estado é reutilizado.

A qualidade da heurística é aqui crítica.

Temos um parâmetro que influencia a heurística:

  • HEUR_BASE - Valor base para diferença entre ameaças de K e K-1 (100 não há diferença, 200 corresponde ao dobro e é o valor por omissão)

Esta heurística é genérica, e pode ser utilizada em problemas que se possam calcular ameaças a K jogadas, como é o caso dos jogos em que se pretende fazer K marcas em linha. As ameaças a K jogadas é idêntico a uma medida de distância até um estado objetivo, relaxando o facto de se ter um adversário, ou seja, imaginando que apenas um jogador joga. O valor por omissão pode não ser o melhor, pelo que será alvo de teste.

Ação 4 - Torneio Profundidade

Nos testes empíricos vamos utilizar a linha de comando, por ser mais simples a identificação do teste a realizar.

Pretendemos verificar em torneio, que a profundidade maior resulta em força de jogo superior. Por outro lado pretendemos confirmar que os cortes alfa/beta e a ordenação dos sucessores, não alteram de forma significativa a força de jogo, mas reduzem o tempo de execução (P1=1,2 x P12=0,1).

Vamos variar apenas três níveis de profundidades, nível 1 a 3, deixando a procura iterativa para o torneio seguinte (P7=2:4). A profundidade com nível fixo, se o tempo acabar irá retornar um resultado que pode não ser o melhor possível. A utilização da procura em profundidade iterativa, permite que quando o tempo acaba, seja utilizada a última árvore completamente explorada, e assim a jogada não será baseada numa árvore incompleta. Para procurar ver o ganho de profundidade sem perturbação do limite de tempo, vamos colocar neste teste um tempo por jogada de 60 segundos (P4=60). Vamos utilizar todas as instâncias, já que a heurística é igual.

  • Tipo de Teste / Objetivo: Desempenho (Profundidade, alfa/beta, ordenação)
  • Definição: Instâncias: 1:10; Configurações: P1=1,2 x P12=0,1 x P7=2:4
  • Esforço: (um só jogo, não há aleatoriedade)
  • Execução: TProcuraAdversa 2 1:10 -R Resultados/TorneioProfundidade -M 0 -G 1 -P P2=2 P4=60 P1=1,2 x P12=0,1 x P7=2:4

Nota: Vamos neste torneio gravar os jogos (-G 1), para mostrar essa possibilidade, mas como não iremos analisar os jogos, nem iremos manter esta configuração nos torneios seguintes.

Ver script: torneioProfundidade.sh
#!/bin/bash
#SBATCH --job-name=torneioProfundidade
#SBATCH --output=Resultados/torneioProfundidade.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: TorneioProfundidade
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioProfundidade -M 1 -G 1 \
  -P P2=2 P4=60 P1=1,2 x P12=0,1 x P7=2:4
Ver execução:
═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P2=2 P3=1 P4=60 P5=0 P6=4 P8=1 P10=0 P11=0 P13=0 P14=0 P15=200 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P1=1 P7=2 P12=0
 ├─ ⚙  [2] ─ P1=2 P7=2 P12=0
 ├─ ⚙  [3] ─ P1=1 P7=2 P12=1
 │ ...
 ├─ ⚙  [10] ─ P1=2 P7=4 P12=0
 ├─ ⚙  [11] ─ P1=1 P7=4 P12=1
 ├─ ⚙  [12] ─ P1=2 P7=4 P12=1
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:1320   📄 Instâncias: 10   🛠️ Configurações: 12   🖥️ Processos: 48.
 ├─ ⏱ 1' 17" 101ms    📋 204   📄 8     🛠️ 11    🛠️ 10    🖥️ 45    ⚖  
 ├─ ⏱ 2' 19" 706ms    📋 224   📄 7     🛠️ 10    🛠️ 5     🖥️ 33    ⚖  
 ├─ ⏱ 3' 21" 726ms    📋 245   📄 6     🛠️ 9     🛠️ 8     🖥️ 30    ⚖  
 ├─ ⏱ 4' 23" 222ms    📋 313   📄 7     🛠️ 10    🛠️ 9     🖥️ 31    ⚖  
 ├─ ⏱ 5' 34" 532ms    📋 371   📄 8     🛠️ 8     🛠️ 7     🖥️ 24    ⚖  
 ├─ ⏱ 6' 36" 117ms    📋 383   📄 8     🛠️ 8     🛠️ 9     🖥️ 42    ⚖  
 ├─ ⏱ 7' 37" 350ms    📋 411   📄 8     🛠️ 8     🛠️ 5     🖥️ 23    ⚖  
 ├─ ⏱ 8' 38" 728ms    📋 431   📄 9     🛠️ 8     🛠️ 11    🖥️ 19    ⚖  
 ├─ ⏱ 9' 41" 649ms    📋 463   📄 9     🛠️ 8     🛠️ 9     🖥️ 46    ⚖  
 ├─ ⏱ 10' 41" 870ms   📋 544   📄 8     🛠️ 7     🛠️ 0     🖥️ 35    ⚖  
 ├─ ⏱ 11' 45" 128ms   📋 592   📄 9     🛠️ 8     🛠️ 1     🖥️ 44    ⚖  
 ├─ ⏱ 12' 57" 326ms   📋 683   📄 8     🛠️ 5     🛠️ 9     🖥️ 44    ⚖  
 ├─ ⏱ 13' 57" 883ms   📋 742   📄 9     🛠️ 5     🛠️ 2     🖥️ 5     ⚖  
 ├─ ⏱ 14' 58" 249ms   📋 795   📄 6     🛠️ 4     🛠️ 9     🖥️ 44    ⚖  
 ├─ ⏱ 16' 704ms       📋 832   📄 9     🛠️ 4     🛠️ 5     🖥️ 23    ⚖  
 ├─ ⏱ 17' 6" 250ms    📋 903   📄 8     🛠️ 3     🛠️ 9     🖥️ 34    ⚖  
 ├─ ⏱ 18' 6" 436ms    📋 941   📄 7     🛠️ 3     🛠️ 6     🖥️ 46    ⚖  
 ├─ ⏱ 19' 16" 489ms   📋 1011  📄 8     🛠️ 3     🛠️ 8     🖥️ 34    ⚖  
 ├─ ⏱ 20' 17" 24ms    📋 1022  📄 9     🛠️ 3     🛠️ 10    🖥️ 6     ⚖  
 ├─ ⏱ 21' 18" 920ms   📋 1064  📄 7     🛠️ 2     🛠️ 4     🖥️ 5     ⚖  
 ├─ ⏱ 22' 40" 653ms   📋 1122  📄 10    🛠️ 2     🛠️ 9     🖥️ 23    ⚖  
 ├─ ⏱ 23' 48" 363ms   📋 1133  📄 9     🛠️ 2     🛠️ 8     🖥️ 34    ⚖  
 ├─ ⏱ 24' 51" 376ms   📋 1172  📄 9     🛠️ 1     🛠️ 4     🖥️ 37    ⚖  
 ├─ ⏱ 25' 52" 792ms   📋 1226  📄 5     🛠️ 0     🛠️ 10    🖥️ 35    ⚖  
 ├─ ⏱ 26' 54" 996ms   📋 1320  📄 10    🛠️ 0     🛠️ 6     🖥️ 15    ⚖  
 ├─ ⏱ 27' 57" 507ms   📋 1320  📄 8     🛠️ 0     🛠️ 8     🖥️ 36    ⚖  
 ├─ ⏱ 29' 33" 968ms   📋 1320  📄 10    🛠️ 0     🛠️ 9     🖥️ 35    ⚖  
 ├─ ⏱ 31' 54" 511ms   📋 1320  📄 10    🛠️ 8     🛠️ 7     🖥️ 21    ⚖  
 ├─ ⏱ 33' 36" 621ms   📋 1320  📄 10    🛠️ 8     🛠️ 4     🖥️ 28    ⚖  
 ├─ ⏱ 34' 46" 728ms   📋 1320  📄 10    🛠️ 8     🛠️ 0     🖥️ 2     ⚖  
 ├─ ⏱ 35' 52" 699ms   📋 1320  📄 10    🛠️ 7     🛠️ 8     🖥️ 24    ⚖  
 ├─ ⏱ 36' 55" 59ms    📋 1320  📄 10    🛠️ 8     🛠️ 9     🖥️ 40    ⚖  
 ├─ ⏱ 38' 59" 499ms   📋 1320  📄 10    🛠️ 5     🛠️ 8     🖥️ 26    ⚖  
 ├─ ⏱ 40' 49" 510ms   📋 1320  📄 10    🛠️ 4     🛠️ 10    🖥️ 13    ⚖  
 ├─ ⏱ 42' 29" 988ms   📋 1320  📄 10    🛠️ 3     🛠️ 8     🖥️ 1     ⚖  
 ├─ ⏱ 44' 34" 183ms   📋 1320  📄 10    🛠️ 2     🛠️ 10    🖥️ 7     ⚖  
 ├─ ⏱ 47' 37" 400ms   📋 1320  📄 10    🛠️ 1     🛠️ 10    🖥️ 18    ⚖  
 ├─ ⏱ 51' 16" 550ms   📋 1320  📄 10    🛠️ 0     🛠️ 10    🖥️ 5     ⚖  
 ├─ ⏱ 52' 51" 632ms   📋 1320  📄 10    🛠️ 10    🛠️ 8     🖥️ 32    ⚖  
 ├─ ⏱ 57' 43" 975ms   📋 1320  📄 10    🛠️ 8     🛠️ 10    🖥️ 31    ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioProfundidade.csv gravado.
 │  ⏱  Tempo real: 57' 43" 981ms 
 │  ⏱  CPU total: 1d 21h 13' 27" 97ms 
 │  ⏱  Espera do gestor: 57' 43" 937ms 
 │  ⏱  Espera trabalhadores: 17h 23' 35" 384ms 
 │  📊  Utilização:
 │  - Total: 60.3%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 61.5% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 57' 43" 981ms ) ═══

Nesta execução podemos ver que a taxa de utilização foi de 60%. Este facto deve-se a que houve jogos que levaram muito mais tempo que outros. A última tarefa (jogo) foi colocada no minuto 25, tendo os processadores que ficaram livres após esse instante ficado sem trabalho até ao final.

Para medir a performance de cada configuração e lado (branco/preto), vamos analisar a eficiência e eficácia:

  • Eficiência: Tempo médio por jogada em segundos
  • Eficácia: Média de pontos (vitória 1 ponto, empate 0.5 pontos, derrota 0 pontos)

Desta forma a eficiência avalia o custo temporal da jogada, ou seja, recursos computacionais (assumindo o tempo o principoal), enquanto eficácia avalia a qualidade do resultado obtido, ou taxa de suceesso, podendo ser interpretado como uma probabilidade de vitória.

Vamos ver neste primeiro relatório a performance do jogador branco:

P1(ALGORITMO) P12(ORDENAR_SUCESSORES) P7(LIMITE)
2
3 4
EficiênciaBranco 1:MiniMax ID 0,001 0,041 3,982
Heurística 0,001 0,041 3,853
2:MiniMax alfa/beta ID 0,001 0,011 0,603
Heurística 0,001 0,006 0,098
EficáciaBranco 1:MiniMax ID 0,41 0,55 0,64
Heurística 0,41 0,6 0,65
2:MiniMax alfa/beta ID 0,41 0,55 0,64
Heurística 0,41 0,6 0,65
Total EficiênciaBranco 0,001 0,025 2,131
Total EficáciaBranco 0,41 0,57 0,64

Podemos neste ponto concluir que:

  • A profundidade tem um impacto muito grande na eficiência, aumentando o tempo exponencialmente, para mais de 3 segundos por jogada no nível 4. Naturalmente que estes resultados são médias de 10 instâncias, sendo as instâncias maiores as responsáveis por estes tempos.
  • Maior profundidade resulta em melhor eficácia, confirmando a hipótese inicial. Neste torneio cada nível aumenta em cerca de 10%.
  • As diferenças de eficácia entre alfa/beta e sem cortes, não são observáveis, e a ordenação aparenta ter ligeira vantagem.
  • Em termos de eficiência registamos um grande ganho para os cortes alfa/beta, e ainda mais se estiver com a ordenação dos sucessores por heurística. Quanto maior a profundidade maior o ganho.

Vamos agora ver a mesma tabela para o jogador a preto:

P1(ALGORITMO) P12(ORDENAR_SUCESSORES) P7(LIMITE)
2
3 4
EficiênciaPreto 1:MiniMax ID 0,001 0,041 3,447
Heurística 0,001 0,047 3,446
2:MiniMax alfa/beta ID 0,001 0,011 0,489
Heurística 0,001 0,007 0,09
EficáciaPreto 1:MiniMax ID 0,36 0,5 0,6
Heurística 0,36 0,45 0,48
2:MiniMax alfa/beta ID 0,36 0,5 0,6
Heurística 0,36 0,45 0,48
Total EficiênciaPreto 0,001 0,026 1,867
Total EficáciaPreto 0,36 0,48 0,54

As conclusões são semelhantes, tendo que se registar que a eficácia do jogador a preto é ligeiramente inferior ao do jogador a branco.

Podemose ver também do lado das instâncias, o número de vitórias, empates e derrotas:

Instância Vitória Preta Empate Vitória Branca
1 132
2 88 44
3 40 14 78
4 66 24 42
5 52 80
6 60 18 54
7 10 96 26
8 4 112 16
9 132
10 132
Total Geral 232 748 340

Podemos observar:

  • Na instância 1, o jogo do Galo, apenas houve empates.
  • A segunda instância houve apenas dois resultados, empates e vitória branca, pelo que o jogo não se encontra equilibrado.
  • A terceira instância aumenta apenas uma coluna à instância 2 mas o jogo fica já com bastantes vitórias e derrotas.
  • As instâncias de gravidade, da 4 à 6, podemos ver que quase não há empates, sendo todas bastante disputadas neste torneio.
  • Nas instâncias maiores, da 7 à 10, impera o empate, podendo significar que é simples defender contra ameaças do adversário

Temos ainda bastantes parâmetros por optimizar, mas de momento temos as seguintes conclusões gerais:

  • Os cortes alfa/beta, bem como a ordenação dos sucessores, são benéficos em termos de eficiência, sem grande impacto na eficácia.
  • A profundidade aumenta a força de jogo, mas o tempo aumenta exponencialmente.

Tempos elevados por jogada não são viáveis nem para testes empíricos, nem para jogar contra jogadores humanos.

Ação 5 - Torneio Iterativo

Na ação anterior o torneio compara configurações, utilizando tempos distintos. Assim a comparação não é justa, embora tenha permitido observar vantagens nos cortes alfa/beta e ordenação dos sucessores.

Vamos agora utilizar a profundidade iterativa e dar exatamente o mesmo tempo por jogada, para procurar ver se a eficácia dos cortes alfa/beta e ordenação dos sucessores se mantém.

Com o método iterativo a profundidade vai iterativamente sendo aumentada. Esta estratégia tem a vantagem de ter sempre um movimento pronto a jogar quando o tempo acaba. Por outro lado utiliza o tempo existente, se der para explorar mais um nível, esse é explorado.

Temos mais uma opção na ordenação, que é o valor 2 (omissão). Este valor, para além de ordenar os sucessores, guarda em memória cada estado, o resultado de análises anteriores. Quando o estado ocorre novamnete, se estiver em memória, o seu valor é utilizado em vez de ser executada a heurítica ou uma procura de determinada profundidade. Para tal é guardada alguma informação sobre o estado de modo a sabermos se podemos utilizar o valor assim que exista possibilidade de reutilização. Esta opção tem naturalmente mais impacto na procura iterativa, em que os estados iniciais são re-expandidos, mas pode ter influencia mesmo sem ser na procura iterativa, caso o mesmo estado apareça várias vezes por ordens distintas de movimentos.

Vamos limitar o tempo a 1 segundo (P4=1). Vamos estudar também a influênica de baralhar os sucessores com P11=0,1. Notar que esta ação pode ser feita em conjunto com a ordenação, ou seja, primeiro baralha-se e depois ordena-se, ficando os estados com o mesmo valor por ordem aleatória. Caso não atrapalhe, a baralhação dos sucessores é importante para permitir realizar vários jogos distintos entre duas configurações iguais, e assim ter um resultado mais preciso.

  • Tipo de Teste / Objetivo: Eficácia (alfa/beta, ordenação, baralhação)
  • Definição: Instâncias: 1:10; Configurações: P7=0 P1=1,2 x P12=0:2 x P11=0,1
  • Esforço: (um só jogo)
  • Execução: TProcuraAdversa 2 1:10 -R Resultados/TorneioIterativo -M 1 -P P2=2 P4=1 P7=0 P1=1,2 x P12=0:2 x P11=0,1
Ver script: torneioIterativo.sh
#!/bin/bash
#SBATCH --job-name=torneioIterativo
#SBATCH --output=Resultados/torneioIterativo.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: torneioIterativo
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioIterativo -M 1 \
  -P P2=2 P4=1 P7=0 P1=1,2 x P12=0:2 x P11=0,1
Ver execução:

═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P2=2 P3=1 P4=1 P5=0 P6=4 P7=0 P8=1 P10=0 P13=0 P14=0 P15=200 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P1=1 P11=0 P12=0
 ├─ ⚙  [2] ─ P1=2 P11=0 P12=0
 ├─ ⚙  [3] ─ P1=1 P11=0 P12=1
 │ ...
 ├─ ⚙  [10] ─ P1=2 P11=1 P12=1
 ├─ ⚙  [11] ─ P1=1 P11=1 P12=2
 ├─ ⚙  [12] ─ P1=2 P11=1 P12=2
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:1320   📄 Instâncias: 10   🛠️ Configurações: 12   🖥️ Processos: 48.
 ├─ ⏱ 1' 4" 439ms     📋 95    📄 6     🛠️ 11    🛠️ 8     🖥️ 23    ⚖  
 ├─ ⏱ 2' 6" 701ms     📋 156   📄 2     🛠️ 10    🛠️ 7     🖥️ 6     ⚖  
 ├─ ⏱ 3' 7" 662ms     📋 212   📄 9     🛠️ 10    🛠️ 8     🖥️ 8     ⚖  
 ├─ ⏱ 4' 8" 32ms      📋 268   📄 2     🛠️ 9     🛠️ 7     🖥️ 5     ⚖  
 ├─ ⏱ 5' 9" 119ms     📋 322   📄 5     🛠️ 9     🛠️ 3     🖥️ 1     ⚖  
 ├─ ⏱ 6' 11" 942ms    📋 382   📄 8     🛠️ 9     🛠️ 1     🖥️ 45    ⚖  
 ├─ ⏱ 7' 11" 981ms    📋 436   📄 2     🛠️ 8     🛠️ 1     🖥️ 38    ⚖  
 ├─ ⏱ 8' 13" 330ms    📋 486   📄 4     🛠️ 7     🛠️ 9     🖥️ 31    ⚖  
 ├─ ⏱ 9' 14" 573ms    📋 554   📄 4     🛠️ 7     🛠️ 1     🖥️ 47    ⚖  
 ├─ ⏱ 10' 17" 570ms   📋 607   📄 4     🛠️ 6     🛠️ 8     🖥️ 10    ⚖  
 ├─ ⏱ 11' 17" 930ms   📋 661   📄 1     🛠️ 6     🛠️ 0     🖥️ 46    ⚖  
 ├─ ⏱ 12' 17" 936ms   📋 722   📄 7     🛠️ 5     🛠️ 8     🖥️ 2     ⚖  
 ├─ ⏱ 13' 18" 771ms   📋 782   📄 2     🛠️ 5     🛠️ 0     🖥️ 17    ⚖  
 ├─ ⏱ 14' 21" 670ms   📋 838   📄 10    🛠️ 5     🛠️ 6     🖥️ 29    ⚖  
 ├─ ⏱ 15' 22" 116ms   📋 895   📄 2     🛠️ 4     🛠️ 0     🖥️ 15    ⚖  
 ├─ ⏱ 16' 22" 180ms   📋 948   📄 5     🛠️ 3     🛠️ 9     🖥️ 4     ⚖  
 ├─ ⏱ 17' 22" 594ms   📋 1009  📄 4     🛠️ 3     🛠️ 0     🖥️ 36    ⚖  
 ├─ ⏱ 18' 22" 736ms   📋 1067  📄 9     🛠️ 3     🛠️ 0     🖥️ 13    ⚖  
 ├─ ⏱ 19' 26" 915ms   📋 1116  📄 4     🛠️ 2     🛠️ 0     🖥️ 31    ⚖  
 ├─ ⏱ 20' 33" 623ms   📋 1177  📄 5     🛠️ 1     🛠️ 7     🖥️ 31    ⚖  
 ├─ ⏱ 21' 36" 409ms   📋 1239  📄 4     🛠️ 0     🛠️ 11    🖥️ 43    ⚖  
 ├─ ⏱ 22' 36" 483ms   📋 1291  📄 1     🛠️ 0     🛠️ 4     🖥️ 14    ⚖  
 ├─ ⏱ 23' 38" 402ms   📋 1320  📄 10    🛠️ 0     🛠️ 10    🖥️ 6     ⚖  
 ├─ ⏱ 24' 39" 199ms   📋 1320  📄 10    🛠️ 0     🛠️ 4     🖥️ 3     ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioIterativo.csv gravado.
 │  ⏱  Tempo real: 25' 16" 730ms 
 │  ⏱  CPU total: 19h 48' 6" 292ms 
 │  ⏱  Espera do gestor: 25' 16" 675ms 
 │  ⏱  Espera trabalhadores: 1h 8' 22" 444ms 
 │  📊  Utilização:
 │  - Total: 92.3%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 94.2% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 25' 16" 730ms ) ═══

Podemos ver agora a eficácia do jogador das brancas:

P11(BARALHAR_SUCESSORES) P12(ORDENAR_SUCESSORES) 1:MiniMax 2:MiniMax alfa/beta
ID ID 0,5 0,64
Heurística 0,55 0,68
Memória 0,51 0,7
Baralhar ID 0,51 0,65
Heurística 0,55 0,64
Memória 0,62 0,64
Total Geral 0,54 0,66

E do jogador das pretas:

P11(BARALHAR_SUCESSORES) P12(ORDENAR_SUCESSORES) 1:MiniMax 2:MiniMax alfa/beta
ID ID 0,41 0,39
Heurística 0,28 0,45
Memória 0,36 0,44
Baralhar ID 0,32 0,46
Heurística 0,36 0,49
Memória 0,36 0,49
Total Geral 0,35 0,45

Em ambos os casos o MiniMax com cortes alfa/beta é mais eficaz em cerca de 10%. A ordenação dos sucessores por heurística ou memória traz vantagens embora não tão evidentes. A utilização de memória vs ordenação por heurística, não aparenta existir vantagens. Esta situação pode ser devida ao facto de utilizarmos apenas 1 segundo por jogada, e a vantagem de recuperar uma posição já vista é menos vincada. A baralhação dos sucessores não aparenta trazer vantagem, mas também não prejudica grandemente, pelo que passamos a utilizar para poder fazer vários jogos entre duas configurações.

Na tabela de resultados por instância, podemos ver o seguinte:

Instância Vitória Preta Empate Vitória Branca
1 132
2 1 40 91
3 1 12 119
4 53 18 61
5 49 83
6 67 2 63
7 11 104 17
8 13 95 24
9 132
10 132
Total Geral 195 667 458

As instâncias iniciais, apenas a 1 tem apenas empates, as restantes têm agora mais vitórias brancas que empates. As instâncias de gravidade mantêm-se equilibradas e com empates raros. As instâncias maiores mantêm o empate como resultado mais provável.

Naturalmente que mais tempo por jogada os resultados podem ser diferentes.

Ação 6 - Torneio Heurística

Vamos agora estudar o impacto da heurística na eficácia do jogador.

Temos o parâmetro HEUR_BASE - Valor base para diferença entre ameaças de K e K-1, em que 100 corresponde a 1 (não há diferença).

Valores testados: P15=101,110,125,150,200,250,300,400,600,800 São 10 valores para o peso, desde não ter praticamente aumento até 8 vezes em cada nível. Colocamos o número de sementes a 2, com P3=1,2 o que duplica todas as configurações. Assim existem 4 jogos entre cada duas configurações em cada instância.

  • Tipo de Teste / Objetivo: Eficácia (HEUR_BASE)
  • Definição: Instâncias: 1:10; Configurações: P7=0 P1=2 P12=1 P11=1 P15=101,110,125,150,200,250,300,400,600,800
  • Esforço: P3=1,2
  • Execução: TProcuraAdversa 2 1:10 -R Resultados/TorneioHeuristica -M 1 -P P2=2 P4=1 P7=0 P1=2 P12=1 P11=1 P3=1,2 x P15=101,110,125,150,200,250,300,400,600,800
Ver script: torneioHeuristica.sh
#!/bin/bash
#SBATCH --job-name=torneioHeuristica
#SBATCH --output=Resultados/torneioHeuristica.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: torneioHeuristica
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioHeuristica -M 1 \
  -P P2=2 P4=1 P7=0 P1=2 P12=1 P11=1 P3=1,2 x P15=101,110,125,150,200,250,300,400,600,800
Ver execução:

═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P1=2 P2=2 P3=1 P4=1 P5=0 P6=4 P7=0 P8=1 P11=1 P12=1 P13=0 P14=0 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P15=100 P16=10
 ├─ ⚙  [2] ─ P15=150 P16=10
 ├─ ⚙  [3] ─ P15=200 P16=10
 │ ...
 ├─ ⚙  [34] ─ P15=300 P16=500
 ├─ ⚙  [35] ─ P15=400 P16=500
 ├─ ⚙  [36] ─ P15=800 P16=500
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:12600   📄 Instâncias: 10   🛠️ Configurações: 36   🖥️ Processos: 48.
 ├─ ⏱ 1' 313ms        📋 113   📄 6     🛠️ 35    🛠️ 29    🖥️ 19    ⚖  
 ├─ ⏱ 2' 323ms        📋 186   📄 3     🛠️ 35    🛠️ 18    🖥️ 4     ⚖  
 ├─ ⏱ 3' 973ms        📋 266   📄 9     🛠️ 35    🛠️ 19    🖥️ 36    ⚖  
 ├─ ⏱ 4' 1" 777ms     📋 342   📄 8     🛠️ 35    🛠️ 9     🖥️ 29    ⚖  
 ├─ ⏱ 5' 2" 351ms     📋 415   📄 7     🛠️ 34    🛠️ 30    🖥️ 40    ⚖  
 ├─ ⏱ 6' 3" 566ms     📋 489   📄 6     🛠️ 34    🛠️ 27    🖥️ 37    ⚖  
 ├─ ⏱ 7' 3" 654ms     📋 558   📄 5     🛠️ 34    🛠️ 17    🖥️ 34    ⚖  
 ├─ ⏱ 8' 4" 668ms     📋 633   📄 9     🛠️ 34    🛠️ 17    🖥️ 18    ⚖  
 ├─ ⏱ 9' 4" 981ms     📋 713   📄 8     🛠️ 34    🛠️ 0     🖥️ 38    ⚖  
 ├─ ⏱ 10' 5" 150ms    📋 778   📄 3     🛠️ 33    🛠️ 28    🖥️ 22    ⚖  
 ├─ ⏱ 11' 6" 135ms    📋 841   📄 10    🛠️ 33    🛠️ 23    🖥️ 24    ⚖  
 ├─ ⏱ 12' 8" 111ms    📋 908   📄 5     🛠️ 33    🛠️ 17    🖥️ 30    ⚖  
 ├─ ⏱ 13' 8" 162ms    📋 976   📄 8     🛠️ 33    🛠️ 11    🖥️ 44    ⚖  
 ├─ ⏱ 14' 8" 297ms    📋 1046  📄 3     🛠️ 33    🛠️ 2     🖥️ 1     ⚖  
 ├─ ⏱ 15' 10" 579ms   📋 1106  📄 9     🛠️ 33    🛠️ 3     🖥️ 45    ⚖  
 ├─ ⏱ 16' 11" 725ms   📋 1167  📄 9     🛠️ 32    🛠️ 31    🖥️ 41    ⚖  
 ├─ ⏱ 17' 11" 749ms   📋 1227  📄 6     🛠️ 32    🛠️ 22    🖥️ 33    ⚖  
 ├─ ⏱ 18' 12" 621ms   📋 1292  📄 6     🛠️ 32    🛠️ 16    🖥️ 14    ⚖  
 ├─ ⏱ 19' 12" 645ms   📋 1360  📄 1     🛠️ 32    🛠️ 4     🖥️ 15    ⚖  
 ├─ ⏱ 20' 13" 103ms   📋 1423  📄 5     🛠️ 31    🛠️ 35    🖥️ 35    ⚖  
 ├─ ⏱ 21' 14" 323ms   📋 1478  📄 8     🛠️ 31    🛠️ 34    🖥️ 47    ⚖  
 ├─ ⏱ 22' 14" 878ms   📋 1536  📄 10    🛠️ 31    🛠️ 34    🖥️ 43    ⚖  
 ├─ ⏱ 23' 15" 389ms   📋 1591  📄 8     🛠️ 31    🛠️ 22    🖥️ 29    ⚖  
 ├─ ⏱ 24' 15" 667ms   📋 1646  📄 9     🛠️ 31    🛠️ 18    🖥️ 38    ⚖  
 ├─ ⏱ 25' 17" 517ms   📋 1704  📄 9     🛠️ 31    🛠️ 12    🖥️ 23    ⚖  
 ├─ ⏱ 26' 19" 105ms   📋 1766  📄 6     🛠️ 31    🛠️ 3     🖥️ 44    ⚖  
 ├─ ⏱ 27' 19" 837ms   📋 1835  📄 7     🛠️ 31    🛠️ 0     🖥️ 40    ⚖  
 ├─ ⏱ 28' 21" 559ms   📋 1903  📄 2     🛠️ 30    🛠️ 20    🖥️ 20    ⚖  
 ├─ ⏱ 29' 21" 677ms   📋 1962  📄 7     🛠️ 30    🛠️ 22    🖥️ 9     ⚖  
 ├─ ⏱ 30' 21" 981ms   📋 2028  📄 8     🛠️ 30    🛠️ 9     🖥️ 12    ⚖  
 ├─ ⏱ 31' 22" 926ms   📋 2096  📄 2     🛠️ 30    🛠️ 1     🖥️ 21    ⚖  
 ├─ ⏱ 32' 23" 10ms    📋 2159  📄 4     🛠️ 29    🛠️ 32    🖥️ 16    ⚖  
 ├─ ⏱ 33' 23" 387ms   📋 2235  📄 9     🛠️ 29    🛠️ 25    🖥️ 7     ⚖  
 ├─ ⏱ 34' 25" 16ms    📋 2311  📄 7     🛠️ 29    🛠️ 17    🖥️ 21    ⚖  
 ├─ ⏱ 35' 25" 127ms   📋 2386  📄 2     🛠️ 29    🛠️ 7     🖥️ 19    ⚖  
 ├─ ⏱ 36' 25" 532ms   📋 2463  📄 8     🛠️ 29    🛠️ 1     🖥️ 26    ⚖  
 ├─ ⏱ 37' 26" 403ms   📋 2535  📄 2     🛠️ 28    🛠️ 27    🖥️ 34    ⚖  
 ├─ ⏱ 38' 27" 848ms   📋 2601  📄 2     🛠️ 28    🛠️ 20    🖥️ 35    ⚖  
 ├─ ⏱ 39' 28" 778ms   📋 2676  📄 2     🛠️ 28    🛠️ 13    🖥️ 32    ⚖  
 ├─ ⏱ 40' 29" 852ms   📋 2756  📄 10    🛠️ 28    🛠️ 20    🖥️ 1     ⚖  
 ├─ ⏱ 41' 31" 670ms   📋 2835  📄 7     🛠️ 27    🛠️ 35    🖥️ 23    ⚖  
 ├─ ⏱ 42' 32" 210ms   📋 2895  📄 8     🛠️ 27    🛠️ 33    🖥️ 31    ⚖  
 ├─ ⏱ 43' 33" 117ms   📋 2959  📄 3     🛠️ 27    🛠️ 20    🖥️ 20    ⚖  
 ├─ ⏱ 44' 34" 31ms    📋 3026  📄 3     🛠️ 27    🛠️ 13    🖥️ 45    ⚖  
 ├─ ⏱ 45' 34" 113ms   📋 3094  📄 6     🛠️ 27    🛠️ 11    🖥️ 2     ⚖  
 ├─ ⏱ 46' 34" 338ms   📋 3164  📄 2     🛠️ 26    🛠️ 35    🖥️ 11    ⚖  
 ├─ ⏱ 47' 35" 185ms   📋 3222  📄 4     🛠️ 26    🛠️ 31    🖥️ 42    ⚖  
 ├─ ⏱ 48' 36" 649ms   📋 3282  📄 9     🛠️ 26    🛠️ 31    🖥️ 43    ⚖  
 ├─ ⏱ 49' 36" 981ms   📋 3348  📄 4     🛠️ 26    🛠️ 18    🖥️ 6     ⚖  
 ├─ ⏱ 50' 37" 384ms   📋 3411  📄 5     🛠️ 26    🛠️ 13    🖥️ 36    ⚖  
 ├─ ⏱ 51' 38" 731ms   📋 3479  📄 10    🛠️ 26    🛠️ 16    🖥️ 22    ⚖  
 ├─ ⏱ 52' 39" 176ms   📋 3537  📄 6     🛠️ 26    🛠️ 1     🖥️ 23    ⚖  
 ├─ ⏱ 53' 40" 33ms    📋 3594  📄 9     🛠️ 25    🛠️ 34    🖥️ 1     ⚖  
 ├─ ⏱ 54' 40" 65ms    📋 3649  📄 8     🛠️ 25    🛠️ 27    🖥️ 12    ⚖  
 ├─ ⏱ 55' 40" 512ms   📋 3702  📄 4     🛠️ 25    🛠️ 17    🖥️ 31    ⚖  
 ├─ ⏱ 56' 41" 547ms   📋 3763  📄 5     🛠️ 25    🛠️ 10    🖥️ 1     ⚖  
 ├─ ⏱ 57' 42" 406ms   📋 3823  📄 8     🛠️ 25    🛠️ 9     🖥️ 27    ⚖  
 ├─ ⏱ 58' 43" 398ms   📋 3882  📄 3     🛠️ 24    🛠️ 34    🖥️ 9     ⚖  
 ├─ ⏱ 59' 44" 125ms   📋 3948  📄 4     🛠️ 24    🛠️ 28    🖥️ 3     ⚖  
 ├─ ⏱ 1h 45" 204ms    📋 4017  📄 4     🛠️ 24    🛠️ 21    🖥️ 11    ⚖  
 ├─ ⏱ 1h 1' 46" 193ms  📋 4078  📄 4     🛠️ 24    🛠️ 14    🖥️ 43    ⚖  
 ├─ ⏱ 1h 2' 46" 568ms  📋 4147  📄 6     🛠️ 24    🛠️ 11    🖥️ 25    ⚖  
 ├─ ⏱ 1h 3' 47" 702ms  📋 4212  📄 3     🛠️ 24    🛠️ 0     🖥️ 13    ⚖  
 ├─ ⏱ 1h 4' 48" 504ms  📋 4283  📄 10    🛠️ 24    🛠️ 6     🖥️ 20    ⚖  
 ├─ ⏱ 1h 5' 49" 437ms  📋 4353  📄 2     🛠️ 23    🛠️ 20    🖥️ 47    ⚖  
 ├─ ⏱ 1h 6' 49" 613ms  📋 4426  📄 4     🛠️ 23    🛠️ 15    🖥️ 23    ⚖  
 ├─ ⏱ 1h 7' 50" 176ms  📋 4501  📄 9     🛠️ 23    🛠️ 15    🖥️ 9     ⚖  
 ├─ ⏱ 1h 8' 51" 855ms  📋 4578  📄 4     🛠️ 22    🛠️ 35    🖥️ 23    ⚖  
 ├─ ⏱ 1h 9' 53" 631ms  📋 4648  📄 3     🛠️ 22    🛠️ 27    🖥️ 29    ⚖  
 ├─ ⏱ 1h 10' 54" 403ms  📋 4718  📄 5     🛠️ 22    🛠️ 24    🖥️ 47    ⚖  
 ├─ ⏱ 1h 11' 56" 48ms  📋 4795  📄 2     🛠️ 22    🛠️ 11    🖥️ 36    ⚖  
 ├─ ⏱ 1h 12' 56" 92ms  📋 4877  📄 6     🛠️ 22    🛠️ 9     🖥️ 24    ⚖  
 ├─ ⏱ 1h 13' 56" 266ms  📋 4945  📄 5     🛠️ 21    🛠️ 35    🖥️ 40    ⚖  
 ├─ ⏱ 1h 15' 204ms    📋 5009  📄 3     🛠️ 21    🛠️ 26    🖥️ 2     ⚖  
 ├─ ⏱ 1h 16' 1" 268ms  📋 5078  📄 8     🛠️ 21    🛠️ 20    🖥️ 29    ⚖  
 ├─ ⏱ 1h 17' 1" 426ms  📋 5144  📄 3     🛠️ 21    🛠️ 12    🖥️ 4     ⚖  
 ├─ ⏱ 1h 18' 1" 673ms  📋 5207  📄 7     🛠️ 21    🛠️ 13    🖥️ 47    ⚖  
 ├─ ⏱ 1h 19' 2" 457ms  📋 5276  📄 5     🛠️ 20    🛠️ 35    🖥️ 4     ⚖  
 ├─ ⏱ 1h 20' 2" 602ms  📋 5332  📄 4     🛠️ 20    🛠️ 30    🖥️ 26    ⚖  
 ├─ ⏱ 1h 21' 2" 734ms  📋 5395  📄 2     🛠️ 20    🛠️ 22    🖥️ 4     ⚖  
 ├─ ⏱ 1h 22' 2" 776ms  📋 5459  📄 8     🛠️ 20    🛠️ 22    🖥️ 6     ⚖  
 ├─ ⏱ 1h 23' 2" 874ms  📋 5524  📄 6     🛠️ 20    🛠️ 13    🖥️ 18    ⚖  
 ├─ ⏱ 1h 24' 4" 191ms  📋 5589  📄 5     🛠️ 20    🛠️ 6     🖥️ 41    ⚖  
 ├─ ⏱ 1h 25' 7" 293ms  📋 5646  📄 8     🛠️ 20    🛠️ 1     🖥️ 19    ⚖  
 ├─ ⏱ 1h 26' 7" 434ms  📋 5706  📄 6     🛠️ 19    🛠️ 30    🖥️ 2     ⚖  
 ├─ ⏱ 1h 27' 10" 752ms  📋 5762  📄 6     🛠️ 19    🛠️ 24    🖥️ 34    ⚖  
 ├─ ⏱ 1h 28' 12" 446ms  📋 5818  📄 8     🛠️ 19    🛠️ 20    🖥️ 25    ⚖  
 ├─ ⏱ 1h 29' 16" 282ms  📋 5879  📄 3     🛠️ 19    🛠️ 8     🖥️ 35    ⚖  
 ├─ ⏱ 1h 30' 16" 349ms  📋 5942  📄 6     🛠️ 19    🛠️ 6     🖥️ 20    ⚖  
 ├─ ⏱ 1h 31' 16" 579ms  📋 6002  📄 7     🛠️ 19    🛠️ 3     🖥️ 39    ⚖  
 ├─ ⏱ 1h 32' 17" 150ms  📋 6069  📄 9     🛠️ 18    🛠️ 33    🖥️ 46    ⚖  
 ├─ ⏱ 1h 33' 18" 42ms  📋 6134  📄 3     🛠️ 18    🛠️ 19    🖥️ 14    ⚖  
 ├─ ⏱ 1h 34' 18" 185ms  📋 6199  📄 8     🛠️ 18    🛠️ 17    🖥️ 28    ⚖  
 ├─ ⏱ 1h 35' 18" 644ms  📋 6264  📄 4     🛠️ 18    🛠️ 6     🖥️ 30    ⚖  
 ├─ ⏱ 1h 36' 19" 226ms  📋 6328  📄 8     🛠️ 18    🛠️ 4     🖥️ 37    ⚖  
 ├─ ⏱ 1h 37' 20" 692ms  📋 6414  📄 5     🛠️ 17    🛠️ 33    🖥️ 29    ⚖  
 ├─ ⏱ 1h 38' 20" 771ms  📋 6494  📄 6     🛠️ 17    🛠️ 18    🖥️ 34    ⚖  
 ├─ ⏱ 1h 39' 21" 69ms  📋 6576  📄 2     🛠️ 17    🛠️ 8     🖥️ 34    ⚖  
 ├─ ⏱ 1h 40' 21" 581ms  📋 6658  📄 9     🛠️ 17    🛠️ 3     🖥️ 31    ⚖  
 ├─ ⏱ 1h 41' 22" 349ms  📋 6729  📄 3     🛠️ 16    🛠️ 29    🖥️ 29    ⚖  
 ├─ ⏱ 1h 42' 23" 842ms  📋 6799  📄 4     🛠️ 16    🛠️ 23    🖥️ 21    ⚖  
 ├─ ⏱ 1h 43' 23" 896ms  📋 6870  📄 1     🛠️ 16    🛠️ 13    🖥️ 36    ⚖  
 ├─ ⏱ 1h 44' 24" 179ms  📋 6945  📄 6     🛠️ 16    🛠️ 12    🖥️ 12    ⚖  
 ├─ ⏱ 1h 45' 24" 357ms  📋 7028  📄 2     🛠️ 15    🛠️ 34    🖥️ 21    ⚖  
 ├─ ⏱ 1h 46' 24" 973ms  📋 7084  📄 7     🛠️ 15    🛠️ 29    🖥️ 15    ⚖  
 ├─ ⏱ 1h 47' 25" 770ms  📋 7148  📄 4     🛠️ 15    🛠️ 23    🖥️ 39    ⚖  
 ├─ ⏱ 1h 48' 25" 913ms  📋 7215  📄 5     🛠️ 15    🛠️ 18    🖥️ 17    ⚖  
 ├─ ⏱ 1h 49' 27" 462ms  📋 7283  📄 2     🛠️ 15    🛠️ 7     🖥️ 17    ⚖  
 ├─ ⏱ 1h 50' 27" 550ms  📋 7353  📄 10    🛠️ 15    🛠️ 0     🖥️ 20    ⚖  
 ├─ ⏱ 1h 51' 30" 881ms  📋 7416  📄 10    🛠️ 15    🛠️ 7     🖥️ 24    ⚖  
 ├─ ⏱ 1h 52' 33" 520ms  📋 7477  📄 6     🛠️ 14    🛠️ 28    🖥️ 33    ⚖  
 ├─ ⏱ 1h 53' 34" 149ms  📋 7538  📄 3     🛠️ 14    🛠️ 18    🖥️ 42    ⚖  
 ├─ ⏱ 1h 54' 34" 179ms  📋 7605  📄 8     🛠️ 14    🛠️ 11    🖥️ 38    ⚖  
 ├─ ⏱ 1h 55' 34" 190ms  📋 7676  📄 2     🛠️ 14    🛠️ 3     🖥️ 3     ⚖  
 ├─ ⏱ 1h 56' 35" 77ms  📋 7735  📄 2     🛠️ 13    🛠️ 33    🖥️ 24    ⚖  
 ├─ ⏱ 1h 57' 36" 831ms  📋 7788  📄 8     🛠️ 13    🛠️ 33    🖥️ 15    ⚖  
 ├─ ⏱ 1h 58' 36" 889ms  📋 7845  📄 7     🛠️ 13    🛠️ 29    🖥️ 4     ⚖  
 ├─ ⏱ 1h 59' 37" 280ms  📋 7899  📄 8     🛠️ 13    🛠️ 22    🖥️ 44    ⚖  
 ├─ ⏱ 2h 37" 509ms    📋 7957  📄 6     🛠️ 13    🛠️ 15    🖥️ 36    ⚖  
 ├─ ⏱ 2h 1' 37" 557ms  📋 8018  📄 2     🛠️ 13    🛠️ 4     🖥️ 2     ⚖  
 ├─ ⏱ 2h 2' 37" 681ms  📋 8075  📄 2     🛠️ 12    🛠️ 34    🖥️ 23    ⚖  
 ├─ ⏱ 2h 3' 38" 478ms  📋 8143  📄 8     🛠️ 12    🛠️ 34    🖥️ 28    ⚖  
 ├─ ⏱ 2h 4' 41" 110ms  📋 8208  📄 9     🛠️ 12    🛠️ 29    🖥️ 17    ⚖  
 ├─ ⏱ 2h 5' 42" 366ms  📋 8271  📄 6     🛠️ 12    🛠️ 19    🖥️ 17    ⚖  
 ├─ ⏱ 2h 6' 42" 597ms  📋 8343  📄 8     🛠️ 12    🛠️ 14    🖥️ 2     ⚖  
 ├─ ⏱ 2h 7' 42" 842ms  📋 8405  📄 10    🛠️ 12    🛠️ 14    🖥️ 39    ⚖  
 ├─ ⏱ 2h 8' 42" 921ms  📋 8477  📄 5     🛠️ 12    🛠️ 0     🖥️ 25    ⚖  
 ├─ ⏱ 2h 9' 43" 469ms  📋 8562  📄 8     🛠️ 11    🛠️ 21    🖥️ 31    ⚖  
 ├─ ⏱ 2h 10' 44" 249ms  📋 8654  📄 2     🛠️ 11    🛠️ 10    🖥️ 32    ⚖  
 ├─ ⏱ 2h 11' 44" 988ms  📋 8733  📄 3     🛠️ 11    🛠️ 3     🖥️ 11    ⚖  
 ├─ ⏱ 2h 12' 46" 490ms  📋 8813  📄 5     🛠️ 10    🛠️ 34    🖥️ 2     ⚖  
 ├─ ⏱ 2h 13' 46" 956ms  📋 8888  📄 10    🛠️ 10    🛠️ 26    🖥️ 8     ⚖  
 ├─ ⏱ 2h 14' 47" 464ms  📋 8964  📄 3     🛠️ 10    🛠️ 16    🖥️ 5     ⚖  
 ├─ ⏱ 2h 15' 48" 27ms  📋 9039  📄 10    🛠️ 10    🛠️ 23    🖥️ 2     ⚖  
 ├─ ⏱ 2h 16' 48" 892ms  📋 9124  📄 4     🛠️ 10    🛠️ 1     🖥️ 38    ⚖  
 ├─ ⏱ 2h 17' 49" 311ms  📋 9185  📄 7     🛠️ 9     🛠️ 29    🖥️ 43    ⚖  
 ├─ ⏱ 2h 18' 49" 509ms  📋 9248  📄 4     🛠️ 9     🛠️ 23    🖥️ 1     ⚖  
 ├─ ⏱ 2h 19' 49" 698ms  📋 9314  📄 5     🛠️ 9     🛠️ 18    🖥️ 15    ⚖  
 ├─ ⏱ 2h 20' 50" 382ms  📋 9379  📄 8     🛠️ 9     🛠️ 15    🖥️ 13    ⚖  
 ├─ ⏱ 2h 21' 50" 882ms  📋 9454  📄 5     🛠️ 9     🛠️ 4     🖥️ 22    ⚖  
 ├─ ⏱ 2h 22' 53" 984ms  📋 9516  📄 9     🛠️ 9     🛠️ 2     🖥️ 46    ⚖  
 ├─ ⏱ 2h 23' 56" 984ms  📋 9577  📄 6     🛠️ 8     🛠️ 28    🖥️ 13    ⚖  
 ├─ ⏱ 2h 24' 57" 363ms  📋 9638  📄 3     🛠️ 8     🛠️ 18    🖥️ 27    ⚖  
 ├─ ⏱ 2h 25' 57" 630ms  📋 9703  📄 2     🛠️ 8     🛠️ 11    🖥️ 27    ⚖  
 ├─ ⏱ 2h 26' 58" 831ms  📋 9776  📄 2     🛠️ 8     🛠️ 3     🖥️ 17    ⚖  
 ├─ ⏱ 2h 28' 2" 113ms  📋 9836  📄 8     🛠️ 8     🛠️ 3     🖥️ 34    ⚖  
 ├─ ⏱ 2h 29' 2" 482ms  📋 9891  📄 3     🛠️ 7     🛠️ 28    🖥️ 19    ⚖  
 ├─ ⏱ 2h 30' 3" 510ms  📋 9947  📄 5     🛠️ 7     🛠️ 23    🖥️ 41    ⚖  
 ├─ ⏱ 2h 31' 5" 956ms  📋 10002 📄 6     🛠️ 7     🛠️ 20    🖥️ 39    ⚖  
 ├─ ⏱ 2h 32' 9" 516ms  📋 10064 📄 2     🛠️ 7     🛠️ 10    🖥️ 4     ⚖  
 ├─ ⏱ 2h 33' 9" 608ms  📋 10125 📄 2     🛠️ 7     🛠️ 3     🖥️ 35    ⚖  
 ├─ ⏱ 2h 34' 9" 664ms  📋 10186 📄 8     🛠️ 7     🛠️ 3     🖥️ 43    ⚖  
 ├─ ⏱ 2h 35' 10" 294ms  📋 10249 📄 3     🛠️ 6     🛠️ 27    🖥️ 40    ⚖  
 ├─ ⏱ 2h 36' 10" 599ms  📋 10313 📄 6     🛠️ 6     🛠️ 25    🖥️ 2     ⚖  
 ├─ ⏱ 2h 37' 10" 751ms  📋 10377 📄 7     🛠️ 6     🛠️ 15    🖥️ 8     ⚖  
 ├─ ⏱ 2h 38' 11" 385ms  📋 10442 📄 10    🛠️ 6     🛠️ 20    🖥️ 41    ⚖  
 ├─ ⏱ 2h 39' 12" 468ms  📋 10509 📄 3     🛠️ 6     🛠️ 0     🖥️ 34    ⚖  
 ├─ ⏱ 2h 40' 13" 182ms  📋 10591 📄 3     🛠️ 5     🛠️ 29    🖥️ 4     ⚖  
 ├─ ⏱ 2h 41' 14" 833ms  📋 10682 📄 2     🛠️ 5     🛠️ 18    🖥️ 30    ⚖  
 ├─ ⏱ 2h 42' 15" 131ms  📋 10784 📄 2     🛠️ 5     🛠️ 8     🖥️ 16    ⚖  
 ├─ ⏱ 2h 43' 15" 906ms  📋 10886 📄 2     🛠️ 4     🛠️ 33    🖥️ 28    ⚖  
 ├─ ⏱ 2h 44' 16" 202ms  📋 10963 📄 8     🛠️ 4     🛠️ 34    🖥️ 17    ⚖  
 ├─ ⏱ 2h 45' 17" 378ms  📋 11039 📄 8     🛠️ 4     🛠️ 25    🖥️ 11    ⚖  
 ├─ ⏱ 2h 46' 18" 553ms  📋 11121 📄 10    🛠️ 4     🛠️ 16    🖥️ 11    ⚖  
 ├─ ⏱ 2h 47' 18" 609ms  📋 11198 📄 8     🛠️ 4     🛠️ 10    🖥️ 25    ⚖  
 ├─ ⏱ 2h 48' 21" 122ms  📋 11269 📄 10    🛠️ 4     🛠️ 10    🖥️ 41    ⚖  
 ├─ ⏱ 2h 49' 21" 622ms  📋 11331 📄 3     🛠️ 3     🛠️ 24    🖥️ 43    ⚖  
 ├─ ⏱ 2h 50' 23" 187ms  📋 11396 📄 9     🛠️ 3     🛠️ 25    🖥️ 16    ⚖  
 ├─ ⏱ 2h 51' 26" 896ms  📋 11459 📄 2     🛠️ 3     🛠️ 10    🖥️ 47    ⚖  
 ├─ ⏱ 2h 52' 27" 897ms  📋 11526 📄 8     🛠️ 3     🛠️ 10    🖥️ 34    ⚖  
 ├─ ⏱ 2h 53' 28" 16ms  📋 11594 📄 7     🛠️ 2     🛠️ 35    🖥️ 21    ⚖  
 ├─ ⏱ 2h 54' 30" 530ms  📋 11655 📄 2     🛠️ 2     🛠️ 26    🖥️ 47    ⚖  
 ├─ ⏱ 2h 55' 30" 815ms  📋 11716 📄 9     🛠️ 2     🛠️ 22    🖥️ 25    ⚖  
 ├─ ⏱ 2h 56' 30" 990ms  📋 11779 📄 3     🛠️ 2     🛠️ 14    🖥️ 22    ⚖  
 ├─ ⏱ 2h 57' 31" 714ms  📋 11849 📄 5     🛠️ 2     🛠️ 10    🖥️ 22    ⚖  
 ├─ ⏱ 2h 58' 32" 999ms  📋 11914 📄 10    🛠️ 2     🛠️ 0     🖥️ 15    ⚖  
 ├─ ⏱ 2h 59' 33" 450ms  📋 11969 📄 4     🛠️ 1     🛠️ 31    🖥️ 44    ⚖  
 ├─ ⏱ 3h 33" 717ms    📋 12023 📄 2     🛠️ 1     🛠️ 24    🖥️ 9     ⚖  
 ├─ ⏱ 3h 1' 34" 713ms  📋 12079 📄 3     🛠️ 1     🛠️ 19    🖥️ 26    ⚖  
 ├─ ⏱ 3h 2' 34" 820ms  📋 12139 📄 6     🛠️ 1     🛠️ 17    🖥️ 38    ⚖  
 ├─ ⏱ 3h 3' 35" 856ms  📋 12194 📄 6     🛠️ 1     🛠️ 11    🖥️ 37    ⚖  
 ├─ ⏱ 3h 4' 40" 564ms  📋 12258 📄 7     🛠️ 1     🛠️ 8     🖥️ 22    ⚖  
 ├─ ⏱ 3h 5' 40" 786ms  📋 12324 📄 7     🛠️ 1     🛠️ 2     🖥️ 1     ⚖  
 ├─ ⏱ 3h 6' 42" 349ms  📋 12389 📄 8     🛠️ 0     🛠️ 29    🖥️ 32    ⚖  
 ├─ ⏱ 3h 7' 42" 787ms  📋 12456 📄 4     🛠️ 0     🛠️ 17    🖥️ 30    ⚖  
 ├─ ⏱ 3h 8' 42" 955ms  📋 12519 📄 4     🛠️ 0     🛠️ 11    🖥️ 14    ⚖  
 ├─ ⏱ 3h 9' 43" 56ms  📋 12586 📄 2     🛠️ 0     🛠️ 3     🖥️ 26    ⚖  
 ├─ ⏱ 3h 10' 50" 755ms  📋 12600 📄 6     🛠️ 0     🛠️ 1     🖥️ 39    ⚖  
 ├─ ⏱ 3h 11' 54" 997ms  📋 12600 📄 10    🛠️ 0     🛠️ 2     🖥️ 2     ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioHeuristica.csv gravado.
 │  ⏱  Tempo real: 3h 12' 6" 246ms 
 │  ⏱  CPU total: 6d 6h 28' 53" 564ms 
 │  ⏱  Espera do gestor: 3h 12' 6" 3ms 
 │  ⏱  Espera trabalhadores: 1h 11' 22" 830ms 
 │  📊  Utilização:
 │  - Total: 97.1%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 99.2% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 3h 12' 6" 249ms ) ═══

Temos resultados de várias instâncias.

Vamos primeiro apresentar os resultados por instância:

Instância Vitória Preta Empate Vitória Branca
1 380
2 2 260 118
3 74 306
4 120 28 232
5 128 252
6 203 12 165
7 51 198 131
8 22 250 108
9 364 16
10 71 233 76
Total Geral 597 1799 1404

Podemos agora observar nas instâncias maiores que embora ainda existam muitos empates, mesmo assim há vitórias e derrotas das brancas.

Vamos ver agora a eficácia por instância, para todas as configurações de brancas:

P15 1 2 3 4 5 6 7 8 9 10 Total Geral
101 0,5 0,64 0,78 0,67 0,61 0,34 0,36 0,43 0,5 0,21 0,5
110 0,5 0,62 0,5 0,66 0,63 0,36 0,49 0,47 0,5 0,21 0,49
125 0,5 0,67 0,75 0,63 0,74 0,39 0,36 0,49 0,5 0,32 0,53
150 0,5 0,63 1 0,54 0,74 0,33 0,5 0,49 0,5 0,34 0,56
200 0,5 0,64 1 0,83 0,68 0,42 0,61 0,57 0,55 0,61 0,64
250 0,5 0,66 1 0,63 0,58 0,54 0,68 0,7 0,66 0,66 0,66
300 0,5 0,68 1 0,47 0,68 0,62 0,79 0,75 0,5 0,68 0,67
400 0,5 0,66 1 0,66 0,55 0,61 0,92 0,8 0,5 0,67 0,69
600 0,5 0,66 1 0,68 0,71 0,43 0,67 0,8 0,5 0,71 0,67
800 0,5 0,66 1 0,7 0,71 0,46 0,68 0,63 0,5 0,66 0,65
Total Geral 0,5 0,65 0,9 0,65 0,66 0,45 0,61 0,61 0,52 0,51 0,61

Eficácia de pretas:

P15 1 2 3 4 5 6 7 8 9 10 Total Geral
101 0,5 0,43 0,09 0,41 0,34 0,38 0,25 0,29 0,5 0,18 0,34
110 0,5 0,04 0,08 0,43 0,37 0,49 0,33 0,22 0,5 0,18 0,31
125 0,5 0,24 0,08 0,53 0,16 0,63 0,36 0,26 0,5 0,26 0,35
150 0,5 0 0,09 0,25 0,34 0,64 0,43 0,29 0,5 0,42 0,35
200 0,5 0,25 0,11 0,58 0,37 0,5 0,36 0,37 0,5 0,51 0,4
250 0,5 0,51 0,11 0,42 0,32 0,59 0,47 0,46 0,5 0,68 0,46
300 0,5 0,5 0,11 0,51 0,24 0,53 0,62 0,58 0,5 0,71 0,48
400 0,5 0,5 0,11 0,26 0,34 0,58 0,55 0,5 0,39 0,68 0,44
600 0,5 0,5 0,11 0,08 0,42 0,58 0,29 0,47 0,45 0,66 0,41
800 0,5 0,5 0,11 0,05 0,47 0,58 0,29 0,42 0,45 0,63 0,4
Total Geral 0,5 0,35 0,1 0,35 0,34 0,55 0,39 0,39 0,48 0,49 0,39

Podemos observar que:

  • a heurística tem forte impacto na eficácia, caso contrário existiriam apenas valores a rondar os 50%
  • na instância 10, a maior, pode-se ver uma eficiência a variar de 21% a 71% para as brancas, e de 18% a 71% para as pretas
  • a melhor configuração de brancas e pretas nem sempre coincide em cada instância

Vamos optar por P15=300, que tem boa eficácia em quase todas as instâncias, e é a que tem melhor eficácia global.

Ação 7 - Torneio Poda

Temos dois parâmetros para a poda da árvore de procura. A poda heurística (PODA_HEURISTICA) e a poda cega (PODA_CEGA). A poda cega é útil para quando há demasiados sucessores poder remover de forma aleatória, de modo a poder existir exploração. Mas neste caso temos a maior instância com 12 de lado, o maior número de sucessores a 121, o que é um valor baixo. Assim vamos testar apenas a poda heurística.

Vamos utilizar duas sementes, de modo a aumentar o número de jogos e reduzir o impacto da aleatoriedade.

  • Tipo de Teste / Objetivo: Eficácia (PODA_HEURISTICA)
  • Definição: Instâncias: 1:10; Configurações: P7=0 P1=2 P12=1 P11=1 P15=300 P13=0,4,8,16,32
  • Esforço: P3=1:2
  • Execução: TProcuraAdversa 2 1:10 -R Resultados/TorneioPoda -M 1 -P P2=2 P4=1 P7=0 P1=2 P12=1 P11=1 P15=300 P3=1:2 x P13=0,4,8,16,32
Ver script: torneioPoda.sh
#!/bin/bash
#SBATCH --job-name=torneioPoda
#SBATCH --output=Resultados/torneioPoda.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: torneioPoda
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioPoda -M 1 \
  -P P2=2 P4=1 P7=0 P1=2 P12=1 P11=1 P15=300 P3=1:2 x P13=0,4,8,16,32
Ver execução:

═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P1=2 P2=2 P4=1 P5=0 P6=4 P7=0 P8=1 P11=1 P12=1 P14=0 P15=300 P16=100 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P3=1 P13=0
 ├─ ⚙  [2] ─ P3=2 P13=0
 ├─ ⚙  [3] ─ P3=1 P13=4
 ├─ ⚙  [4] ─ P3=2 P13=4
 ├─ ⚙  [5] ─ P3=1 P13=8
 ├─ ⚙  [6] ─ P3=2 P13=8
 ├─ ⚙  [7] ─ P3=1 P13=16
 ├─ ⚙  [8] ─ P3=2 P13=16
 ├─ ⚙  [9] ─ P3=1 P13=32
 ├─ ⚙  [10] ─ P3=2 P13=32
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:900   📄 Instâncias: 10   🛠️ Configurações: 10   🖥️ Processos: 48.
 ├─ ⏱ 1' 115ms        📋 94    📄 2     🛠️ 9     🛠️ 0     🖥️ 3     ⚖  
 ├─ ⏱ 2' 6" 674ms     📋 153   📄 5     🛠️ 8     🛠️ 3     🖥️ 31    ⚖  
 ├─ ⏱ 3' 8" 15ms      📋 213   📄 7     🛠️ 8     🛠️ 4     🖥️ 44    ⚖  
 ├─ ⏱ 4' 8" 746ms     📋 272   📄 2     🛠️ 7     🛠️ 0     🖥️ 1     ⚖  
 ├─ ⏱ 5' 9"           📋 328   📄 10    🛠️ 7     🛠️ 6     🖥️ 30    ⚖  
 ├─ ⏱ 6' 10" 56ms     📋 381   📄 10    🛠️ 7     🛠️ 0     🖥️ 2     ⚖  
 ├─ ⏱ 7' 10" 177ms    📋 437   📄 3     🛠️ 5     🛠️ 2     🖥️ 8     ⚖  
 ├─ ⏱ 8' 10" 574ms    📋 496   📄 10    🛠️ 5     🛠️ 8     🖥️ 33    ⚖  
 ├─ ⏱ 9' 12" 95ms     📋 558   📄 3     🛠️ 3     🛠️ 9     🖥️ 38    ⚖  
 ├─ ⏱ 10' 12" 296ms   📋 623   📄 2     🛠️ 3     🛠️ 1     🖥️ 14    ⚖  
 ├─ ⏱ 11' 13" 726ms   📋 698   📄 6     🛠️ 2     🛠️ 9     🖥️ 4     ⚖  
 ├─ ⏱ 12' 14" 350ms   📋 757   📄 4     🛠️ 1     🛠️ 8     🖥️ 11    ⚖  
 ├─ ⏱ 13' 16" 206ms   📋 821   📄 9     🛠️ 1     🛠️ 8     🖥️ 16    ⚖  
 ├─ ⏱ 14' 16" 321ms   📋 879   📄 6     🛠️ 0     🛠️ 8     🖥️ 26    ⚖  
 ├─ ⏱ 15' 18" 135ms   📋 900   📄 10    🛠️ 0     🛠️ 9     🖥️ 13    ⚖  
 ├─ ⏱ 16' 23" 306ms   📋 900   📄 10    🛠️ 0     🛠️ 3     🖥️ 3     ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioPoda.csv gravado.
 │  ⏱  Tempo real: 16' 42" 995ms 
 │  ⏱  CPU total: 13h 5' 40" 775ms 
 │  ⏱  Espera do gestor: 16' 42" 957ms 
 │  ⏱  Espera trabalhadores: 1h 6' 1" 448ms 
 │  📊  Utilização:
 │  - Total: 89.7%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 91.6% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 16' 42" 995ms ) ═══

Os resultados do torneio são os seguintes:

EficáciaBranco

P13 - 4 8 16 32
- 0,65 0,6 0,63 0,63 0,63
4 0,59 0,58 0,68 0,65 0,65
8 0,63 0,54 0,53 0,58 0,58
16 0,63 0,61 0,63 0,6 0,63
32 0,65 0,6 0,63 0,63 0,6

EficáciaPreto

P13 - 4 8 16 32
- 0,35 0,4 0,38 0,38 0,38
4 0,41 0,43 0,33 0,35 0,35
8 0,38 0,46 0,48 0,43 0,43
16 0,38 0,39 0,38 0,4 0,38
32 0,35 0,4 0,38 0,38 0,4

Nas linhas está o valor da poda branca, nas colunas o valor da poda preta. O conteúdo das tabelas é a eficácia do jogador branco e preto respetivamente.

Existem oscilações, mas pequenas. Assim não se parece que justifique o uso da poda heurística.

Assim sendo vamos manter o valor da poda heurística a 0, ou seja, sem poda.

Ação 8 - Torneio Ruido

Vamos agora estudar o efeito do ruído na heurística. Esperamos uma degradação da força de jogo, à medida que o ruído aumenta. É importante quantificar este efeito para podermos escolher valores adequados a diferentes níveis de jogo.

Este parâmetro define o valor K a adicionar à heurística, para testes de robustez. Se K positivo, adicionar entre 0 e K-1, se negativo, o valor a adicionar pode ser positivo ou negativo.

Vamos utilizar valores de ruído simétricos, ou seja, negativos, para não introduzir um viés positivo, de -100 a 0, com 8 valores possíveis. Vamos aumentar para 3 sementes para termos mais jogos por cada par de configurações.

  • Tipo de Teste / Objetivo: Eficácia (RUÍDO)
  • Definição: Instâncias: 1:10; Configurações: P7=0 P1=2 P12=1 P11=1 P15=300 P10=0,-1,-2,-5,-10,-20,-50,-100
  • Esforço: P3=1:3
  • Execução: TProcuraAdversa 2 1:10 -R Resultados/TorneioRuido -M 1 -P P2=2 P4=1 P7=0 P1=2 P12=1 P11=1 P15=300 P3=1:3 x P10=0,-1,-2,-5,-10,-20,-50,-100
Ver script: torneioRuido.sh
#!/bin/bash
#SBATCH --job-name=torneioRuido
#SBATCH --output=Resultados/torneioRuido.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: torneioRuido
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioRuido -M 1 \
  -P P2=2 P4=1 P7=0 P1=2 P12=1 P11=1 P15=300 P3=1:3 x P10=0,-1,-2,-5,-10,-20,-50,-100
Ver execução:

═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P1=2 P2=2 P4=1 P5=0 P6=4 P7=0 P8=1 P11=1 P12=1 P13=0 P14=0 P15=300 P16=100 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P3=1 
 ├─ ⚙  [2] ─ P3=2 
 ├─ ⚙  [3] ─ P3=1 
 │ ...
 ├─ ⚙  [20] ─ P3=2 
 ├─ ⚙  [21] ─ P3=1 
 ├─ ⚙  [22] ─ P3=2 
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:4620   📄 Instâncias: 10   🛠️ Configurações: 22   🖥️ Processos: 48.
 ├─ ⏱ 1' 1" 649ms     📋 98    📄 6     🛠️ 21    🛠️ 15    🖥️ 9     ⚖  
 ├─ ⏱ 2' 3" 271ms     📋 153   📄 2     🛠️ 21    🛠️ 6     🖥️ 40    ⚖  
 ├─ ⏱ 3' 3" 665ms     📋 218   📄 4     🛠️ 21    🛠️ 1     🖥️ 21    ⚖  
 ├─ ⏱ 4' 4" 470ms     📋 276   📄 4     🛠️ 20    🛠️ 16    🖥️ 45    ⚖  
 ├─ ⏱ 5' 5" 463ms     📋 333   📄 2     🛠️ 20    🛠️ 9     🖥️ 41    ⚖  
 ├─ ⏱ 6' 7" 636ms     📋 396   📄 2     🛠️ 20    🛠️ 3     🖥️ 20    ⚖  
 ├─ ⏱ 7' 10" 855ms    📋 457   📄 4     🛠️ 19    🛠️ 21    🖥️ 20    ⚖  
 ├─ ⏱ 8' 13" 435ms    📋 523   📄 6     🛠️ 19    🛠️ 16    🖥️ 40    ⚖  
 ├─ ⏱ 9' 14" 99ms     📋 584   📄 5     🛠️ 19    🛠️ 6     🖥️ 5     ⚖  
 ├─ ⏱ 10' 15" 739ms   📋 647   📄 8     🛠️ 19    🛠️ 5     🖥️ 25    ⚖  
 ├─ ⏱ 11' 17" 174ms   📋 702   📄 5     🛠️ 18    🛠️ 19    🖥️ 20    ⚖  
 ├─ ⏱ 12' 17" 338ms   📋 773   📄 4     🛠️ 18    🛠️ 9     🖥️ 33    ⚖  
 ├─ ⏱ 13' 17" 434ms   📋 835   📄 2     🛠️ 18    🛠️ 1     🖥️ 41    ⚖  
 ├─ ⏱ 14' 18" 747ms   📋 899   📄 9     🛠️ 18    🛠️ 3     🖥️ 24    ⚖  
 ├─ ⏱ 15' 19" 957ms   📋 963   📄 4     🛠️ 17    🛠️ 10    🖥️ 9     ⚖  
 ├─ ⏱ 16' 20" 318ms   📋 1021  📄 5     🛠️ 17    🛠️ 5     🖥️ 45    ⚖  
 ├─ ⏱ 17' 23" 231ms   📋 1086  📄 10    🛠️ 17    🛠️ 9     🖥️ 22    ⚖  
 ├─ ⏱ 18' 25" 274ms   📋 1152  📄 6     🛠️ 16    🛠️ 17    🖥️ 29    ⚖  
 ├─ ⏱ 19' 25" 322ms   📋 1217  📄 3     🛠️ 16    🛠️ 6     🖥️ 10    ⚖  
 ├─ ⏱ 20' 26" 342ms   📋 1279  📄 3     🛠️ 15    🛠️ 21    🖥️ 39    ⚖  
 ├─ ⏱ 21' 27" 685ms   📋 1341  📄 4     🛠️ 15    🛠️ 16    🖥️ 45    ⚖  
 ├─ ⏱ 22' 30" 992ms   📋 1405  📄 8     🛠️ 15    🛠️ 13    🖥️ 18    ⚖  
 ├─ ⏱ 23' 31" 134ms   📋 1473  📄 6     🛠️ 15    🛠️ 5     🖥️ 41    ⚖  
 ├─ ⏱ 24' 31" 290ms   📋 1535  📄 4     🛠️ 14    🛠️ 17    🖥️ 25    ⚖  
 ├─ ⏱ 25' 32" 294ms   📋 1595  📄 9     🛠️ 14    🛠️ 18    🖥️ 44    ⚖  
 ├─ ⏱ 26' 34" 146ms   📋 1662  📄 10    🛠️ 14    🛠️ 16    🖥️ 14    ⚖  
 ├─ ⏱ 27' 34" 713ms   📋 1724  📄 10    🛠️ 14    🛠️ 9     🖥️ 30    ⚖  
 ├─ ⏱ 28' 36" 704ms   📋 1783  📄 8     🛠️ 13    🛠️ 18    🖥️ 17    ⚖  
 ├─ ⏱ 29' 36" 873ms   📋 1845  📄 3     🛠️ 13    🛠️ 6     🖥️ 40    ⚖  
 ├─ ⏱ 30' 37" 736ms   📋 1909  📄 10    🛠️ 13    🛠️ 11    🖥️ 18    ⚖  
 ├─ ⏱ 31' 38" 451ms   📋 1962  📄 6     🛠️ 12    🛠️ 19    🖥️ 33    ⚖  
 ├─ ⏱ 32' 42" 612ms   📋 2028  📄 8     🛠️ 12    🛠️ 15    🖥️ 12    ⚖  
 ├─ ⏱ 33' 42" 931ms   📋 2089  📄 3     🛠️ 12    🛠️ 2     🖥️ 16    ⚖  
 ├─ ⏱ 34' 43" 988ms   📋 2152  📄 6     🛠️ 12    🛠️ 0     🖥️ 29    ⚖  
 ├─ ⏱ 35' 44" 192ms   📋 2221  📄 9     🛠️ 11    🛠️ 19    🖥️ 23    ⚖  
 ├─ ⏱ 36' 45" 480ms   📋 2283  📄 6     🛠️ 11    🛠️ 8     🖥️ 3     ⚖  
 ├─ ⏱ 37' 45" 535ms   📋 2343  📄 9     🛠️ 11    🛠️ 5     🖥️ 12    ⚖  
 ├─ ⏱ 38' 46" 609ms   📋 2401  📄 8     🛠️ 10    🛠️ 19    🖥️ 28    ⚖  
 ├─ ⏱ 39' 48" 595ms   📋 2462  📄 10    🛠️ 10    🛠️ 19    🖥️ 3     ⚖  
 ├─ ⏱ 40' 49" 53ms    📋 2526  📄 9     🛠️ 10    🛠️ 8     🖥️ 38    ⚖  
 ├─ ⏱ 41' 52" 851ms   📋 2589  📄 3     🛠️ 9     🛠️ 16    🖥️ 37    ⚖  
 ├─ ⏱ 42' 54" 220ms   📋 2655  📄 4     🛠️ 9     🛠️ 11    🖥️ 33    ⚖  
 ├─ ⏱ 43' 54" 450ms   📋 2718  📄 5     🛠️ 9     🛠️ 5     🖥️ 32    ⚖  
 ├─ ⏱ 44' 56" 451ms   📋 2778  📄 6     🛠️ 9     🛠️ 0     🖥️ 43    ⚖  
 ├─ ⏱ 45' 57" 698ms   📋 2844  📄 2     🛠️ 8     🛠️ 11    🖥️ 3     ⚖  
 ├─ ⏱ 46' 58" 416ms   📋 2909  📄 9     🛠️ 8     🛠️ 13    🖥️ 39    ⚖  
 ├─ ⏱ 48' 923ms       📋 2976  📄 10    🛠️ 8     🛠️ 11    🖥️ 41    ⚖  
 ├─ ⏱ 49' 924ms       📋 3034  📄 7     🛠️ 7     🛠️ 16    🖥️ 42    ⚖  
 ├─ ⏱ 50' 1" 73ms     📋 3096  📄 9     🛠️ 7     🛠️ 15    🖥️ 40    ⚖  
 ├─ ⏱ 51' 1" 953ms    📋 3156  📄 5     🛠️ 7     🛠️ 1     🖥️ 24    ⚖  
 ├─ ⏱ 52' 2" 499ms    📋 3216  📄 2     🛠️ 6     🛠️ 16    🖥️ 43    ⚖  
 ├─ ⏱ 53' 2" 548ms    📋 3280  📄 1     🛠️ 6     🛠️ 9     🖥️ 30    ⚖  
 ├─ ⏱ 54' 4" 134ms    📋 3337  📄 6     🛠️ 6     🛠️ 8     🖥️ 1     ⚖  
 ├─ ⏱ 55' 4" 546ms    📋 3398  📄 10    🛠️ 6     🛠️ 10    🖥️ 36    ⚖  
 ├─ ⏱ 56' 5" 503ms    📋 3461  📄 4     🛠️ 5     🛠️ 14    🖥️ 36    ⚖  
 ├─ ⏱ 57' 5" 770ms    📋 3523  📄 3     🛠️ 5     🛠️ 7     🖥️ 27    ⚖  
 ├─ ⏱ 58' 6" 798ms    📋 3589  📄 3     🛠️ 4     🛠️ 21    🖥️ 14    ⚖  
 ├─ ⏱ 59' 9" 712ms    📋 3647  📄 3     🛠️ 4     🛠️ 15    🖥️ 44    ⚖  
 ├─ ⏱ 1h 10" 178ms    📋 3708  📄 5     🛠️ 4     🛠️ 9     🖥️ 11    ⚖  
 ├─ ⏱ 1h 1' 10" 927ms  📋 3768  📄 6     🛠️ 4     🛠️ 7     🖥️ 4     ⚖  
 ├─ ⏱ 1h 2' 11" 15ms  📋 3830  📄 1     🛠️ 3     🛠️ 17    🖥️ 1     ⚖  
 ├─ ⏱ 1h 3' 11" 316ms  📋 3888  📄 10    🛠️ 4     🛠️ 2     🖥️ 42    ⚖  
 ├─ ⏱ 1h 4' 11" 317ms  📋 3952  📄 5     🛠️ 3     🛠️ 7     🖥️ 32    ⚖  
 ├─ ⏱ 1h 5' 11" 374ms  📋 4014  📄 6     🛠️ 3     🛠️ 4     🖥️ 6     ⚖  
 ├─ ⏱ 1h 6' 13" 79ms  📋 4077  📄 4     🛠️ 2     🛠️ 15    🖥️ 45    ⚖  
 ├─ ⏱ 1h 7' 14" 200ms  📋 4142  📄 6     🛠️ 2     🛠️ 12    🖥️ 22    ⚖  
 ├─ ⏱ 1h 8' 16" 62ms  📋 4204  📄 2     🛠️ 2     🛠️ 0     🖥️ 27    ⚖  
 ├─ ⏱ 1h 9' 16" 519ms  📋 4263  📄 3     🛠️ 1     🛠️ 17    🖥️ 23    ⚖  
 ├─ ⏱ 1h 10' 16" 674ms  📋 4325  📄 9     🛠️ 1     🛠️ 18    🖥️ 40    ⚖  
 ├─ ⏱ 1h 11' 17" 187ms  📋 4384  📄 7     🛠️ 1     🛠️ 12    🖥️ 42    ⚖  
 ├─ ⏱ 1h 12' 17" 455ms  📋 4443  📄 9     🛠️ 1     🛠️ 6     🖥️ 4     ⚖  
 ├─ ⏱ 1h 13' 18" 367ms  📋 4504  📄 8     🛠️ 0     🛠️ 19    🖥️ 8     ⚖  
 ├─ ⏱ 1h 14' 20" 432ms  📋 4569  📄 10    🛠️ 0     🛠️ 19    🖥️ 24    ⚖  
 ├─ ⏱ 1h 15' 21" 586ms  📋 4620  📄 6     🛠️ 0     🛠️ 5     🖥️ 42    ⚖  
 ├─ ⏱ 1h 16' 25" 756ms  📋 4620  📄 9     🛠️ 0     🛠️ 2     🖥️ 21    ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioRuido.csv gravado.
 │  ⏱  Tempo real: 1h 17' 20" 88ms 
 │  ⏱  CPU total: 2d 12h 34' 44" 135ms 
 │  ⏱  Espera do gestor: 1h 17' 19" 980ms 
 │  ⏱  Espera trabalhadores: 1h 9' 23" 331ms 
 │  📊  Utilização:
 │  - Total: 96.0%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 98.1% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 1h 17' 20" 89ms ) ═══

Os resultados do torneio são os seguintes:

EficáciaBranco

P10 -100 -50 -20 -10 -5 -2 -1 0 Total
-100 0,27 0,26 0,18 0,12 0,17 0,06 0,1 0,19 0,16
-50 0,41 0,47 0,23 0,28 0,16 0,14 0,13 0,2 0,24
-20 0,51 0,52 0,28 0,37 0,22 0,21 0,14 0,28 0,32
-10 0,63 0,56 0,44 0,42 0,36 0,3 0,29 0,33 0,42
-5 0,6 0,59 0,49 0,46 0,42 0,36 0,31 0,39 0,45
-2 0,62 0,64 0,51 0,48 0,5 0,37 0,3 0,39 0,48
-1 0,6 0,62 0,52 0,49 0,46 0,44 0,42 0,42 0,5
0 0,75 0,75 0,69 0,58 0,61 0,53 0,6 0,64 0,64
Total 0,56 0,55 0,43 0,4 0,36 0,3 0,28 0,34 0,4

EficáciaPreto

P10 -100 -50 -20 -10 -5 -2 -1 0 Total
-100 0,73 0,74 0,82 0,88 0,83 0,94 0,9 0,81 0,84
-50 0,59 0,53 0,77 0,72 0,84 0,86 0,87 0,8 0,76
-20 0,49 0,48 0,72 0,63 0,78 0,79 0,86 0,72 0,68
-10 0,37 0,44 0,56 0,58 0,64 0,7 0,71 0,67 0,58
-5 0,4 0,41 0,51 0,54 0,58 0,64 0,69 0,61 0,55
-2 0,38 0,36 0,49 0,52 0,5 0,63 0,7 0,61 0,52
-1 0,4 0,38 0,48 0,51 0,54 0,56 0,58 0,58 0,5
0 0,25 0,25 0,31 0,42 0,39 0,47 0,4 0,36 0,36
Total 0,44 0,45 0,57 0,6 0,64 0,7 0,72 0,66 0,6

Podemos observar que:

  • quando o ruído do branco é 0 (última linha na tabela EficáciaBranco), a eficácia do branco é 75% caso o preto tenha ruído a -100, descendo para 64% há medida que o ruído do preto é reduzido.
  • quando o ruído do branco é -100 (primeira linha na tabela EficáciaBranco), a eficácia é 27% quando preto tem também -100, descendo para 19% há medida que o ruído do preto é reduzido.
  • quando o ruído do preto é 0 (última coluna na tabela EficáciaPreto), a eficácia do preto é 81% caso o branco tenha ruído a -100, descendo para 36% há medida que o ruído do branco é reduzido.
  • quando o ruído do preto é -100 (primeira coluna na tabela Eficácia), a eficácia é 73% quando branco tem também -100, descendo para 25% há medida que o ruído do branco é reduzido.

Não são valores com precisão, já que foram poucos jogos e pode-se observar oscilações na eficácia. Mas podemos observar uma tendência em que o ruído afeta significativamente a eficácia do jogador.

Podemos ver oos resultados por instância:

Instância Vitória Preta Empate Vitória Branca
1 483 69
2 336 44 172
3 50 9 493
4 266 7 279
5 226 326
6 284 2 266
7 236 20 296
8 312 28 212
9 482 69 1
10 467 68 17
Total Geral 3142 316 2062

Podemos ver que um torneio com ruído tem muitos mais resultados decisivos, com poucas partidas a terminar em empate.

Considera-se assim que o ruído é um parâmetro importante para ajustar a força de jogo do jogador artificial.

Ação 8 - Torneio Tempo

Vamos agora estudar o efeito do tempo por jogada na eficácia do jogador. Como temos jogos com tamanhos grandes, vamos colocar o tempo a variar de 1, 2 e 4 segundos por jogada. São apenas 3 configurações (jogadores). Vamos reavaliar a ordenação de sucessores, em utilizar apenas a heurística ou valores analisados anteriormente. Como há mais tempo, poderá esta opção revelar-se vantajosa, mas passamos a 6 configurações (jogadores). Mantemos o ruído a 0, reservando para utilização na definição dos níveis de jogo mais baixos. Finalmente, para ter resultados robustos, colocamos o esforço em 2, o que nos duplica as configurações passando a 12 configurações (jogadores).

  • Tipo de Teste / Objetivo: Eficácia (Tempo)
  • Definição: Instâncias: 1:10; Configurações: P7=0 P1=2 P12=1 P11=1 P15=300 P10=0 P12=1,2 x P4=1,2,4
  • Esforço: P3=1:2
  • Execução: TProcuraAdversa 2 1:10 -R Resultados/TorneioTempo -M 1 -P P2=2 P7=0 P1=2 P12=1 P11=1 P15=300 P10=0 P3=1:2 x P12=1,2 x P4=1,2,4
Ver script: torneioTempo.sh
#!/bin/bash
#SBATCH --job-name=torneioTempo
#SBATCH --output=Resultados/torneioTempo.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: torneioTempo
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioTempo -M 1 \
  -P P2=2 P7=0 P1=2 P12=1 P11=1 P15=300 P10=0 P3=1:2 x P12=1,2 x P4=1,2,4
Ver execução:

═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P1=2 P2=2 P5=0 P6=4 P7=0 P8=1 P10=0 P11✓  P13=0 P14=0 P15=300 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P3=1 P4=1 P12=1
 ├─ ⚙  [2] ─ P3=2 P4=1 P12=1
 ├─ ⚙  [3] ─ P3=1 P4=1 P12=2
 │ ...
 ├─ ⚙  [10] ─ P3=2 P4=4 P12=1
 ├─ ⚙  [11] ─ P3=1 P4=4 P12=2
 ├─ ⚙  [12] ─ P3=2 P4=4 P12=2
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:1320   📄 Instâncias: 10   🛠️ Configurações: 12   🖥️ Processos: 48.
 ├─ ⏱ 1' 272ms        📋 64    📄 4     🛠️ 11    🛠️ 6     🖥️ 1     ⚖  
 ├─ ⏱ 2' 3" 428ms     📋 77    📄 2     🛠️ 11    🛠️ 4     🖥️ 41    ⚖  
 ├─ ⏱ 3' 26" 746ms    📋 87    📄 5     🛠️ 11    🛠️ 5     🖥️ 30    ⚖  
 ├─ ⏱ 4' 27" 10ms     📋 104   📄 8     🛠️ 11    🛠️ 4     🖥️ 29    ⚖  
 ├─ ⏱ 5' 43" 354ms    📋 131   📄 7     🛠️ 11    🛠️ 10    🖥️ 44    ⚖  
 ├─ ⏱ 6' 43" 920ms    📋 148   📄 10    🛠️ 11    🛠️ 6     🖥️ 7     ⚖  
 ├─ ⏱ 7' 45" 472ms    📋 168   📄 6     🛠️ 11    🛠️ 0     🖥️ 29    ⚖  
 ├─ ⏱ 8' 56" 317ms    📋 182   📄 5     🛠️ 10    🛠️ 5     🖥️ 13    ⚖  
 ├─ ⏱ 9' 57" 715ms    📋 203   📄 4     🛠️ 10    🛠️ 3     🖥️ 14    ⚖  
 ├─ ⏱ 11' 100ms       📋 222   📄 7     🛠️ 10    🛠️ 9     🖥️ 10    ⚖  
 ├─ ⏱ 12' 3" 855ms    📋 245   📄 3     🛠️ 9     🛠️ 10    🖥️ 1     ⚖  
 ├─ ⏱ 13' 8" 67ms     📋 259   📄 4     🛠️ 9     🛠️ 10    🖥️ 36    ⚖  
 ├─ ⏱ 14' 9" 442ms    📋 277   📄 10    🛠️ 10    🛠️ 5     🖥️ 41    ⚖  
 ├─ ⏱ 15' 13" 346ms   📋 294   📄 4     🛠️ 9     🛠️ 5     🖥️ 9     ⚖  
 ├─ ⏱ 16' 14" 770ms   📋 307   📄 8     🛠️ 9     🛠️ 10    🖥️ 24    ⚖  
 ├─ ⏱ 17' 18" 686ms   📋 328   📄 6     🛠️ 9     🛠️ 6     🖥️ 34    ⚖  
 ├─ ⏱ 18' 20" 804ms   📋 349   📄 4     🛠️ 9     🛠️ 0     🖥️ 27    ⚖  
 ├─ ⏱ 19' 27" 715ms   📋 367   📄 9     🛠️ 9     🛠️ 2     🖥️ 41    ⚖  
 ├─ ⏱ 20' 34" 371ms   📋 387   📄 4     🛠️ 8     🛠️ 7     🖥️ 21    ⚖  
 ├─ ⏱ 21' 38" 43ms    📋 408   📄 4     🛠️ 8     🛠️ 5     🖥️ 17    ⚖  
 ├─ ⏱ 22' 41" 244ms   📋 427   📄 2     🛠️ 8     🛠️ 2     🖥️ 17    ⚖  
 ├─ ⏱ 23' 44" 652ms   📋 446   📄 9     🛠️ 8     🛠️ 10    🖥️ 25    ⚖  
 ├─ ⏱ 24' 55" 475ms   📋 468   📄 4     🛠️ 7     🛠️ 11    🖥️ 25    ⚖  
 ├─ ⏱ 25' 55" 632ms   📋 487   📄 6     🛠️ 8     🛠️ 1     🖥️ 47    ⚖  
 ├─ ⏱ 26' 56" 594ms   📋 512   📄 10    🛠️ 8     🛠️ 5     🖥️ 43    ⚖  
 ├─ ⏱ 27' 59" 15ms    📋 533   📄 5     🛠️ 7     🛠️ 4     🖥️ 8     ⚖  
 ├─ ⏱ 28' 59" 418ms   📋 563   📄 8     🛠️ 7     🛠️ 4     🖥️ 41    ⚖  
 ├─ ⏱ 29' 59" 660ms   📋 589   📄 10    🛠️ 7     🛠️ 6     🖥️ 35    ⚖  
 ├─ ⏱ 30' 59" 705ms   📋 620   📄 1     🛠️ 6     🛠️ 4     🖥️ 23    ⚖  
 ├─ ⏱ 32' 1" 84ms     📋 645   📄 5     🛠️ 6     🛠️ 4     🖥️ 2     ⚖  
 ├─ ⏱ 33' 1" 640ms    📋 671   📄 6     🛠️ 6     🛠️ 10    🖥️ 47    ⚖  
 ├─ ⏱ 34' 2" 932ms    📋 702   📄 9     🛠️ 6     🛠️ 1     🖥️ 7     ⚖  
 ├─ ⏱ 35' 10" 15ms    📋 726   📄 10    🛠️ 6     🛠️ 1     🖥️ 43    ⚖  
 ├─ ⏱ 36' 11" 51ms    📋 747   📄 5     🛠️ 5     🛠️ 3     🖥️ 30    ⚖  
 ├─ ⏱ 37' 12" 127ms   📋 772   📄 8     🛠️ 5     🛠️ 8     🖥️ 3     ⚖  
 ├─ ⏱ 38' 17" 524ms   📋 805   📄 3     🛠️ 4     🛠️ 9     🖥️ 12    ⚖  
 ├─ ⏱ 39' 21" 505ms   📋 829   📄 4     🛠️ 4     🛠️ 8     🖥️ 34    ⚖  
 ├─ ⏱ 40' 21" 666ms   📋 854   📄 5     🛠️ 4     🛠️ 6     🖥️ 24    ⚖  
 ├─ ⏱ 41' 23" 474ms   📋 874   📄 8     🛠️ 4     🛠️ 6     🖥️ 13    ⚖  
 ├─ ⏱ 42' 25" 77ms    📋 911   📄 6     🛠️ 4     🛠️ 2     🖥️ 24    ⚖  
 ├─ ⏱ 43' 26" 256ms   📋 935   📄 9     🛠️ 4     🛠️ 0     🖥️ 36    ⚖  
 ├─ ⏱ 44' 32" 549ms   📋 957   📄 4     🛠️ 3     🛠️ 5     🖥️ 17    ⚖  
 ├─ ⏱ 45' 35" 752ms   📋 1002  📄 9     🛠️ 3     🛠️ 10    🖥️ 19    ⚖  
 ├─ ⏱ 46' 36" 484ms   📋 1038  📄 9     🛠️ 3     🛠️ 0     🖥️ 17    ⚖  
 ├─ ⏱ 47' 39" 78ms    📋 1068  📄 2     🛠️ 2     🛠️ 5     🖥️ 44    ⚖  
 ├─ ⏱ 48' 40" 928ms   📋 1092  📄 5     🛠️ 2     🛠️ 8     🖥️ 34    ⚖  
 ├─ ⏱ 49' 42" 328ms   📋 1133  📄 10    🛠️ 2     🛠️ 7     🖥️ 6     ⚖  
 ├─ ⏱ 50' 43" 498ms   📋 1165  📄 5     🛠️ 1     🛠️ 9     🖥️ 16    ⚖  
 ├─ ⏱ 51' 44" 451ms   📋 1194  📄 2     🛠️ 1     🛠️ 3     🖥️ 24    ⚖  
 ├─ ⏱ 52' 45" 776ms   📋 1233  📄 9     🛠️ 1     🛠️ 3     🖥️ 4     ⚖  
 ├─ ⏱ 53' 49" 154ms   📋 1266  📄 2     🛠️ 0     🛠️ 7     🖥️ 34    ⚖  
 ├─ ⏱ 54' 49" 917ms   📋 1288  📄 7     🛠️ 0     🛠️ 5     🖥️ 30    ⚖  
 ├─ ⏱ 55' 50" 948ms   📋 1320  📄 6     🛠️ 0     🛠️ 9     🖥️ 39    ⚖  
 ├─ ⏱ 56' 52" 914ms   📋 1320  📄 6     🛠️ 0     🛠️ 1     🖥️ 16    ⚖  
 ├─ ⏱ 58' 727ms       📋 1320  📄 10    🛠️ 0     🛠️ 10    🖥️ 20    ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioTempo.csv gravado.
 │  ⏱  Tempo real: 58' 32" 861ms 
 │  ⏱  CPU total: 1d 21h 51' 44" 472ms 
 │  ⏱  Espera do gestor: 58' 32" 799ms 
 │  ⏱  Espera trabalhadores: 1h 33' 54" 937ms 
 │  📊  Utilização:
 │  - Total: 94.6%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 96.6% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 58' 32" 861ms ) ═══

Os resultados do torneio são os seguintes:

EficáciaBranco

P4 1 2 4
1 0,66 0,52 0,52
2 0,62 0,56 0,55
4 0,63 0,59 0,58

EficáciaPreto

P4 1 2 4
1 0,34 0,48 0,48
2 0,38 0,44 0,45
4 0,37 0,41 0,42

Podemos observar que o tempo influencia a eficácia do jogador, registando diferenças entre 0,52 de 1 contra 4 segundos, a 0,63 de 4 contra 1 segundos no lado branco. As pretas têm também oscilações. No entanto esperavam-se diferenças mais acentuadas.

Ação 9 - Torneio Níveis

Estando identificadas as variáveis críticas de desempenho estamos em condições de identificar configurações com diferentes níveis de força de jogo.

Pretendemos que a diferença de força de jogo entre níveis consecutivos, seja significativa e constante, idealmente com 3 pontos em 4 jogos, ou seja, 75%.

Desta forma podemos ter diferentes níveis de jogo para diferentes dificuldades que o jogador humano pretender enfrentar, podendo optar por um adversário artificial adequado à sua força de jogo atual.

Configuração base: P7=0 P1=2 P4=1 P12=1 P11=1 P15=300 P10=0

Vamos utilizar a seguinte estratégia para reduzir/aumentar a força de jogo:

  • Aumentar o tempo por jogada (P4>1)
  • Adicionar ruído à heurística (P10<0)
  • Ameaças mais curtas menos relevantes (P15<300)
  • Fixar a profundidade de procura (P7>0)

Para afinar os níveis temos de fazer torneios entre níveis consecutivos, para encontrar os valores que levem a ter uma diferença de força de jogo em 75% (ambos os lados).

Níveis definidos:

  • +1: P4=4 P12=2
  • Base: P7=0 P1=2 P4=1 P12=1 P11=1 P15=300 P10=0
  • -1: P10=-5 P15=150
  • -2: P7=2 P10=-5 P15=150
  • -3: P7=2 P10=-20 P15=120
Ver script: torneioNiveis.sh
#!/bin/bash
#SBATCH --job-name=torneioNiveis
#SBATCH --output=Resultados/torneioNiveis.txt
#SBATCH --account=f202507959cpcaa0a
#SBATCH --partition=normal-arm
#SBATCH --time=04:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --mem=24G

ml OpenMPI

make mpi || { echo "Compilação falhou"; exit 1; }

# Teste: torneioNiveis
srun bin/MPI/TProcuraAdversa 2 1:10 -R Resultados/TorneioNiveis -M 1 \
  -P P2=2 P7=0 P4=1 P1=2 P12=1 P11=1 P15=300 P10=0 \
  -P P4=4 P12=2 \
  -P P4=1 P12=1 P10=-5 P15=150 \
  -P P7=2 P10=-5 P15=150 \
  -P P7=2 P10=-20 P15=120 

Ver execução:

═╤═ Instâncias ═══ { 📄 1 📄 2 📄 3 📄 4 📄 5 📄 6 📄 7 📄 8 📄 9 📄 10 } 
 ├─ 🛠️  ─ P1=2 P2=2 P3=1 P5=0 P6=4 P8=1 P11✓  P13=0 P14=0 (parâmetros comuns)
═╪═ Configurações ═══
 ├─ ⚙  [1] ─ P4=1 P7=0 P10=0 P12=1 P15=300
 ├─ ⚙  [2] ─ P4=4 P7=0 P10=0 P12=2 P15=300
 ├─ ⚙  [3] ─ P4=1 P7=0 P10=-5 P12=1 P15=150
 ├─ ⚙  [4] ─ P4=1 P7=2 P10=-5 P12=1 P15=150
 ├─ ⚙  [5] ─ P4=1 P7=2 P10=-20 P12=1 P15=120
═╧═══════════════════
═╤═ 🧪  Início do Teste (🖥️ 0) ═══
 ├─ 📋 Tarefas:200   📄 Instâncias: 10   🛠️ Configurações: 5   🖥️ Processos: 48.
 ├─ ⏱ 1' 84ms         📋 168   📄 4     🛠️ 1     🛠️ 4     🖥️ 3     ⚖  
 ├─ ⏱ 2' 5" 952ms     📋 200   📄 6     🛠️ 2     🛠️ 1     🖥️ 36    ⚖  
 ├─ ⏱ 3' 8" 148ms     📋 200   📄 8     🛠️ 2     🛠️ 1     🖥️ 32    ⚖  
 ├─ ⏱ 4' 9" 797ms     📋 200   📄 8     🛠️ 0     🛠️ 1     🖥️ 15    ⚖  
 ├─ ⏱ 5' 47" 264ms    📋 200   📄 10    🛠️ 2     🛠️ 1     🖥️ 17    ⚖  
 ├─ ⏱ 6' 47" 264ms    📋 200   📄 10    🛠️ 0     🛠️ 1     🖥️ 20    ⚖  
 ├─ 📑  Ficheiro Resultados/TorneioNiveis.csv gravado.
 │  ⏱  Tempo real: 6' 47" 266ms 
 │  ⏱  CPU total: 5h 19' 1" 515ms 
 │  ⏱  Espera do gestor: 6' 47" 242ms 
 │  ⏱  Espera trabalhadores: 3h 7' 23" 256ms 
 │  📊  Utilização:
 │  - Total: 40.4%
 │  - Gestor: 0.0%
 │  - Trabalhadores: 41.3% 
═╧═ 🏁  Fim do Teste (🖥️ 0  ⏱ 6' 47" 266ms ) ═══

Vamos neste caso colocar o total de pontos obtidos entre todos os níveis:

Nível +1 Base -1 -2 -3 Total Geral
+1 4 7 10 9 30
Base 2 6 8 10 26
-1 -4 -5 2 10 3
-2 -10 -9 -10 4 -25
-3 -10 -10 -10 -6 -36
Total Geral -22 -20 -7 14 33 -2

Neste torneio entre todos os níveis, podemos ver que os níveis mais altos ganham consistentemente aos níveis mais baixos.

As diferenças entre níveis mais altos, apenas com o tempo relativamente à configuração de base, não é tão acentuada quanto as diferenças nos níveis mais baixos, tal como o torneio tempo já vinha a revelar. Seria necessário aumentar bastante o tempo para que a força de jogo suba mais.

Esta análise realizada apenas num só jogo, e não das 10 instâncias de jogos, poderá ter resultados mais precisos, mas mesmo assim considera-se que esta definição de níveis adequado.

◀ Passo anterior Próximo passo ▶