- int AlphaBeta(int depth , int alpha, int beta) {
- if (depth == 0) {
- return Evaluate();
- }
- GenerateLegalMoves();
- while (MovesLeft()) {
- MakeNextMove();
- val = - AlphaBeta(depth - 1 , -beta, -alpha);
- UnmakeMove();
- if (val >= beta) {
- return beta;
- }
- if (val > alpha) {
- alpha = val;
- }
- }
- return alpha;
- } 把醒目的部分去掉,剩下的就是最小-最大函数。可以看出现在的算法没有太多的改变。 这个函数需要传递的参数有:需要搜索的深度,负无穷大即 Alpha,以及正无穷大即 Beta:
- val = AlphaBeta(5, -INFINITY, INFINITY); 这样就完成了 5层的搜索。我在写最小 -最大函数时,用了一个诀窍来避免用了“ Min”还用“ Max”函数。在那个算法中,我从递归中返回时简单地对返回值取了负数。这样就使函数值在每一次递归中改变评价的角度,以反映双方棋手的交替着子,并且它们的目标是对立的。 在 Alpha-Beta函数中我们做了同样的处理。唯一使算法感到复杂的是, Alpha和 Beta是不断互换的。当函数递归时, Alpha和 Beta不但取负数而且位置交换了,这就使得情况比口袋的例子复杂,但是可以证明它只是比最小 -最大算法更好而已。 最终出现的情况是,在搜索树的很多地方, Beta是很容易超过的,因此很多工作都免去了。 可能的弱点 这个算法严重依赖于着法的寻找顺序。如果你总是先去搜索最坏的着法,那么 Beta截断就不会发生,因此该算法就如同最小 -最大一样,效率非常低。该算法最终会找遍整个博弈树,就像最小 -最大算法一样。 如果程序总是能挑最好的着法来首先搜索,那么数学上有效分枝因子就接近于实际分枝因子的平方根。这是 Alpha-Beta算法可能达到的最好的情况。 由于国际象棋的分枝因子在 35左右,这就意味着 Alpha-Beta算法能使国际象棋搜索树的分枝因子变成 6。 这是很大的改进,在搜索结点数一样的情况下,可以使你的搜索深度达到原来的两倍。这就是为什么使用 Alpha-Beta搜索时,着法顺序至关重要的原因。 原文: http://www.seanet.com/~brucemo/topics/alphabeta.htm 译者:象棋百科全书网 ( webmaster@xqbase.com )
Alpha-Beta搜索
最新推荐文章于 2023-03-03 19:47:47 发布