当前位置: 首页 > 知识库问答 >
问题:

使用alpha-beta剪枝返回不同值的minimax算法

饶铭
2023-03-14

我在写国际象棋的最小化算法。

对于不带alpha-beta修剪的minimax和带alpha-beta修剪的minimax,我得到了不同的最终结果值。

下面是我的伪代码。有人能帮我吗?

极小极大()

public int miniMax(int depth, Board b, boolean maxPlayer) {
    if(depth == 0)
        return evaluateBoard(b);
    if(maxPlayer) {
        int bestMoveVal = 0;  
        for( each Max player's moves) {
            // make a move on a temp board
            int eval = miniMax(depth - 1, tempBoard, false);
            bestMoveVal = Math.max(bestMoveVal, eval);
        }
        return bestMoveVal;
    }
    else {
        int bestMoveVal = 0; 
        for (each Min player's moves) {
            // make a move on a temp board. 
            int eval = miniMax(depth - 1, tempBoard, true);
            bestMoveVal = Math.max(bestMoveVal, eval);
        }
        return bestMoveVal;
    }
}

αβ()

public int alphabeta(int depth, Board b, int alpha, int beta, boolean maxPlayer) {
        if(depth == 0)
            return evaluateBoard(b);
        if(maxPlayer) {
            for(each max player's moves) {
                // make a move on a temp board
                int eval = alphabeta(depth - 1, temp, alpha, beta, false);
                alpha = Math.max(alpha, eval);
                if(beta <= alpha) //beta cut off;
                    break;
            }
            return alpha;
        }
        else {
            for(each of min's moves) {
                // make a move on a temp board
                int eval = alphabeta(depth - 1, temp, alpha, beta, false);
                beta = Math.min(beta, eval);
                if(beta <= alpha)
                    break; // alpha cut off;
            }
            return beta;
        }
    }

董事会代表董事会。对于每一次移动,我都在传递的董事会对象的副本上移动,然后将这个临时董事会传递给进一步的调用。

evaluateBoard(董事会b)接收董事会并根据给定董事会情景计算分数。

共有1个答案

澹台俊材
2023-03-14

代码中的一个大问题是alphabeta不是递归的,因为它应该是递归的。它调用MiniMax

alphabeta中的递归调用应该调用alphabeta,否则它是根本错误的。也就是说,alpha-beta修剪应用于每个深度级别,而不仅仅是顶层。

minMax函数中,您有bestMoveVal=Math。最大值(最佳移动值、评估值) 用于最小化和最大化玩家。

 类似资料:
  • 我很难让Alpha-beta修剪正常工作。我有一个函数Minimax算法,我试着去适应,但没有用。我在维基百科上用了这个例子 目前,该算法似乎在大多数情况下都按预期运行,但不管怎样,它都会选择第一个测试节点。 这可能是因为缺乏理解,但我已经花了数小时阅读了这篇文章。让我困惑的是,在零和博弈中,算法如何知道当达到深度极限时哪个节点是最佳选择;在哪一点上,我们还不能确定哪位球员会从这样的举动中受益最大

  • 我正在尝试为一个游戏创建一个AI播放器,使用带有alpha-beta修剪的minimax算法。我在正确地执行它时遇到了一些困难。我有两个功能要使用,一个用于评估给定玩家(返回一些分数)getBoardScore的当前棋盘状态,另一个用于返回每个可能移动(从给定玩家的给定棋盘状态)GetPossibleBoard创建的所有可能棋盘状态。 我的AI通过最初调用alphaBeta,将其传递到当前的板状态

  • 我试图让Alpha-beta修剪工作,但与我的Minimax函数相比,它给了我完全错误的动作。这是我的极大极小函数,它现在工作得很好。 这是我的Alphabeta修剪函数 两者都使用相同的评估,不确定这里出了什么问题。谢谢你的帮助。

  • 在我的方法newminimax49中,我有一个minimax算法,它利用了本文中建议给我的记忆和其他一般性改进。该方法使用一个简单的启发式电路板评估函数。我的问题基本上是关于alpha-beta修剪,即我的minimax方法是否使用alpha-beta修剪。据我所知,我相信这是真的,然而,我用来实现它的东西似乎太简单了,不可能是真的。此外,其他人建议我使用alpha-beta剪枝,正如我所说的,我

  • 我目前正在从事我的第一个C项目,并选择使用基于Minimax的AI编写一个Connect Four(又名Score 4),更具体地说是基于Alpha-Beta修剪方法。 到目前为止,我了解到AB修剪包含在一个递归算法中,该算法考虑了一个alpha和一个beta参数,这是您在游戏树中找不到的“极限”。此外,我们定义了最大化和最小化玩家,前者是第一个开始玩游戏的玩家。最后,还有一个“深度”,我把它理解

  • 本篇将简要介绍α-β剪枝,这是一种基于剪枝( α-βcut-off)的深度优先搜索(depth-first search)。 一、什么是α剪枝? (1)将走棋方定为MAX方,因为它选择着法时总是对其子节点的评估值取极大值,即选择对自己最为有利的着法; (2)将应对方定为MIN方,因为它走棋时需要对其子节点的评估值取极小值,即选择对走棋方最为不利的、最有钳制作用的着法。 (3)在对博弈树(博弈树是指