考虑我从头开始构建井字游戏,我目前正在尝试使用minimax算法,以便我可以将计算机作为播放器1而我自己作为播放器2.我认为我理解minimax算法(作为某种形式的深度第一次搜索)。
我的问题是,minimax算法最初的树是如何工作的?我看到的所有例子都有树已经在终端节点中用一些数值得出。
例如:
max
/ \
min
/\ /\
7 2 1 5
我已经看到了这个更简单的树版本,以及如何选择终端节点中值为1的节点的路径。我们如何才能获得7,2,1和5的优势?让我们说井井有条......我的好奇心在这里徘徊。
答案 0 :(得分:0)
你似乎在问两个问题。我先解决第二个问题。您问我们如何在终端节点中获取值。这取决于我们正在处理的游戏类型。对于tic-tac-toe,所有叶节点将等于-1,0或1. -1表示丢失,0表示平局,1表示胜利。必须评估每个节点以查看它是否是终端节点(即游戏是否已结束),如果是,则为其分配适当的值。您经常在搜索树中看到其他值的原因是因为在更复杂的游戏中,无法评估整个树,因此应用启发式评估函数,通常包含各种值。但对于井字游戏来说,这是无关紧要的。
你还问过这个极小极大树是如何制作的。标准的minimax树是使用递归生成的。为tictactoe简化的伪代码看起来像这样
function minimax(depth,maximizingPlayer)
if(node is terminal)
return value;
if (maximizingPlayer)
bestValue = -infinity;
for each possible legal move
makeMove(move)
value = minimax(depth-1,false);
bestValue = max(bestValue,value);
unmakeMove(move);
return bestValue
else // minimizing player
bestValue = infinity;
for each possible legal move
makeMove(move)
value = minimax(depth-1,true);
bestValue = min(bestValue,value);
unmakeMove(move);
return bestValue