PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 25 → Algoritmo Minimax em WLanguage
Algoritmo Minimax em WLanguage
Iniciado por Boller, 14,oct. 2024 17:34 - No hay respuesta
Miembro registrado
4.520 mensajes
Publicado el 14,octubre 2024 - 17:34
Prezados

Com base nesse link
https://www.codeproject.com/Articles/5388742/An-Explanation-of-the-Minimax-Algorithm

O algoritmo Minimax é amplamente utilizado em jogos de estratégia para prever os melhores movimentos, assumindo que ambos os jogadores jogam perfeitamente. Ele envolve explorar todas as jogadas possíveis e atribuir um valor a cada estado de jogo, selecionando o movimento que minimiza a perda máxima possível. Vamos converter o algoritmo Minimax básico em WLanguage:

Exemplo básico de Minimax em WLanguage:

PROCEDURE Minimax(board is array of int, depth is int, isMaximizing is boolean)

// Avaliação do tabuleiro (função fictícia, que deve ser criada para avaliar o estado)
score is int = EvaluateBoard(board)

IF score = 10 THEN
RESULT 10 - depth
ELSE IF score = -10 THEN
RESULT depth - 10
ELSE IF IsBoardFull(board) THEN
RESULT 0
END

IF isMaximizing THEN
best is int = -9999

FOR i = 0 TO ArrayCount(board) - 1
IF board[i] = 0 THEN
board[i] = 1
best = Max(best, Minimax(board, depth + 1, False))
board[i] = 0
END
END
RESULT best
ELSE
best is int = 9999

FOR i = 0 TO ArrayCount(board) - 1
IF board[i] = 0 THEN
board[i] = -1
best = Min(best, Minimax(board, depth + 1, True))
board[i] = 0
END
END
RESULT best
END

Explicação:

1. Avaliação do Tabuleiro: A função EvaluateBoard retorna a pontuação do estado atual do tabuleiro (por exemplo, 10 para vitória do jogador 1, -10 para vitória do jogador 2, 0 para empate).
2. Verificação de Movimentos: O algoritmo simula cada possível movimento no tabuleiro e avalia seu resultado.
3. Recursão: A função é chamada recursivamente, alternando entre maximizar e minimizar as pontuações dos jogadores.
4. Profundidade: O parâmetro depth controla a profundidade da busca para garantir que movimentos mais curtos tenham prioridade.

Além da implementação básica do Minimax, o artigo também explora conceitos importantes que podem ser aplicados à versão WLanguage, como:

1. Poda Alpha-Beta: Uma otimização que reduz o número de nós avaliados, melhorando a eficiência sem comprometer o resultado.
2. Aplicações práticas: Exemplos de uso em jogos como Xadrez e Tic-Tac-Toe (Jogo da Velha).
3. Avaliação heurística: Quando o estado final é difícil de calcular, heurísticas ajudam a aproximar o valor de cada posição intermediária, aplicável em jogos complexos.

Esses tópicos podem ser explorados para melhorar o algoritmo Minimax na versão WLanguage.

Além da implementação básica do Minimax, um exemplo adicional que pode ser abordado é a poda Alpha-Beta, que é uma otimização ao algoritmo. A poda descarta ramos da árvore de decisões que não precisam ser explorados, aumentando a eficiência.

Aqui está um exemplo de Minimax com poda Alpha-Beta em WLanguage:

PROCEDURE MinimaxAlphaBeta(board is array of int, depth is int, alpha is int, beta is int, isMaximizing is boolean)

// Avaliação do tabuleiro
score is int = EvaluateBoard(board)

IF score = 10 THEN
RESULT 10 - depth
ELSE IF score = -10 THEN
RESULT depth - 10
ELSE IF IsBoardFull(board) THEN
RESULT 0
END

IF isMaximizing THEN
best is int = -9999

FOR i = 0 TO ArrayCount(board) - 1
IF board[i] = 0 THEN
board[i] = 1
best = Max(best, MinimaxAlphaBeta(board, depth + 1, alpha, beta, False))
board[i] = 0
alpha = Max(alpha, best)

IF beta <= alpha THEN
BREAK
END
END
END
RESULT best
ELSE
best is int = 9999

FOR i = 0 TO ArrayCount(board) - 1
IF board[i] = 0 THEN
board[i] = -1
best = Min(best, MinimaxAlphaBeta(board, depth + 1, alpha, beta, True))
board[i] = 0
beta = Min(beta, best)

IF beta <= alpha THEN
BREAK
END
END
END
RESULT best
END

Explicação:

1. Poda Alpha-Beta: Os valores alpha e beta limitam o intervalo de valores aceitáveis, descartando ramos que não podem influenciar o resultado final.
2. Otimização: Isso economiza tempo ao evitar a exploração de ramos irrelevantes.

Esse exemplo é uma forma otimizada do algoritmo Minimax, ideal para jogos mais complexos.

Aqui está um exemplo completo do algoritmo Minimax com poda Alpha-Beta em WLanguage, explicando cada detalhe com comentários:

// Procedimento principal para rodar o Minimax com poda Alpha-Beta
PROCEDURE MinimaxAlphaBeta(board is array of int, depth is int, alpha is int, beta is int, isMaximizing is boolean)
// Avaliação do tabuleiro atual para determinar se há uma vitória, derrota ou empate
score is int = EvaluateBoard(board)

