首页 > 解决方案 > 为什么我的转置表会导致我的国际象棋引擎挂起棋子?

问题描述

这是我对转置表的实现(它基于这个伪代码)。

我用换位表测试了我的国际象棋引擎,每隔一段时间它就会挂起棋子,或者有时会配对。例如,我经常将受保护的棋子与皇后放在一起。当我禁用我的转置表时,它不再挂起。显然转置表有问题。

我见过这个问题,但答案对我没有帮助。

当然,感谢大家帮助我。

这是代码:

//This bit looks up the current hash in the Transposition table to retrieve Alpha and Beta
//transposition is an unordered map holding keys of ULL hash codes and pairs of Alpha and Beta

auto previous = transposition.find(hashCode); //hashCode is the Zobrist Hash of this position
if (!transposition.empty() && previous != transposition.end()) {
    ABPair pair = previous->second;

    if (pair.alpha >= beta) //beta cutoff
        return pair.alpha;
    if (pair.beta <= alpha) //alpha cutoff
        return pair.beta;

    alpha = max(pair.alpha, alpha);
    beta = min(pair.beta, beta);
}
//This bit inserts positions into the transposition table

if (evaluation /*this is the evaluation of the current position*/ <= alpha) {
    ABPair abpair = { INT_MIN, evaluation };
    pair<unsigned long long, ABPair> pair = { hashCode /*Zobrist hash*/, abpair };
    transposition.insert(pair);
}
else if (evaluation > alpha && evaluation < beta) {
    ABPair abpair = { evaluation, evaluation };
    pair<unsigned long long, ABPair> pair = { hashCode, abpair };
    transposition.insert(pair);
}
else if (evaluation >= beta) {
    ABPair abpair = { evaluation, INT_MAX };
    pair<unsigned long long, ABPair> pair = { hashCode, abpair };
    transposition.insert(pair);
}

标签: c++chess

解决方案


推荐阅读