当收到json请求后,
asyncbot.cpp的AsyncBot::genMoveSynchronous会唤醒其它线程去干活。
之后,其它线程接到命令,同样是asyncbot.cpp的AsyncBot::internalSearchThreadLoop(),开始干活
搜索的关键为这一步
search->runWholeSearch(shouldStopNow,&searchBegun,pondering,tc,searchFactor);
5秒后(DEBUG版)搜索结束,获取答案,343,也是C3
Loc moveLoc = search->getChosenMoveLoc();
其中比较重要的
bool shouldStop =
(numPlayouts >= maxPlayouts) ||
(numPlayouts + numNonPlayoutVisits >= maxVisits);
bool finishedPlayout = runSinglePlayout(*stbuf, upperBoundVisitsLeft);
search.cpp: playoutDescend()
函数则是MCTS,检查游戏是否结束,NN评估局面等等(会递归)
selectBestChildToDescend()
函数通过访问次数等决定哪个子节点最适合继续探索,新版的人类策略也在此处进行
nneval.cpp: NNEvaluator::evaluate()
函数先算hash看能不能命中缓存,不能就加入队列
nninputs.cpp: NNInputs::fillRowV7()
函数填入各种特征:棋盘状态,气数,贴目等等
eigenbackend.cpp: NeuralNet::getOutput()
函数是前向传播
在fillRowV7中,有以下代码:
assert(board.x_size <= nnXLen);
assert(board.y_size <= nnYLen);
其中board.x_size为13,或者16,等等,而nnXlen为19。因为我们都知道,Katago会让AI在不同大小的棋盘上玩。