在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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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