我按照这个伪代码用Java编写代码。一切都很清楚,除了实际捕捉到最佳动作外,一切都如预期。我在最大化玩家条件内添加的if condition似乎返回了当前棋盘中最后一个可玩的移动。所以它总是淡化。如何跟踪最佳移动?
这是伪代码
function minimax(position, depth, alpha, beta, maximizingPlayer)
if depth == 0 or game over in position
return static evaluation of position
if maximizingPlayer
maxEval = -infinity
for each move of validMoves
eval = minimax(child, depth - 1, alpha, beta false)
maxEval = max(maxEval, eval)
alpha = max(alpha, eval)
if depth == 3
bestmove = move (Is this correct?)
if beta <= alpha
break
return maxEval
else
minEval = +infinity
for each move of validMoves
eval = minimax(child, depth - 1, alpha, beta true)
minEval = min(minEval, eval)
beta = min(beta, eval)
if beta <= alpha
break
return minEval
// initial call
minimax(currentPosition, 3, -∞, +∞, true)
您实际上并没有检查这个动作是否比其他动作好,所以您只是得到了最后一个动作。
你需要检查移动的分数是否高于之前看到的其他移动的分数。由于你已经有了包含迄今为止看到的最高分数的maxEval
,你可以在更新bestmove
之前简单地添加eval == maxEval
的检查。