我做了一个Tic-Tac-Toe游戏,使用Minimax和Alpha-Beta修剪。我想为Tic-Tac-Toe(10x10)游戏制作一个计算机AI,但它的游戏树大得离谱。
我的代码是这样的,我只需要更改两个变量就可以更改一行中所需的板大小单元格。例子:
boardSize=3//这是用于3x3 tic tac toe的
boardSize=4//这是用于4x4 tic tac-toe的
boardSize=10//这是用于10x10 tic tac-toe的
和
winStreak=3//需要连续生成3个单元格才能获胜
winStreak=4//需要连续制作4个单元格才能获胜
我希望你明白了。
所以,我把我的计划从10x10改为3x3,效果很好。
然后我改变boardsize=4
和winStreak=3
,使其成为(4x4)井字游戏。
现在,我认为使用Alpha-Beta修剪的Minimax足以解决4x4问题,但惊讶地发现,事实并非如此。
当我第一次移动(人类)时,minimax算法搜索5-10分钟,然后浏览器选项卡就崩溃了。它连第一步都做不到。
我怎样才能提高它的速度?人们甚至能够使用极小值阿尔法贝塔修剪解决国际象棋,但是我的代码有什么问题?
我的完整代码大约有200-300行,所以我将只编写伪代码。
humanMakeMove();
Minimax(); // Bot calls Minimax function to make a move
function Minimax(board, player) {
if (checkResult() != 0) // 0 = Game is on
return checkResult(); // 1 = Win, 0.5 = Draw, -1 = Lose
availableMoves = getAvailableMoves();
for(i = 0; i < availableMoves.length;i++)
{
move = availableMoves[i];
removeMoveFromAvailableMovesArray(move);
if (player == "X")
score = Minimax(board, "O");
else
score = Minimax(board, "X");
board[i] = "-"; // "-" means empty space
if (depth of tree is on first level && score == 1)
return maxScore; //Alpha Beta Pruning is applied here, if we get score of 1, then we don't need to search more.
}
}
我还可以应用哪些优化来加快代码的运行速度?
有几种可能提高程序的性能。
k
的最佳移动,并将其用作深度k1
的minimax中的第一个候选移动。此外,您不仅可以存储最佳移动,还可以存储最佳移动的整个序列,称为主变化。因此,在找到深度k
的主要变量后,将其输入到深度k1
的minimax调用中,它通常会产生许多良好的alpha-beta截止值
Javascript
标记,所以我假设您正在使用这种语言来实现算法。就性能而言,Javascript并不被认为是最好的语言。因此,如果您熟悉C、C或Java等语言,用其中一种语言重写程序可以大大提高性能
最后,你的短语
人们甚至可以使用极小极大阿尔法-贝塔修剪来解国际象棋
严格地说,这不是真的,因为国际象棋还不是一个已解决的游戏。但也有一些国际象棋程序可以轻松击败人类玩家(使用minimax和alpha-beta修剪以及许多其他更先进的技术)。所以,该程序能够击败专家选手和世界冠军的事实并不意味着它玩得很完美。
我在为游戏筷子做一个C程序。 这是一个非常简单的游戏,总共只有625个游戏状态(如果考虑到对称性和不可到达的状态,它甚至更低)。我读过minimax和alpha-beta算法,主要是针对tic-tac-toe的,但我遇到的问题是,在tic-tac-toe中,不可能循环回到以前的状态,而这在筷子中很容易发生。因此,当运行代码时,它将以堆栈溢出结束。 我通过添加以前访问过的州的标志来解决这个问题(我不
我正在尝试用Alpha-beta剪枝来实现Minimax,这是一款3D Tic-Tac-Toe游戏。然而,该算法似乎选择了次优路径。 例如,你可以通过直接跑过立方体的中间或穿过单板来赢得比赛。人工智能似乎选择了下一轮最佳的细胞,而不是当前一轮。 我尝试过重新创建并使用我返回的启发式算法,但没有取得多大进展。不管是哪一层,它似乎都有同样的问题。 代码在这里。 相关部分是和(以及'2'变体,这些只是我
我目前正在尝试写一个能玩象棋游戏的人工智能。为此,我使用了minimax算法的一种变体,该算法迭代每一个可能的移动,然后假设深度为N时,对手(和他们)将以最佳方式进行N个移动。此外观的伪代码如下所示: 当调用“移动”时,它会检测是否拍摄了一幅作品,然后为该作品生成一个分数,该分数被保存到变量“温度”中。对于深度为2的情况,我简单地调用另一个Depth1方法,但改变颜色。对于深度为3的情况,我再次调
我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应
我最近实现了极小极大和阿尔法贝塔修剪算法,我100%确定(自动分级器)我正确地实现了它们。但是当我执行我的程序时,它们的行为不同。我99%确定极小极大和阿尔法贝塔的结束状态应该是相同的。我说得对吗?它们在实现结果的路径上会有所不同吗?因为我们忽略了min将选择的一些值,而max不会选择这些值,反之亦然。
首先,我是java的初学者,我正在尝试模拟TicTacToe游戏。我想使用游戏树为所有状态创建一个可能的树。树中的每个节点都将代表状态并使用此树来决定下一步要做的事情。我计划按如下方式进行, > 接口类包括表示单个移动所需的信息。 抽象/接口类包括以下方法: a、 返回一个新的状态对象,该对象表示应用该移动后游戏的状态。 B.如果当前状态代表其中一名玩家的胜利,则此游戏的获胜者ID。 c、 返回当