因此,我正在开发一项围绕MiniMax算法的任务,该游戏是Mancala和NIM的结合。程序的工作方式是询问用户当前的董事会状态,并且该程序假设吐出用户为赢得游戏而应该采取的第一步。我只是感到困惑是因为我想用所有可能的解决方案生成整个游戏树,并且叶子节点首先具有效用函数然后递归地运行MiniMax算法或者在MiniMax算法中创建树?我很抱歉,如果这个问题非常清楚,但我只是坚持这个想法,我似乎无法理解它。
答案 0 :(得分:0)
编写minimax函数的正确方法是通过制作和取消移动来遍历搜索树。您一次只能存储一个游戏状态,并且通过在该游戏状态下制作和取消移动您遍历整个树。如果这令人困惑,那么查看一些minimax psudocode会很有帮助。请注意,有两种常用的minimax变体,常规minimax和negamax。 psudeocode是minimax,因为它更直观,但在实践中我会推荐negamax变体,因为它更简单:
int max(int depth){
if(this state is terminal){//won, lost, drawn, or desired search depth is reached
return value
}
//if the state is non terminal
//we want to examine all child nodes. We do this by making all possible moves from this state, calling the min function
//(all childs of max nodes are min nodes) and then unmaking the moves.
int bestVal = -infinity;
generate move list;
for(all moves in move list){
makeMove(this move in move list);
int val = min(depth -1);
unMakeMove(this move in move list);
bestVal = max(val,bestVal);
}
return bestVal;
}
int min(int depth){
if(this state is terminal){//won, lost, drawn, or desired search depth is reached
return value
}
//if the state is non terminal
//we want to examine all child nodes. We do this by making all possible moves from this state, calling the max function
//(all childs of min nodes are max nodes) and then unmaking the moves.
int bestVal = +infinity;
generate move list;
for(all moves in move list){
makeMove(this move in move list);
int val = min(depth -1);
unMakeMove(this move in move list);
bestVal = min(val,bestVal);
}
return bestVal;
}
因此,您可以通过跟踪一个游戏状态并在该游戏状态下递归制作和取消移动来遍历整个树。一旦你理解了alpha beta修剪的这种看法。另请注意,此函数仅返回最佳移动的值而不是移动本身。你需要一个特殊的功能来跟踪最佳移动以及在根目录下调用。