ai: 增加空着向前裁剪部分代码 (未完成)

宏未开启。
This commit is contained in:
Calcitem 2020-05-01 01:19:04 +08:00
parent 7b566b1e71
commit c1957e7bee
6 changed files with 54 additions and 0 deletions

View File

@ -57,6 +57,8 @@
#define DEPTH_ADJUST (0)
//#define FIX_DEPTH (24)
//#define NULL_MOVE
//#define FIRST_MOVE_STAR_PREFERRED
//#define TIME_STAT

View File

@ -172,6 +172,13 @@ int StateInfo::generateMoves(Stack<move_t, MOVE_COUNT> &moves)
return moves.size();
}
int StateInfo::generateNullMove(Stack<move_t, MOVE_COUNT> &moves)
{
moves.clear();
moves.push_back((move_t)SQ_0);
return moves.size();
}
void MoveList::create()
{
// Note: 未严格按 direction_t 中枚举的顺序从左到右排列

View File

@ -799,6 +799,20 @@ value_t AIAlgorithm::search(depth_t depth, value_t alpha, value_t beta, Node *no
}
#endif
#ifdef NULL_MOVE
// 空着向前裁剪 (WIP)
doNullMove();
st->generateNullMove(moves);
st->generateChildren(moves, this, node);
value = -search(depth - 1 - 2, -beta, -beta + 1, node->children[0]);
undoNullMove();
if (value >= beta) {
node->value = beta;
return beta;
}
#endif
#ifdef TRANSPOSITION_TABLE_ENABLE
// 记录确切的哈希值
TT::recordHash(node->value,
@ -963,6 +977,18 @@ void AIAlgorithm::undoMove()
positionStack.pop();
}
void AIAlgorithm::doNullMove()
{
// 执行空着
st->doNullMove();
}
void AIAlgorithm::undoNullMove()
{
// 执行空着
st->undoNullMove();
}
#ifdef ALPHABETA_AI
const char* AIAlgorithm::bestMove()
{

View File

@ -190,6 +190,9 @@ public:
// 撤销着法
void undoMove();
void doNullMove();
void undoNullMove();
#ifdef TRANSPOSITION_TABLE_ENABLE
// 清空哈希表
void clearTT();

View File

@ -1051,6 +1051,18 @@ void StateInfo::changeSideToMove()
setSideToMove(Player::getOpponent(position->sideToMove));
}
bool StateInfo::doNullMove()
{
changeSideToMove();
return true;
}
bool StateInfo::undoNullMove()
{
changeSideToMove();
return true;
}
void StateInfo::setTips()
{
string winnerStr, t;

View File

@ -249,6 +249,10 @@ public:
// 着法生成
int generateMoves(Stack<move_t, MOVE_COUNT> &moves);
int generateNullMove(Stack<move_t, MOVE_COUNT> &moves);
bool doNullMove();
bool undoNullMove();
// 判断胜负
player_t getWinner() const;