2011-11-23 42 views
0

使用时用极小α-β剪枝,是有可能有α和β为类变量,而不是通过递归发送它们的?带Alpha-Beta修剪的Minimax;类变量或通过递归发送它们?

相反的:

private ValuedMove AlphaBetaSearch(Board state) 
{ 
    return MaxValue(state, 0, int.MinValue, int.MaxValue); 
} 

private ValuedMove MaxValue(Board state, int d, int alpha, int beta) 
{ 
    if (d == depth || state.GameRunning == false) 
     return new ValuedMove(Heuristic.BoardValue(state, Player)); 

    ValuedMove v = new ValuedMove(int.MinValue); 
    foreach (Move move in LegalMoves) 
    { 
     ValuedMove minCheck = MinValue(state.ImagineMove(move), d + 1, alpha, beta); 
     if (v.Value >= beta) 
      return v; 
     alpha = Max(alpha, v.Value); 
    } 

    return v; 
} 

private ValuedMove MinValue(Board state, int d, int alpha, int beta) 
{ 
    //Minimax and Alpha-Beta logic here 
} 

我可以这样写:

int alpha, beta; 

private ValuedMove AlphaBetaSearch(Board state) 
{ 
    alpha = int.MinValue; 
    beta = int.MaxValue; 
    return MaxValue(state, 0); 
} 

private ValuedMove MaxValue(Board state, int d) 
{ 
    //Minimax and Alpha-Beta logic here 
} 

private ValuedMove MinValue(Board state, int d) 
{ 
    //Minimax and Alpha-Beta logic here 
} 

我问,因为当我试图这样做对代码进行优化(我的想法是,如果我没必要每次递归都会发送整数,我可能会稍稍剥离),我的棋手突然变成了一个白痴,牺牲了他的女王杀了一个棋子,并且犯了其他愚蠢的错误。

他经常比他的“常规Alpha-Beta”对手表现得差得多,我猜这是因为他也只是搜索树的一小部分而不是他的对手(他们都使用相同的深度,但修改过的玩家似乎修剪更积极,从而减少访问节点的数量)。我现在做了两次,以确保,而且除了我在这里展示的内容外,我什么也没有改变。

如果我理解了α-β算法是正确的,这应该没有什么差别,但我的棋手,它的作用。我做错了什么?

所以,我的主要问题现在还不是它是否是做了优化明智或代码的做法明智的好东西,而在于是否应该可以做还是不做。

+0

有了的更改,当你'alpha'和'beta'曾经得到改变? – AakashM

+0

我在其中一个函数中添加了代码以显示您。除了没有alpha和beta作为参数外,修改的功能是相同的。 –

回答

4

你不能真正做到这一点。 AlphaBeta是一个递归算法。这意味着它自称。每次它自己调用时,它都会对alpha和beta(可能)有不同的值。每个递归都需要自己版本的变量,它们将保存不同的值。如果在类中包含变量,则只有在AlphaBeta的所有(递归)调用之间共享一组变量。

这是说,带班成员替换函数的参数可能不是一个很好的优化。这两种技术都有成本。在调用之前需要将参数压入堆栈,并且需要通过指针间接访问成员(隐藏的this指针)。让我们忘记哪些成本更高。这种微观优化可能太微不足道了,根本没有什么区别。

+0

当然你是对的。我知道我的理论有些问题,但是不能把它放在手上,因为我所有的手册Alpha-Beta例子显然太简单了。谢谢! –