我制作了一个Tic Tac脚趾游戏,使用Minimax和Alpha Beta剪枝。我想为Tic (10x10)制作一个电脑人工智能,但它的游戏树的大小却是惊人的大。
我的代码是这样的,我只需要改变两个变量来改变板的大小+连续需要的单元格才能获胜。示例:
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脚趾从10x10变成3x3的计划,效果很好。
然后,我改变了boardSize = 4和winStreak = 3,使它成为(4x4)抽搐脚趾游戏。
现在,我认为Minimax与Alpha Beta剪枝将足以解决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.
}
}我还可以应用什么优化来使代码运行得更快?
发布于 2018-07-19 19:47:07
有几种可能提高您的程序的性能。
k的最佳移动,并将其用作深度k + 1的minimax中的第一个候选项。此外,您不仅可以存储最佳移动,还可以存储整个最佳移动序列,这称为主变化。因此,在找到深度k的主变化后,将其提供给深度k + 1上的极小值调用,它通常会产生许多良好的α-β袖口。Javascript标记,所以我假设您正在使用这种语言来实现算法。就性能而言,Javascript并不是最好的语言。因此,如果您熟悉C、C++或Java等语言,那么在其中一种语言中重写程序可以极大地提高性能。最后,你的话
人们甚至可以用Minimax + Alpha Beta剪枝来解决国际象棋
严格地说不是真的,因为下棋还没有解决。但是有一些国际象棋程序可以轻松击败人类玩家(使用极小值和α-β剪枝以及许多其他更先进的技术)。所以,这个节目可以击败专家球员和世界冠军并不意味着它打得很完美。
https://stackoverflow.com/questions/51427156
复制相似问题