📜  ai-alpha-beta修剪

📅  最后修改于: 2020-09-23 09:21:22             🧑  作者: Mango

Alpha-Beta修剪

  • Alpha-beta修剪是minimax算法的修改版本。它是minimax算法的一种优化技术。
  • 正如我们在minimax搜索算法中看到的那样,它必须检查的游戏状态数在树的深度上呈指数级。由于我们无法消除指数,因此可以将其减半。因此,存在一种无需检查游戏树的每个节点就可以计算正确的minimax决策的技术,该技术称为修剪 。这涉及两个阈值参数Alpha和beta以便将来扩展,因此称为alpha-beta修剪 。也称为Alpha-Beta算法
  • Alpha-beta修剪可以应用于树的任何深度,有时它不仅可以修剪树叶,还可以修剪整个子树。
  • 可以将两个参数定义为:
    1. Alpha:到目前为止,我们在Maximizer路径上的任何时候都发现了最佳(最高价值)选择。 alpha的初始值为-∞
    2. Beta:到目前为止,我们已经在Minimizer的任何位置找到了最佳(最低价值)选择。 beta的初始值为+∞
  • 将Alpha-beta修剪为标准minimax算法会返回与标准算法相同的动作,但是会删除所有不会真正影响最终决策但会使算法变慢的节点。因此,通过修剪这些节点,可以使算法更快。

注意:为了更好地理解该主题,请研究minimax算法。

Alpha-beta修剪的条件:

进行alpha-beta修剪所需的主要条件是:

α>=β  

有关alpha-beta修剪的要点:

  • Max播放器只会更新alpha的值。
  • 最小播放器只会更新Beta的值。
  • 在回溯树时,节点值将传递到较高的节点,而不是alpha和beta值。
  • 我们只会将alpha,beta值传递给子节点。

Alpha-beta修剪的伪代码:

function minimax(node, depth, alpha, beta, maximizingPlayer) is  
if depth ==0 or node is a terminal node then  
return static evaluation of node  
  if MaximizingPlayer then      // for Maximizer Player  
   maxEva= -infinity            
   for each child of node do  
   eva= minimax(child, depth-1, alpha, beta, False)  
  maxEva= max(maxEva, eva)   
  alpha= max(alpha, maxEva)      
   if beta<=alpha  
 break  
 return maxEva  
    else                         // for Minimizer player  
   minEva= +infinity   
   for each child of node do  
   eva= minimax(child, depth-1, alpha, beta, true)  
   minEva= min(minEva, eva)   
   beta= min(beta, eva)  
    if beta<=alpha  
  break          
 return minEva  

Alpha-Beta修剪的工作:

让我们以两人搜索树为例,了解Alpha-beta修剪的工作原理

步骤1:在的第一步中,Max播放器将首先从节点A开始移动,其中节点α=-∞和β=+∞,这些alpha和beta值向下传递到节点B,节点B再次是α=-∞和β=+∞,并且节点B将相同的值传递给其子D。

步骤2:在节点D处,将计算α的值作为其对Max的转向。首先将α的值与2进行比较,然后与3进行比较,max(2,3)=3将是节点D处的α值,节点值也将为3。

步骤3:现在算法回溯到节点B,其中β的值将随着Min的转弯而变化,现在β=+∞将与可用的后续节点值进行比较,即min(∞,3)=3,因此在节点B处现在α=-∞,β=3。

在下一步中,算法遍历节点B的下一个后继节点,即节点E,并且还将传递α=-∞和β=3的值。

步骤4:在节点E处,Max旋转,而alpha的值将改变。alpha的当前值将与5进行比较,因此max(-∞,5)=5,因此在节点Eα=5和β=3处,其中α>=β,因此将修剪E的右后继,并且算法将不会遍历它,并且节点E处的值为5。

步骤5:在下一步,算法再次将树从节点B移回节点A。在节点A,将更改alpha的值,最大可用值为3,因为max(-∞,3)=3,和β=+∞,这两个值现在传递给A的右继任者,即NodeC。

在节点C处,α=3,β=+∞,并且相同的值将传递到节点F。

步骤6:在节点F处,再次将α的值与左子代(0,max(3,0)=3)比较,然后与右子代(1,max(3,1)=3仍然α保持3,但F的节点值将变为1。

步骤7:节点F将节点值1返回到节点C,在Cα=3和β=+∞的情况下,此处的beta值将更改,它将与1比较,因此min(∞,1)=1。在C处,α=3和β=1,并且再次满足条件α>=β,因此将修剪C的下一个子元素G,并且该算法将不会计算整个子树G。

步骤8:C现在将值1返回给A,这里A的最佳值是max(3,1)=3。下面是最终的游戏树,它显示了已计算的节点和从未计算的节点。因此,在此示例中,最大化器的最佳值为3。

Alpha-Beta修剪中的移动顺序:

alpha-beta修剪的有效性高度依赖于检查每个节点的顺序。移动顺序是alpha-beta修剪的重要方面。

它可以有两种类型:

  • 最坏排序:在某些情况下,alpha-beta修剪算法不会修剪任何树上的叶子,并且与minimax算法完全一样。在这种情况下,由于alpha-beta因素,它还会消耗更多的时间,这种修剪动作被称为最差排序。在这种情况下,最佳移动发生在树的右侧。该顺序的时间复杂度为O(b m )。
  • 理想的排序:当树中进行大量修剪时,alpha-beta修剪的理想排序发生,并且最佳移动发生在树的左侧。我们应用DFS,因此它首先在树的左侧搜索,并且在相同的时间内经过两次最小深度算法。理想排序的复杂度为O(b m / 2 )。

查找良好顺序的规则:

以下是在alpha-beta修剪中找到良好顺序的一些规则:

  • 从最浅的节点发生最佳移动。
  • 对树中的节点进行排序,以便首先检查最佳节点。
  • 在寻找最佳举措的同时利用领域知识。例如:对于国际象棋,请尝试顺序:先捕获,然后威胁,然后向前移动,向后移动。
  • 我们可以保留状态,因为状态可能会重复。