我使用Minimax和Alpha Beta Pruning制作了Tic Tac Toe游戏。我想为井字游戏(10x10)游戏制作计算机AI,但是它的游戏树很大。
我的代码是这样的,我只需要更改两个变量即可更改连续赢取所需的Board Size + Cells。 示例:
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
我希望你明白了。
因此,我将我的Tic Tac Toe的计划从10x10更改为3x3,并且效果很好。
然后我更改boardSize = 4
和winStreak = 3
,使其成为(4x4)井字游戏。
现在,我认为带有Alpha Beta修剪功能的Minimax足以解决4x4的问题,但是很惊讶地看到,事实并非如此。
当我迈出第一步(人类)时,minimax算法会搜索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.
}
}
还有什么我可以应用的优化方法来使代码运行更快?
答案 0 :(得分:2)
有几种方法可以提高程序的性能。
k
的minimax中找到的最佳移动,并将其用作深度为k + 1
的minimax中的第一个候选对象。此外,您不仅可以存储最佳移动,还可以存储最佳移动的整个序列(称为主变量)。因此,在找到深度k
的主要变化后,将其馈入深度k + 1
的minimax调用中,通常会产生很多良好的alpha-beta截止值。Javascript
标记,因此我假设您正在使用该语言来实现算法。就性能而言,JavaScript不是最佳语言。因此,如果您熟悉C,C ++或Java之类的语言,则用其中一种语言重写程序可以大大提高性能。最后,您的短语
严格说来,人们甚至可以使用Minimax + Alpha Beta修剪来解决国际象棋
并不是真的,因为国际象棋还没有解决。但是,存在一些可以轻易击败人类玩家的国际象棋程序(使用带有alpha-beta修剪功能的minimax和许多其他更先进的技术)。因此,程序可以打败专家级选手和世界冠军的事实并不意味着它的表现完美。