我遵循了维基百科文章中的伪代码,并且我认为我已经让它工作了。然而,它返回的是分数,当我想知道我应该采取什么行动时,这并没有什么帮助。
我尝试了一种我认为可以获得最佳行动的方法,但我不认为它有效,因为当我真正尝试与它对战(象棋)时,人工智能会做出一些有点愚蠢的举动,而深度等级为 3。
这是我的函数:
public static function alphaBeta(node, depth, alph, beta, team, tellTheMove:Boolean = false):* { var pointer:ChessMove; if (depth == 0) { return scoreOf(node); } var childrenOf:Vector.<ChessMove > = returnPossibleMoves(node,team); if (childrenOf.length == 0) { return scoreOf(node); } if (team == 0) { for (var i in childrenOf) { var that:Number = alphaBeta(childrenOf[i],depth - 1,alph,beta,1); if(tellTheMove){ } if (that > alph) { alph = that; if(tellTheMove){ pointer = childrenOf[i]; } } if (beta <= alph) { break; } } if(tellTheMove){ return pointer; //Returns the move that's score last exceeded alpha. } return alph; } else { for (var j in childrenOf) { var that2:Number = alphaBeta(childrenOf[j],depth - 1,alph,beta,0); if (that2 < beta) { beta = that2; } if (beta <= alph) { break; } } return beta; } }
回答:
对于像象棋这样的问题,深度 3 太浅了。在这个深度上,大部分能力取决于你的最终评估函数。以一种能够有效预测棋盘价值的方式来完成这个评估函数是非常困难的。
尝试一些更简单的东西,可以在较低的深度有效解决。井字棋是第一次尝试 Min-Max 算法的绝佳游戏。这是因为最终结果是众所周知的。如果你的算法正确,你应该根本无法击败它。如果你玩井字棋并且算法输了,你就知道你犯了一个错误。
还要注意的是,在某些情况下,Min-Max 算法会发挥最佳水平,但对人类对手来说仍然显得很愚蠢。例如,如果没有获胜的机会,Min-Max 算法将开始随机发挥并做出非常愚蠢的举动。这是因为 Min-Max 算法期望对手也完美发挥,但人类通常并非如此。可以对算法进行一些简单的更改来改变这种行为,并使 Min-Max 算法在这种情况下“不那么愚蠢”。