Java α-β修剪

Java α-β修剪,java,minmax,Java,Minmax,我正在用alpha-beta构建一个Reversi游戏,我需要你在alpha-beta中的帮助。 问题是,计算机一直在选择位于电路板低端的一个方块。我有一个计算机可能的移动列表(如下面代码所示),这意味着计算机几乎总是选择列表中的最后一个或最后一个移动,即使这不是最好的移动。我的评价函数很简单:黑色部分减去白色部分。顺便说一句:它在深度=1时工作良好,但我需要它在深度=3时工作 public int AlphaBeta(int depth,int turn,TreeNode root,int a

我正在用alpha-beta构建一个Reversi游戏,我需要你在alpha-beta中的帮助。 问题是,计算机一直在选择位于电路板低端的一个方块。我有一个计算机可能的移动列表(如下面代码所示),这意味着计算机几乎总是选择列表中的最后一个或最后一个移动,即使这不是最好的移动。我的评价函数很简单:黑色部分减去白色部分。顺便说一句:它在深度=1时工作良好,但我需要它在深度=3时工作

public int AlphaBeta(int depth,int turn,TreeNode root,int alpha,int beta)
{
    if(depth==0)
        return evaluationFunc(turn,turns,root.board,root);
    else
    {
        buildSons(turn,root);
        TreeNode head =  generateList(root.sons);
        return executeCheckTheSons2(depth,turn,head,alpha,beta);
    }
}

public int executeCheckTheSons2(int depth,int turn,TreeNode head,int alpha,int beta)
    {
        int score;
        if(turn==1)
        {
            while(head!=null)
            {
                head.board=simulateTheMove(head.board,head.getX(),head.getY(),turn);
                score=AlphaBeta(depth-1,turn*-1,head,alpha,beta);
                if(score > alpha)
                {
                    alpha=score;
                    setMove(head);
                }
                if(alpha >= beta)
                    return alpha;
                head=head.next;
            }
                return alpha;
        }
        else
        {
            while(head!=null)
            {
                head.board=simulateTheMove(head.board,head.getX(),head.getY(),turn);
                score=AlphaBeta(depth-1,turn*-1,head,alpha,beta);
                if(score<beta)
                {
                    beta=score;
                    setMove(head);
                }
                if(alpha >= beta)
                    return beta;
                head=head.next;
            }
            return beta;
        }       
    }

    public void setMove(TreeNode root)
    {
        while(root.father.father!=null)
            root=root.father;
        pnt.setX(root.getX());
        pnt.setY(root.getY());
    }
public int-AlphaBeta(int-depth,int-turn,TreeNode-root,int-alpha,int-beta)
{
如果(深度==0)
返回evaluationFunc(回合、回合、根、板、根);
其他的
{
建筑之子(转,根);
TreeNode head=世代列表(根.子);
返回executeCheckTheSons2(深度、转角、头部、alpha、beta);
}
}
公共int executeCheckTheSons2(int深度、int转弯、TreeNode头部、int alpha、int beta)
{
智力得分;
如果(圈数==1)
{
while(head!=null)
{
head.board=模拟移动(head.board,head.getX(),head.getY(),turn);
分数=阿尔法贝塔(深度1,转弯*-1,头部,阿尔法,贝塔);
如果(分数>α)
{
α=分数;
设置移动(头部);
}
如果(α>=β)
返回α;
head=head.next;
}
返回α;
}
其他的
{
while(head!=null)
{
head.board=模拟移动(head.board,head.getX(),head.getY(),turn);
分数=阿尔法贝塔(深度1,转弯*-1,头部,阿尔法,贝塔);
如果(分数=β)
返回β;
head=head.next;
}
返回β;
}       
}
公共void setMove(树节点根)
{
while(root.father.father!=null)
root=root.father;
pnt.setX(root.getX());
pnt.setY(root.getY());
}

我认为错误在
setMove
功能中。我想这就是设置最终坐标以设置工件的函数。目前,您正在为树中的每个深度调用此函数,即使此分支的结果不是全局最佳结果

例如,假设你正在回避最后一个可能的动作。从depth=3开始,然后递归调用自己的
depth=2
。当您输入执行ECECKTHESONS 2时,现在您将以0分开始,并评估可能的移动。其中一个移动可能会给您一个大于0的分数,因此您将调用
setMove(head)
并设置坐标以移动到最后一个可能的移动。当您现在从函数返回时,您会将此深度的分数记录在分数中,但从全局来看,这并不是一个伟大的举动。但是,最后一次调用setMove仍然处于活动状态,之后您不会更改它

您应该将此调用移出executeCheckTheSons2,并将其移到某个上层函数中。或者,在
executeCheckTheSons2
函数的局部变量中记录x和y坐标,然后在从函数返回之前调用
setMove

如果这个问题对你有用,请接受这个答案