Negamax 通常如下所示:
function negamax(node, depth, α, β, color) is
if depth = 0 or node is a terminal node then
return color × the heuristic value of node
childNodes := generateMoves(node)
childNodes := orderMoves(childNodes)
value := −∞
foreach child in childNodes do
value := max(value, −negamax(child, depth − 1, −β, −α, −color))
α := max(α, value)
if α ≥ β then
break (* cut-off *)
return value
最初的调用是negamax(rootNode, depth, −∞, +∞, 1)
最大化玩家调用它。
我以最大化玩家调用它的方式实现了 Negamax,但每个rootNode
都是最大化玩家的移动之一:
function negamaxHandler() is
bestValue := −∞
bestNode := null
childNodes := generateMoves(currentGameState)
foreach child in childNodes do
value := negamax(child, depth-1, ???, ???, ???)
if value > bestValue then
bestValue := value
bestNode := child
return bestNode
因为 Negamax 返回一个值,所以我想要一个棋盘状态(移动)。所以我手动做第一级的 Negamax,这样我就可以解析出最好的移动在哪里。但是我应该呼吁什么价值观negamax
?为了更具说明性,如果最大化玩家调用negamaxHandler
,应该negamaxHandler
调用:
negamax(child, depth-1, −∞, +∞, 1)
-negamax(child, depth-1, −∞, +∞, 1)
negamax(child, depth-1, +∞, −∞, -1)
-negamax(child, depth-1, +∞, −∞, -1)
或者是其他东西?澄清:
- 最大化玩家通话
negamaxHandler
- 每个顶级调用
negamax
innegamaxHandler
应该最小化