3

我遵循维基百科文章上的pseducode,我认为我得到了它的工作。但是,它会返回分数,而当我想知道我想要做什么时,这并不完全有帮助。Minimax与Alpha-beta修剪,得到结果

我试过我认为会是最好的举动的一种方式,但我认为它并没有像我实际尝试对抗它时那样工作(国际象棋),AI使得有一定程度的延迟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; 
     } 
    } 

回答

4

深度3是对于像国际象棋的问题很少。在这个深度,大部分力量取决于你的最终评估功能。这种评估功能很难做到可以有效预测电路板的价值。

尝试更简单的东西,可以在更低的深度有效解决。 Tic-Tac-Toe是Min-Max第一次尝试的非常好的游戏。这是因为最终的结果是众所周知的。如果你正确地使用了算法,那么你根本无法击败它。如果你使用Tic-Tac-Toe并且算法失效,那么你知道你有一个错误。

还要注意的是,在某些情况下,最小 - 最大发挥最佳效果,但仍会看起来迟钝到人类的对手。例如,如果没有获胜的机会,Min-Max将开始随机播放,并进行非常愚蠢的动作。事实就是如此,因为Min-Max希望对手也能发挥完美,而人类通常不会这么做。有一些简单的变化可以通过算法来改变这种行为,并且在这种情况下min-max播放“延迟较小”。

+2

我想补充一点,如果评估函数非常简单(仅用于材质),而且没有静止搜索,则在大多数位置,所有移动都会返回相同的分数,而Minimax将无法创建选择。在这种情况下,将使用搜索到的第一步。 –

+0

谢谢!我试过tic tac脚趾,它工作正常。我会努力改进我的评估功能。 – apscience

+0

也尝试获得更高的深度。如果你使用alpha-beta修剪,你已经检查过的所有路径都会告诉你哪些路径可以修剪,哪些路径仍然需要扩展。所以如果你按照错误的顺序展开路径,你仍然需要展开几乎整个树。如果你先采取最好的路径,那么你的修剪将更加有效,因为那时大部分的树都不会被扩展。使用这个事实的通常方法是首先根据一些(快速)启发式对扩展前的可能移动进行排序。这可以在相同的计算时间内导致更大的深度。 – LiKao