Jogos são interessantes, pois modelam formas de raciocínio do ser humano.
Partimos no estudo com uma pergunta “Como um computador pode jogar xadrez?”
O jogador MAX quer maximizar o resultado. O jogador MIN quer minimizar o resultado.
function minimax(node, depth, maximizingPlayer) is
if depth = 0 or node is a terminal node then
return the heuristic value of node
if maximizingPlayer then
value := −INF
for each child of node do
value := max(value, minimax(child, depth − 1, FALSE))
else (* minimizing player *)
value := +INF
for each child of node do
value := min(value, minimax(child, depth − 1, TRUE))
return value
Chamada do algoritmo: minimax(origin, depth, TRUE)
Técnica baseada em branch and bound para reduzir o espaço de busca
function alphabeta(node, depth, α, β, maximizingPlayer) is
if depth == 0 or node is terminal then
return the heuristic value of node
if maximizingPlayer then
value := −INF
for each child of node do
value := max(value, alphabeta(child, depth − 1, α, β, FALSE))
α := max(α, value)
if value >= β then
break (* β cutoff *)
else
value := +INF
for each child of node do
value := min(value, alphabeta(child, depth − 1, α, β, TRUE))
β := min(β, value)
if value <= α then
break (* α cutoff *)
return value
Chamada do algoritmo: alphabeta(origin, depth, −INF, +INF, TRUE)
Construído em 1997, realizada 2 milhões de avaliações estáticas por segundo, avaliava 14 níveis, utilizando: