From c1957e7beebebad9c386c0cb88b3fffcea942d75 Mon Sep 17 00:00:00 2001 From: Calcitem Date: Fri, 1 May 2020 01:19:04 +0800 Subject: [PATCH] =?UTF-8?q?ai:=20=E5=A2=9E=E5=8A=A0=E7=A9=BA=E7=9D=80?= =?UTF-8?q?=E5=90=91=E5=89=8D=E8=A3=81=E5=89=AA=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20(=E6=9C=AA=E5=AE=8C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 宏未开启。 --- include/config.h | 2 ++ src/ai/movegen.cpp | 7 +++++++ src/ai/search.cpp | 26 ++++++++++++++++++++++++++ src/ai/search.h | 3 +++ src/game/position.cpp | 12 ++++++++++++ src/game/position.h | 4 ++++ 6 files changed, 54 insertions(+) diff --git a/include/config.h b/include/config.h index 87f1373c..5db8f312 100644 --- a/include/config.h +++ b/include/config.h @@ -57,6 +57,8 @@ #define DEPTH_ADJUST (0) //#define FIX_DEPTH (24) +//#define NULL_MOVE + //#define FIRST_MOVE_STAR_PREFERRED //#define TIME_STAT diff --git a/src/ai/movegen.cpp b/src/ai/movegen.cpp index bbb8c27f..05507705 100644 --- a/src/ai/movegen.cpp +++ b/src/ai/movegen.cpp @@ -172,6 +172,13 @@ int StateInfo::generateMoves(Stack &moves) return moves.size(); } +int StateInfo::generateNullMove(Stack &moves) +{ + moves.clear(); + moves.push_back((move_t)SQ_0); + return moves.size(); +} + void MoveList::create() { // Note: 未严格按 direction_t 中枚举的顺序从左到右排列 diff --git a/src/ai/search.cpp b/src/ai/search.cpp index 8a5df727..47b6a213 100644 --- a/src/ai/search.cpp +++ b/src/ai/search.cpp @@ -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() { diff --git a/src/ai/search.h b/src/ai/search.h index c45fad44..dc743812 100644 --- a/src/ai/search.h +++ b/src/ai/search.h @@ -190,6 +190,9 @@ public: // 撤销着法 void undoMove(); + void doNullMove(); + void undoNullMove(); + #ifdef TRANSPOSITION_TABLE_ENABLE // 清空哈希表 void clearTT(); diff --git a/src/game/position.cpp b/src/game/position.cpp index 1b1c345b..8c716d25 100644 --- a/src/game/position.cpp +++ b/src/game/position.cpp @@ -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; diff --git a/src/game/position.h b/src/game/position.h index 1fbd5ab3..6cccaf54 100644 --- a/src/game/position.h +++ b/src/game/position.h @@ -249,6 +249,10 @@ public: // 着法生成 int generateMoves(Stack &moves); + int generateNullMove(Stack &moves); + + bool doNullMove(); + bool undoNullMove(); // 判断胜负 player_t getWinner() const;