在Java中为四子棋实现极小化极大算法

我正在尝试构建一个使用极小化极大算法(以及alpha-beta剪枝)的四子棋游戏,主要是为了证明自己能够做到。然而,我遇到的一个主要概念性问题是如何实际利用极小化极大算法。我的做法是有一个AI类,其中有一个函数用于执行极小化极大算法,并返回一个整数。

public int minimax(Board board, int depth, int alpha, int beta, String player) {    if(depth == 0 || board.getScore() >= 512) {        return board.getScore();    }    else if(player.equals("computer")) {        int temp = -1000000;        for(Integer[] moves : board.availableMoves) {            board.putPiece(player, moves[0]);            temp = Math.max(temp, minimax(board, depth-1, alpha, beta, "human"));            board.removePiece(moves[0], moves[1]);            alpha = Math.max(alpha, temp);            if (alpha >= beta) {                break;            }        }        return temp;    }    else {        int temp = 1000000;        for(Integer[] moves : board.availableMoves) {            board.putPiece(player, moves[0]);            temp = Math.min(temp, minimax(board, depth+1, alpha, beta, "computer"));            board.removePiece(moves[0], moves[1]);            beta = Math.min(beta, temp);            if(alpha >= beta) {                break;            }        }        return temp;    }}

这个函数由Game类中的computerMove()函数调用。

public int computerMove() {    Board tempBoard = board;    int bestMove = 0;    AI ai = new AI();    ai.minimax(board, difficulty, -1000000, 1000000, "computer");    return bestMove;}

但是,我该如何处理返回的整数呢?我如何利用它来实际移动棋子?返回的整数只是我能得到的最佳棋盘,对吗?它并没有特别告诉我应该在哪里移动棋子或选择哪个棋盘。

任何帮助都将不胜感激。

谢谢,


回答:

书上都说只返回分数,但这对于实际玩游戏来说是不切实际的。当然,在每个地方维护最佳移动的开销确实会减慢程序的速度,所以通常你会使用一个驱动函数来进行第一级扩展,并额外跟踪最佳移动。这实际上是用一个argmax函数包装实现,这只是一个花哨的说法,意思是它返回顶级的最佳移动而不是分数。你可以在我去年参与的一个小项目中看到这个例子的实现。代码是用C#写的,但与Java足够接近,你可以理解这个概念。

另一种方法是修改代码以返回一个包含分数和最佳移动的元组(具有多个字段的类)。这种方法更简单(在我看来也更整洁),而不需要编写argmax包装器,但如果没有一些额外的工程,这可能会导致极小化极大函数的明显减速,因为它会导致大量的分配。如果性能不是你的首要考虑,这可能是最好的方法。

我还应该指出,你的实现至少有一个错误。深度应该始终在减少,无论谁在玩,而在你的人类分支中,你让深度在人类玩家时增加。这意味着深度永远不会达到0,基本情况只会在确定玩家获胜时才会触发。此外,在使用alpha-beta剪枝时,重要的是棋盘评估要知道轮到谁以及谁是最大化玩家,否则你会遇到很多难以发现的错误。你在这里没有展示那部分代码,但我想要指出这一点,因为每次都会让我犯错。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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