// Se o jogador Max (1) venceu, retorna 10 menos a profundidade (mais cedo é melhor)
IF score = 10 THEN
RESULT 10 - depth
END

// Se o jogador Min (-1) venceu, retorna -10 mais a profundidade (mais cedo é melhor)
IF score = -10 THEN
RESULT depth - 10
END

// Se não há mais espaços disponíveis e ninguém venceu, retorna empate (0)
IF IsBoardFull(board) THEN
RESULT 0
END

// Caso seja a vez do jogador Max (tentando maximizar o valor)
IF isMaximizing THEN
best is int = -9999 // Inicia o melhor valor com um valor muito baixo

// Percorre todos os espaços do tabuleiro
FOR i = 0 TO ArrayCount(board) - 1
// Se o espaço está vazio, pode-se fazer um movimento
IF board[i] = 0 THEN
board[i] = 1 // Jogador Max faz seu movimento

// Chamada recursiva para verificar o valor do movimento
best = Max(best, MinimaxAlphaBeta(board, depth + 1, alpha, beta, False))

// Desfaz o movimento (volta ao estado anterior)
board[i] = 0

// Atualiza alpha com o valor máximo obtido
alpha = Max(alpha, best)

// Poda: se beta é menor ou igual a alpha, não há razão para continuar avaliando
IF beta <= alpha THEN
BREAK
END
END
END
// Retorna o melhor valor obtido para o jogador Max
RESULT best

// Caso seja a vez do jogador Min (tentando minimizar o valor)
ELSE
best is int = 9999 // Inicia o melhor valor com um valor muito alto

// Percorre todos os espaços do tabuleiro
FOR i = 0 TO ArrayCount(board) - 1
// Se o espaço está vazio, pode-se fazer um movimento
IF board[i] = 0 THEN
board[i] = -1 // Jogador Min faz seu movimento

// Chamada recursiva para verificar o valor do movimento
best = Min(best, MinimaxAlphaBeta(board, depth + 1, alpha, beta, True))

// Desfaz o movimento (volta ao estado anterior)
board[i] = 0

// Atualiza beta com o valor mínimo obtido
beta = Min(beta, best)

// Poda: se beta é menor ou igual a alpha, não há razão para continuar avaliando
IF beta <= alpha THEN
BREAK
END
END
END
// Retorna o melhor valor obtido para o jogador Min
RESULT best
END
END

// Função de avaliação do estado atual do tabuleiro (retorna 10 para vitória do jogador Max, -10 para Min, ou 0 para empate)
PROCEDURE EvaluateBoard(board is array of int)
// Exemplo de condição de vitória (deve ser adaptado para seu jogo específico, como Jogo da Velha)
// Exemplo básico de 3 posições alinhadas em uma linha
IF board[0] = board[1] AND board[1] = board[2] THEN
IF board[0] = 1 THEN
RESULT 10
ELSE IF board[0] = -1 THEN
RESULT -10
END
END
// Retorna 0 se não houver vencedor
RESULT 0
END

// Função que verifica se o tabuleiro está cheio
PROCEDURE IsBoardFull(board is array of int)
FOR i = 0 TO ArrayCount(board) - 1
IF board[i] = 0 THEN
RESULT False
END
END
RESULT True
END

Explicações detalhadas:

1. Procedimento MinimaxAlphaBeta:
• Recebe o estado atual do tabuleiro (board), a profundidade da pesquisa (depth), os valores de poda (alpha e beta), e uma flag para indicar se é a vez de maximizar (isMaximizing).
• A função faz uma avaliação do estado atual do tabuleiro, retorna imediatamente se alguém venceu ou se o tabuleiro está cheio.
• Utiliza recursão para simular todos os possíveis movimentos e escolhe o melhor com base nas regras de maximização ou minimização.
• Utiliza poda Alpha-Beta para otimizar a pesquisa, evitando a exploração de ramos desnecessários quando uma solução melhor já foi encontrada.
2. Função EvaluateBoard:
• Esta função avalia o estado atual do tabuleiro para determinar se há uma vitória, derrota ou empate.
• Deve ser adaptada ao jogo específico. No exemplo, avalia uma linha de três em um jogo de Jogo da Velha (Tic-Tac-Toe).
3. Função IsBoardFull:
• Verifica se o tabuleiro está completamente cheio, indicando que não há mais movimentos possíveis e, portanto, pode haver um empate.

Pontos importantes:

• Poda Alpha-Beta: Melhora a eficiência ao eliminar ramos desnecessários, acelerando o algoritmo sem comprometer a precisão.
• Profundidade: A profundidade da pesquisa ajuda a priorizar vitórias mais rápidas ou derrotas mais demoradas, pois elas são mais valiosas.
• Generalização: Este exemplo pode ser adaptado para outros jogos, como Xadrez ou Damas, com ajustes na função de avaliação do tabuleiro.

Esse exemplo é uma implementação completa e otimizada do Minimax com poda Alpha-Beta, que pode ser usado como base para criar algoritmos de inteligência artificial em jogos de estratégia.

Isso é uma versão básica e pode ser expandido para incluir outros fatores do jogo.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/