在井字游戏的极小化极大算法中实现Alpha-Beta剪枝

在我的方法newminimax49中,我使用了一个极小化极大算法,该算法利用了记忆化和其他一些在这篇文章中建议的改进。该方法使用了一个简单的启发式棋盘评估函数。我的问题主要关于Alpha-Beta剪枝,即我的极小化极大方法是否使用了Alpha-Beta剪枝。据我所知,我认为它确实使用了,但是我用来实现它的方法似乎过于简单,不太可能有效。此外,其他人建议我使用Alpha-Beta剪枝,而正如我所说,我认为我的极小化极大方法已经在使用,这让我认为我在这里做的是其他事情。所以这里是我的newminimax49方法:

//这个方法返回一个包含两个元素的int数组,包含最佳可能的下一步位置和其得分。利用记忆化和据称的Alpha-Beta剪枝来提高性能。Alpha-Beta剪枝可以在如下的代码行中看到:
/*if(bestScore==-10)
     break;*///
//这基本上意味着如果达到的最佳得分是最佳可能的得分,那么就停止探索其他可用的移动。通过这样做,我认为我应用了Alpha-Beta剪枝的相同原理。
public int[] newminimax49(){
    int bestScore = (turn == 'O') ? +9 : -9;    //X是极小化者,O是极大化者
    int bestPos=-1;
    int currentScore;
    //boardShow();
    String stateString = "";
    for (int i=0; ibestScore){
                    bestScore = currentScore;
                    bestPos = x;
                    if(bestScore==10)
                        break;
                }
            }
            i++;
        }
    }
    int[] answer = {bestScore, bestPos};
    oldAnswers.put (stateString, answer);
    return answer;
}

我在类State2中使用的字段和构造函数:

private char [] state;  //棋盘的实际内容
private char turn;  //轮到谁走
private Map oldAnswers; //用于记忆化。它保存每个状态及其产生的得分,允许我们停止探索某个节点的子节点,如果一个相似的节点的得分已经之前计算过。键是棋盘状态(例如OX------X),int数组是一个包含状态的得分和最后放置的种子的位置的两个元素的数组。
private Map RowCol; //一个将棋盘从普通数组表示转换为二维数组表示的位置映射。例如:位置0映射到二维数组棋盘上的0,0,位置1映射到0,1,等等。
private static int n;   //棋盘的大小
private static int stateID; //一个简单的递增器,用于显示newminiax49方法中的递归调用次数。
private static int countX, countO; //放置的X和O的数量
private static int lastAdded; //最后放置的种子的位置
private char [][] DDState; //一个表示棋盘的二维数组。包含与state[]相同的值。用于检查棋盘状态的函数中简化操作。
public State2(int n){
    int a=0;
    State2.n=n;
    state=new char[n*n];
    RowCol=new HashMap();
    countX=0;
    countO=0;
    //初始化棋盘为空槽
    for(int i = 0; i();
}

补充方法:

getAvailableMoves,返回一个包含棋盘上空槽的数组(即可能的下一步移动)。

public int[] getAvailableMoves(){
    int count=0;
    int i=0;
    for(int j=0; j

isGameOver2(),简单地检查当前棋盘状态是否游戏结束。返回字符'X'、'O'、'D'和'N',分别表示X获胜、O获胜、平局和游戏未结束。

public char isGameOver2(){
    char turnOpp;
    int count;
    if(turn=='X'){
        count=countO;
        turnOpp='O';
    }
    else {
        count=countX;
        turnOpp='X';
    }
    if(count>=n){
        //^如果每个玩家在棋盘上的种子少于n,则没有获胜的可能
        //开始检查
        //DDState[RowCol.get(lastAdded)[0]][RowCol.get(lastAdded)[1]]=turn;
        //检查列是否获胜
        for(int i=0; i

回答:

你已经在使用某种“简化”的Alpha-Beta剪枝:目前,当一个玩家找到一个获胜位置时,你就会进行剪枝。

一个正确的AB剪枝会传递一个Alpha和一个Beta值,以确定玩家将达到的最小和最大值。在那里,当一个得分比当前的“最坏情况”差或相等时,你就会进行剪枝。

在你的情况下,你不仅可以在获胜得分时进行剪枝(如你目前所做的那样),还可以在一些得分为0的分数上进行剪枝。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注