From eb2121046d7a00c49fc35a56454e15a7f0f60009 Mon Sep 17 00:00:00 2001 From: CalciteM Date: Wed, 10 Jul 2019 02:05:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AF=8F=E4=B8=8B=E4=B8=80=E7=9D=80=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E6=89=8D=E9=87=8D=E6=96=B0=E9=9A=8F=E6=9C=BA=E7=94=9F?= =?UTF-8?q?=E6=88=90=E7=9D=80=E6=B3=95=E5=80=99=E9=80=89=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=BB=A5=E6=8F=90=E5=8D=87=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NineChess/src/ninechessai_ab.cpp | 31 ++++++++++++++++++++++--------- NineChess/src/ninechessai_ab.h | 12 ++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/NineChess/src/ninechessai_ab.cpp b/NineChess/src/ninechessai_ab.cpp index 2f656007..99797656 100644 --- a/NineChess/src/ninechessai_ab.cpp +++ b/NineChess/src/ninechessai_ab.cpp @@ -102,13 +102,10 @@ struct NineChessAi_ab::Node *NineChessAi_ab::addNode(Node *parent, int value, in mutex NineChessAi_ab::hashMapMutex; unordered_map NineChessAi_ab::hashmap; -void NineChessAi_ab::generateLegalMoves(Node *node) -{ - const int MOVE_PRIORITY_TABLE_SIZE = NineChess::N_RINGS * NineChess::N_SEATS; - int pos = 0; - #ifdef MOVE_PRIORITY_TABLE_SUPPORT #ifdef RANDOM_MOVE +void NineChessAi_ab::shuffleMovePriorityTable() +{ array movePriorityTable0 = { 17, 19, 21, 23 }; // 星位 array movePriorityTable1 = { 25, 27, 29, 31, 9, 11, 13, 15 }; // 外圈和内圈四个顶点 array movePriorityTable2 = { 16, 18, 20, 22 }; // 中圈十字架 @@ -121,14 +118,12 @@ void NineChessAi_ab::generateLegalMoves(Node *node) std::shuffle(movePriorityTable2.begin(), movePriorityTable2.end(), std::default_random_engine(seed)); std::shuffle(movePriorityTable3.begin(), movePriorityTable3.end(), std::default_random_engine(seed)); - array movePriorityTable; - for (int i = 0; i < 4; i++) { - movePriorityTable[i + 0] = movePriorityTable0[i]; + movePriorityTable[i + 0] = movePriorityTable0[i]; } for (int i = 0; i < 8; i++) { - movePriorityTable[i + 4] = movePriorityTable1[i]; + movePriorityTable[i + 4] = movePriorityTable1[i]; } for (int i = 0; i < 4; i++) { @@ -138,6 +133,18 @@ void NineChessAi_ab::generateLegalMoves(Node *node) for (int i = 0; i < 8; i++) { movePriorityTable[i + 16] = movePriorityTable3[i]; } +} +#endif // #ifdef RANDOM_MOVE +#endif // MOVE_PRIORITY_TABLE_SUPPORT + +void NineChessAi_ab::generateLegalMoves(Node *node) +{ + const int MOVE_PRIORITY_TABLE_SIZE = NineChess::N_RINGS * NineChess::N_SEATS; + int pos = 0; + +#ifdef MOVE_PRIORITY_TABLE_SUPPORT +#ifdef RANDOM_MOVE + #else // RANDOM_MOVE int movePriorityTable[MOVE_PRIORITY_TABLE_SIZE] = { 17, 19, 21, 23, // 星位 @@ -579,6 +586,12 @@ int NineChessAi_ab::alphaBetaPruning(int depth) srand(time0); time1.start(); + +#ifdef MOVE_PRIORITY_TABLE_SUPPORT +#ifdef RANDOM_MOVE + shuffleMovePriorityTable(); +#endif +#endif #ifdef IDS_SUPPORT // 深化迭代 diff --git a/NineChess/src/ninechessai_ab.h b/NineChess/src/ninechessai_ab.h index d99343c0..a55b7afd 100644 --- a/NineChess/src/ninechessai_ab.h +++ b/NineChess/src/ninechessai_ab.h @@ -13,6 +13,7 @@ #include #include #include +#include #include "ninechess.h" @@ -127,6 +128,13 @@ protected: // 篡改深度 int changeDepth(int originalDepth); + // 随机打乱着法搜索顺序 +#ifdef MOVE_PRIORITY_TABLE_SUPPORT +#ifdef RANDOM_MOVE + void shuffleMovePriorityTable(); +#endif +#endif + // 判断是否在哈希表中 unordered_map::iterator findHash(uint64_t hash); @@ -166,6 +174,10 @@ private: // 局面数据哈希表 static unordered_map hashmap; +#ifdef MOVE_PRIORITY_TABLE_SUPPORT + array movePriorityTable; +#endif // MOVE_PRIORITY_TABLE_SUPPORT + // 哈希表的默认大小 static const size_t maxHashCount = 1024 * 1024;