alpha-beta剪枝搜索

   // basic Alpha-Beta search;

     move bestmove;


    
int  alphabeta( int  depth,  int  alpha,  int  beta,  bool  isMyTurn)  {

     
if (gameOver || depth == 0{
      
return evaluation();
     }


       generateLegalMoves();

        
// you may  change the search order to make the search faster

     
for (each move m) {
      
do move m;
      score 
= -alphabeta(depth - 1-beta, -alpha, ! isMyTurn );
      
if (score > alpha) {

             alpha 
= score;

             
if(at the Level 1)     

              bestmove 
= m;
      }

      undo move
-m;
      
if (alpha >= beta) {
       
break;
      }

     }

     
return alpha;
    }

Initial call  :  alphabeta(depth,  - infinite,  infinite,  isMyTurn);

不理解上面的代码的话,看看下面的极小极大搜索

极小极大搜索

// 极大搜索

int  Max( int  depth)
{
 
int best = -INFINITY;
 
if (depth == 0)     
   
{
  
return evaluation();
 }

 generateLegalMoves();
 
for (each move m) {
   
{
  
do move m;
  val 
= Min(depth - 1);       // call the Min search
      undo move m;
  
if (val > best)
     
{
   best 
= val;
  }

 }

 
return best;
}

 
int Min(int depth) // Min search
{
 
int best = INFINITY;
 
if (depth <= 0)
   
{
  
return evaluation();
 }

 GenerateLegalMoves();
 
for (each move m) {
  
do move m;
  val 
= Max(depth - 1);    // call the Max search
       undo move m;
  
if (val < best)
     
{
   best 
= val;
  }

 }

 
return best;
}

负极大搜索

极小极大搜索可以统一用负极大搜索代替

int  NegaMax( int  depth)
{
 
int best = -INFINITY;
 
if (depth == 0)
   
{
  
return evaluation();
 }

 GenerateLegalMoves();
   
for (each move m) {
  
do move m; 
  val 
= - NegaMax(depth - 1);
  undo move m;
  
if (val > best)
     
{
   best 
= val;
  }

 }

 
return best;
}

 

你可能感兴趣的:(alpha-beta剪枝搜索)