4

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
  • 每个顶级调用negamaxinnegamaxHandler应该最小化
4

1 回答 1

2

正确的函数调用最终是-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)

于 2019-12-27T08:33:43.917 回答