如果最小化根节点而不是最大化,Negamax 的初始函数调用会是什么样子?
What would Negamax' initial function call look like were it to minimize root node rather than maximize?
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 returns 一个值,我反而想要一个棋盘状态(移动)。所以我手动执行 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
negamaxHandler
中对 negamax
的每个顶级调用都应最小化
正确的函数调用最终是 -negamax(child, depth-1, −∞, +∞, -1)
,尽管 negamaxHandler
函数需要更改:
function negamaxHandler(α, β, color) is
bestValue := −∞
bestNode := null
childNodes := generateMoves(currentGameState)
foreach child in childNodes do
value := -negamax(child, depth-1, -β, -α, -color)
if value > bestValue then
bestValue := value
bestNode := child
α := max(bestValue, α)
if α ≥ β then
break
return bestNode
negamaxHandler
被称为 negamaxHandler(−∞, +∞, 1)
。
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 returns 一个值,我反而想要一个棋盘状态(移动)。所以我手动执行 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
negamaxHandler
中对negamax
的每个顶级调用都应最小化
正确的函数调用最终是 -negamax(child, depth-1, −∞, +∞, -1)
,尽管 negamaxHandler
函数需要更改:
function negamaxHandler(α, β, color) is
bestValue := −∞
bestNode := null
childNodes := generateMoves(currentGameState)
foreach child in childNodes do
value := -negamax(child, depth-1, -β, -α, -color)
if value > bestValue then
bestValue := value
bestNode := child
α := max(bestValue, α)
if α ≥ β then
break
return bestNode
negamaxHandler
被称为 negamaxHandler(−∞, +∞, 1)
。