2016-06-13 9 views
0

私はその結果を転置テーブルに追加するアルファ - ベータ検索を実装しました。次に、転置テーブルから主なバリエーションを抽出しています。私のプリンシパルバリエーションを切り捨てるアルファ - ベータ検索

これは、浅い深さでの解析で問題なく動作するようです。私は7プライの深さで分析を依頼する場合しかし、私はこれを取得:

7 [+1.00] 1.b1c3 a7a6 2.g1f3 a6a5 3.a6a5 

を終わりに、動きが繰り返されます。この最終的な移動は、プルーニングの結果としてテーブルに配置されますが、それはホワイトの法的な移動ではありません。明らかに、印刷されるプライは7枚未満である。

これは私のアルファベット検索コードの誤解ですか?

int ab_max(board *b, int alpha, int beta, int ply) { 
    if (ply == 0) return evaluate(b); 
    int num_children; 
    move chosen_move = no_move; 
    move *moves = board_moves(b, &num_children); 
    assert(num_children > 0); 
    for (int i = 0; i < num_children; i++) { 
     apply(b, moves[i]); 
     int score = ab_min(b, alpha, beta, ply - 1); 
     if (score >= beta) { 
      tt_put(b, (evaluation){moves[i], score, at_least, ply}); 
      unapply(b, moves[i]); 
      free(moves); 
      return beta; // fail-hard 
     } 
     if (score > alpha) { 
      alpha = score; 
      chosen_move = moves[i]; 
     } 
     unapply(b, moves[i]); 
    } 
    tt_put(b, (evaluation){chosen_move, alpha, exact, ply}); 
    free(moves); 
    return alpha; 
} 

int ab_min(board *b, int alpha, int beta, int ply) { 
    if (ply == 0) return evaluate(b); 
    int num_children; 
    move chosen_move = no_move; 
    move *moves = board_moves(b, &num_children); 
    assert(num_children > 0); 
    for (int i = 0; i < num_children; i++) { 
     apply(b, moves[i]); 
     int score = ab_max(b, alpha, beta, ply - 1); 
     if (score <= alpha) { 
      tt_put(b, (evaluation){moves[i], score, at_most, ply}); 
      unapply(b, moves[i]); 
      free(moves); 
      return alpha; // fail-hard 
     } 
     if (score < beta) { 
      beta = score; 
      chosen_move = moves[i]; 
     } 
     unapply(b, moves[i]); 
    } 
    tt_put(b, (evaluation){chosen_move, beta, exact, ply}); 
    free(moves); 
    return beta; 
} 

これが私の評価印刷機能の興味深い部分である:

do { 
     if (!b->black_to_move) printf("%d.", moveno++); 
     char move[6]; 
     printf("%s ", move_to_string(eval->best, move)); 
     apply(b, eval->best); 
     eval = tt_get(b); 
    } while (eval != NULL && depth-- > 0); 

私の主な変動におけるいかなる動きは、これまで、右の剪定すべきではありませんか?

答えて

0

私は将来のチェスの著者に数時間の悲しみを救うために私自身の質問に答えています。

カットオフが発生したときに、私はあまりにも遅くその動きを解消するという些細なバグがあります。

ただし、ここではさらに興味深い問題が説明されています。Chess: Extracting the principal variation from the transposition table

関連する問題