Java 最小/最大抽头

Java 最小/最大抽头,java,algorithm,minmax,Java,Algorithm,Minmax,我正在用min/max创建一个tic-tac-toe,以便将其扩展到alpha-beta修剪。因此,在我的最小/最大值过程中,我发现对于这样的电路板配置,如果一条路径的导联为+1(X-win)-1(O-win)或0(Draw): 在0回合中,它选择左下角,因为这一步将导致它获胜。如果我检查每个表是否有一个块,那么它就不会运行得那么快,我不认为应该这样实现min/max 0|x|0 -|x|- -|-|- 0 | x | 0 -|x|- -|-|- 有人能解释为什么最小值/最大值不够聪明,无法检

我正在用min/max创建一个tic-tac-toe,以便将其扩展到alpha-beta修剪。因此,在我的最小/最大值过程中,我发现对于这样的电路板配置,如果一条路径的导联为+1(X-win)-1(O-win)或0(Draw):

在0回合中,它选择左下角,因为这一步将导致它获胜。如果我检查每个表是否有一个块,那么它就不会运行得那么快,我不认为应该这样实现min/max

0|x|0 -|x|- -|-|- 0 | x | 0 -|x|- -|-|-
有人能解释为什么最小值/最大值不够聪明,无法检测到这一点吗。我认为它查看了左侧节点并返回+1/-1/0。

编辑:我将“纯”minimax与minimax+启发式混为一谈。我已经编辑了我的答案来解决这个问题

也许这有助于定义minmax。发件人:

有了minimax,你试图最小化你的损失,而不是最大化你的收益。所以,“你的”回合是
min的回合。根据此定义,如果选择一个正方形可能会丢失,则它将被标记为
-1
。如果你能打成平局,但决不会输,它将被标记为
0
。只有在保证获胜的情况下,才会将其标记为
1

我应该检查每一张桌子是否有一个街区吗

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


此算法的真正问题(以及您可能会得到意想不到的结果)是所有子树都可能导致损失。在这一点上,你将需要使用启发式来获得关于你应该采取哪一步的更好的信息。你需要比简单的
{-1,0,1}
更好的东西,因为有些动作可以让你赢,但你会阻止它们,因为你也可能输。

我不太确定你的问题。如前所述,当多条路径导致赢或所有路径导致输时,min/max会出现问题。在这种情况下,从数学上正确地选择任何一条或任何一条获胜的路径,或选择任何一条失败的路径。然而,如果与一个不完美的对手比赛,通常选择最短的获胜路径和最长的失败路径更明智(希望对手不是完美的,而是选择了错误的选择)

这种行为很容易在min/max中实现,使用每个递归的衰减。也就是说,每当您从递归调用返回某个内容时,将结果乘以0.9或类似的值。这将导致更长消极路径的分数更高,更长积极路径的分数更小


但是,一旦你开始使用启发式来解决问题,这确实会导致问题。

如果你这样做是为了了解最小/最大值,那很好,但如果不是,tic-tac-toe有更简单的算法。撇开我的其他评论不谈,你实际上没有解释你的算法是如何工作的,也没有向我们提供任何代码,因此我们无法回答这个问题。理论上,最小/最大值没有问题;问题在于你的实现。同意Lord的说法:min/max肯定足够聪明,可以给出正确的答案,我们只能假设你的实现是错误的。@Lord:“如果你这样做是为了了解min/max,那太好了,但如果不是,还有更简单的tic-tac-toe算法”-当然,除非我们在谈论(>3x1)“@Merlyn,说得好!不过,OP的样本似乎表明它是一款“标准”3x3游戏;tic-tac-toe游戏树的XKCD地图:我认为我的分数有缺陷。我认为,如果一场比赛的结果是赢/输的回报-1,1和0。你将如何给棋盘打分。@GSingh:如果你的顶级移动的最终结果总是
-1,1,0
之一,那么它就是有缺陷的。“顶层”是指在整个子树上递归运行算法的结果。了解您应该如何实施评分。谷歌上还有几十个教程。“我认为算法的结果应该是任意整数(谁的绝对值将以剩余游戏树的深度为界),因为你递归地求和每个游戏子树的结果,直到你碰到一个叶子或终端(游戏结束)条件。”我有树叶的分数要加上去。哪个是错误的?有什么更好的方法来处理这个问题。@GSingh:对不起,我把“纯”minimax和minimax+启发式混淆了:(我会编辑我的答案来纠正这个问题。
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