最优我的意思是:
- 如果 max 有获胜策略,则 minimax 将返回 max 策略以最少的步数获胜。
- 如果 min 有一个获胜的策略,那么 minimax 将返回 max 的策略,其中失去的移动次数最多。
- 如果两者都没有获胜策略,则 minimax 将返回具有最多可绘制步数的 max 策略。
这个想法是您希望以尽可能少的步数获胜,但如果您无法获胜,那么您希望尽可能长时间地拖延比赛,以便对手有更多犯错的机会。
那么,如何让 minimax 返回 max 的最佳策略呢?
最优我的意思是:
这个想法是您希望以尽可能少的步数获胜,但如果您无法获胜,那么您希望尽可能长时间地拖延比赛,以便对手有更多犯错的机会。
那么,如何让 minimax 返回 max 的最佳策略呢?
Minimax 处理两种值:
通常,我们对值使用以下指称语义:
这种指称语义的优点是比较值与比较数字相同(即您不需要特殊的比较函数)。我们可以扩展这种指称语义以包含输赢的最优性,如下所示:
对值使用这种指称语义只需要对极小极大算法进行少量更改:
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 平局,
简洁版本:
L 是一个大数,MTP 是到达该位置的移动次数。