如何使极小极大最优?

人工智能 算法 博弈论 极小极大
2021-10-29 18:38:43

最优我的意思是:

  • 如果 max 有获胜策略,则 minimax 将返回 max 策略以最少的步数获胜。
  • 如果 min 有一个获胜的策略,那么 minimax 将返回 max 的策略,其中失去的移动次数最多。
  • 如果两者都没有获胜策略,则 minimax 将返回具有最多可绘制步数的 max 策略。

这个想法是您希望以尽可能少的步数获胜,但如果您无法获胜,那么您希望尽可能长时间地拖延比赛,以便对手有更多犯错的机会。

那么,如何让 minimax 返回 max 的最佳策略呢?

2个回答

Minimax 处理两种值:

  1. 由启发式函数确定的估计值。
  2. 由终端状态确定的实际值。

通常,我们对值使用以下指称语义:

  1. 以 0 为中心的一系列值表示估计值(例如 -999 到 999)。
  2. 小于最小启发式值的值表示 max 的损失(例如 -1000)。
  3. 大于最大启发式值的值表示赢得最大值(例如 1000)。
  4. 值 0 表示估计抽签或实际抽签。

这种指称语义的优点是比较值与比较数字相同(即您不需要特殊的比较函数)。我们可以扩展这种指称语义以包含输赢的最优性,如下所示:

  1. 以 0 为中心的一系列值表示估计值(例如 -999 到 999)。
  2. 小于最小启发式值的值范围表示损失(例如 -2000 到 -1000)。
  3. 大于最大启发式值的值范围表示获胜(例如,1000 到 2000)。
  4. 值 0 表示估计抽签或实际抽签。
  5. n 次移动的损失表示为 -(m - n),其中 m 是一个足够大的数字(例如 2000)。
  6. 在 n 步中获胜表示为 (m - n),其中 m 是一个足够大的数字(例如 2000)。

对值使用这种指称语义只需要对极小极大算法进行少量更改:

function minimax(node, depth, max)
    if max
        return negamax(node, depth, 1)
    else
        return -negamax(node, depth, -1)

function negamax(node, depth, color)
    if terminal(node)
        return -2000

    if depth = 0
        return color * heuristic(node)

    value = -2000

    foreach child of node
        v = -negamax(child, depth - 1, -color)

        if v > 1000
            v -= 1

        if v > value
            value = v

    return value

为平局合并最优性要困难得多。

下面的简短版本。

在实现极小极大算法时,其目的通常是在经过一定数量的移动后,为您称为 max 的玩家找到游戏板的最佳可能位置。在像井字游戏这样的游戏中,博弈树(所有合法移动的图)足够小,以至于可以穷举地应用极小极大搜索来查看整个博弈树。国际象棋等更复杂的游戏具有太大的博弈树,无法进行详尽的搜索。

minimax 的一个简单版本只是遍历博弈树,评估当前正在评估的位置的每一个合法移动,然后再进一步评估这些移动的可能答案。找到最佳的获胜动作;minimax 只需要搜索直到找到游戏的获胜状态。如果使用上述广度优先搜索极小极大算法来实现,它将找到以最少的移动量获胜的方法。

在 min 强制获胜的情况下,不存在真正的最佳移动。如果 min 不是最优玩家​​,则最优的定义可以是最有可能导致他犯错误的移动,这使得 max 能够强制获胜。那个动作不一定是导致最多动作直到失败的动作。例如,考虑某个游戏中的一个位置,其中 max 有两个动作,移动 A 和移动 B,移动 A 导致 100 步失败,移动 B 导致一次失败。天真地移动 A 更好,但在这个游戏中,移动 A 之后唯一合法的移动导致失败,移动 B 导致 min 有数百个合法移动但只有一个导致他赢的位置。尽管有点极端,但这个例子表明,在亏损的情况下很难定义最优性。简单地说,

但是,您确实定义了一个最优版本,并且可以实现它。由于您只考虑最佳移动,因此必须进行详尽的搜索,因此,除了胜利、失败和平局之外,没有理由对任何位置进行评分。我将使用的方法是为每个状态分配一个分数,该分数远大于可能的最大移动量,例如,输是 -100,000,赢是 100,000,平局是 0。然后你维护一个变量,即搜索或达到此状态必须执行的移动次数。然后我会将移动的数量添加到大数字中。因此,20 步失败的得分为 -99,980,15 步的平局得分为 15。对于大多数游戏来说,100,000 有点过分,但它必须足够大,以便输、赢和平永远不会被混淆为 100 平局,

简洁版本:

  • 使用广度优先搜索。
  • 对于获胜位置:找到获胜时终止极小极大。
  • 输和平:搜索整个博弈树,平局得分 0+MTP,输局得分 L+MTP。

L 是一个大数,MTP 是到达该位置的移动次数。