井字游戏的极小化极大算法。希望得到一些建议

我正在尝试编写极小化极大函数,使计算机总是赢或平局。我的算法已经到了反应性的阶段,大多数情况下会打成平局(有时赢有时输)。以下是我目前的代码。

public int minimax(char[][] state, int depth, boolean maximizingPlayer){    BoardState node = new BoardState(state);    if(depth == 0 || new BoardState(state).terminalState()){        return score(node);    }    if(maximizingPlayer){        int bestValue = Integer.MIN_VALUE;        ArrayList<int[]> moves = node.moves();        for(int[] move : moves){            state[move[0]][move[1]] = mark;            int value = minimax(state, depth - 1, false);            if(value > bestValue){                bestValue = value;                bestX = move[0];                bestY = move[1];            }            state[move[0]][move[1]] = '-';        }        return bestValue;    }    else{        int bestValue = Integer.MAX_VALUE;        ArrayList<int[]> moves = node.moves();        for(int[] move : moves){            state[move[0]][move[1]] = context.getOpposingMark();            int value = minimax(state, depth - 1, true);            if(value < bestValue){                bestValue = value;                bestX = move[0];                bestY = move[1];            }            state[move[0]][move[1]] = '-';        }        return bestValue;    }}private int score(BoardState node){    if(node.winner(mark)){        return 10;    }    else if(node.winner(context.getOpposingMark())){        return -10;    }    else if(node.winningPosition(mark)){        return 1;    }    else if(node.winningPosition(context.getOpposingMark())){        return -1;    }    else{        return 0;    }}

我的函数调用看起来像这样。

minimax(state, 2, true);

我遇到的问题是,如果增加深度,计算机就更不可能阻止对手获胜。然而,由于深度只有二,我认为算法没有足够的洞察力来阻止分叉移动(当对方玩家有一个可以放置在两个位置以赢得游戏的移动时)。有没有人能给我一些建议或指导,告诉我如何修改这个算法?我可以根据需要提供额外的源代码。


回答:

你所有的非终止位置的得分都是0。请仔细查看前终止位置,即那些一步可以导致立即获胜的位置。

例如,尝试为你在该位置的每一步获胜移动评分+1,而为对手在该位置的每一步获胜移动评分-1或-2。这将使算法更容易修剪对手有多种获胜方式而你只有少数几种的分支。

计算即时获胜移动应该相当便宜。当然,这基本上是内置的下降步骤,所以你的下降深度实际上会多一层。你可以减少初始允许的深度。

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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