我使用 Minimax 和 Alpha Beta 剪枝制作了一款 Tic Tac Toe 游戏。我想为 Tic Tac Toe (10x10) 游戏制作一个计算机 AI,但它的游戏树尺寸大得离谱。
我的代码是这样的,我只需要更改两个变量来更改棋盘大小+连续获胜所需的单元格。 示例:
boardSize = 3 // This is for 3x3 tic tac toe
boardSize = 4 // This is for 4x4 tic tac toe
boardSize = 10 // This is for 10x10 tic tac toe
和
winStreak = 3 // Need to make 3 cells in a row to win
winStreak = 4 // Need to make 4 cells in a row to win
我希望你明白了。
所以,我改变了制作井字棋的计划,从 10x10 改为 3x3,效果很好。
然后我更改
boardSize = 4
和 winStreak = 3
使其成为 (4x4) 井字游戏。
现在,我认为 Minimax 结合 Alpha Beta 剪枝足以解决 4x4 的问题,但惊讶地发现,事实并非如此。
当我(人类)迈出第一步时,极小极大算法会搜索 5-10 分钟,然后浏览器选项卡就会崩溃。它甚至无法迈出第一步。
如何提高其速度?人们甚至能够使用 Minimax + Alpha Beta 剪枝来解决国际象棋问题,但是我的代码有什么问题吗?
我的完整代码大约有 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
找到的最佳移动,并将其用作深度 k + 1
的最小最大中的第一个候选。此外,您不仅可以存储最佳移动,还可以存储最佳移动的整个序列,这称为主变分。因此,在您找到深度 k
的主要变化之后,将其提供给深度 k + 1
上的极小极大调用,它通常会产生很多良好的 alpha-beta 截止值。Javascript
标签,我假设您正在使用这种语言来实现算法。就性能而言,Javascript 并不被认为是最好的语言。因此,如果您熟悉 C、C++ 或 Java 等语言,使用其中一种语言重写程序可以显着提高性能。最后,你的那句话
人们甚至能够使用 Minimax + Alpha Beta 剪枝来解决国际象棋问题
严格来说并不正确,因为国际象棋还不是一个已解决的游戏。但是存在可以轻松击败人类玩家的国际象棋程序(使用带有 alpha-beta 剪枝的极小极大值以及许多其他更先进的技术)。因此,程序能够击败专家玩家和世界冠军并不意味着它运行完美。