Min / Max Tic Tac Toe

时间:2011-07-04 19:41:23

标签: java algorithm minmax

我正在用min / max创建一个tic tac toe,所以我可以将它扩展为alpha-beta修剪。所以在我的min / max期间,我发现一条路径是否导致+1(X win)-1(O win)或0(Draw)但是对于这样的板配置:

在0转弯期间,它会选择左下角,因为这一举动导致了胜利。我应该检查每个表的块,然后它不会运行得那么快,我不认为应该如何实现最小值/最大值。

0|x|0
-|x|-
-|-|- 

有人可以解释为什么min / max不够智能来检测它。我虽然看了左边的节点并返回+ 1 / -1 / 0。

2 个答案:

答案 0 :(得分:2)

编辑:我一直在混合“纯粹”极小极大,使用minimax +启发式。我已经编辑了我的答案来解决这个问题。

也许有助于定义minmax。来自An article by a UC Berkeley student

minimax(player,board)
    if(game over in current board position)
        return winner
    children = all legal moves for player from this board
    if(max's turn)
        return maximal score of calling minimax on all the children
    else (min's turn)
        return minimal score of calling minimax on all the children

使用minimax,您正在努力减少损失,而不是最大化您的收益。所以,“你的”转弯是min's转。根据此定义,如果您通过选择正方形输掉,则会将其标记为-1。如果您打平,但永远不会丢失,则会将其标记为0。只有在保证获胜的情况下,才会将其标记为1

  

我应该检查每个表的块

如果您正确定义了得分和算法(将正确的玩家与正确的逻辑相匹配),则无需“检查阻止”。玩家没有阻止的任何游戏子树都应该被隐式地评估-1,因为在某些时候(可能非常快),它会评估为亏损,并且这种损失会冒出来。

此算法的真正问题(以及您可能获得的结果是您不期望的结果)是所有子树导致可能的损失。此时,您需要使用启发式方法来获取有关应采取哪种移动的更好信息。你需要比简单{-1, 0, 1}更好的东西,因为有些动作可以让你获胜,但你会阻止它们,因为你也可能输掉。

答案 1 :(得分:0)

我不太确定你的问题。如前所述,当多条路径导致胜利或所有路径都导致丢失时,min / max会出现问题。在这种情况下,在数学上是正确的,以选择任何或获胜的路径或任何路径来完成损失。然而,如果玩一个非完美的对手,选择最短的获胜路径和最长的失去路径通常更为明智(希望对手不能完美并选择错误的选择)。

使用每次递归的衰减在min / max中很容易实现此行为。即每当你从递归调用返回一些东西时,将结果乘以0.9或类似的东西。这将导致较长的负路径得分较高,较长的正路径得分较小。

一旦你开始使用启发式方法突破,这确实会导致问题。