void UCTMove(Board &CB, int Player, vector<LOC> &pace) { Node UCTB(Player, CB.map, true); //根据当前局面创建UCT的根节点 if (UCTB.BoardWinner == 0) { int Total = 0; // UCT的次数函数 clock_t start = clock(); //设置计时器的变量 for (int i = 0; i < UCT_TIMES; i++) //迭代一定次数 { UCTProcess(UCTB, Total); if ((clock() - start) / CLOCKS_PER_SEC >= UCT_LIMIT_TIME) break; } //判定最佳收益 int BestNodeNum = 0; float BestAvgValue = 0; // int LargerTimesNodeNum = 0; // int LargerTimesValue = 0; for (int i = 0; i < UCTB.ExistChild; i++) { if (UCTB.ChildNodes[i]->AvgValue >= BestAvgValue) { BestNodeNum = i; BestAvgValue = UCTB.ChildNodes[i]->AvgValue; } // if (UCTB.ChildNodes[i]->Times >= LargerTimesValue) // { // LargerTimesNodeNum = i; // LargerTimesValue = UCTB.ChildNodes[i]->Times; // } } CB.move(Player, {UCTB.NodeMoves[BestNodeNum].first, UCTB.NodeMoves[BestNodeNum].second}); pace.emplace_back(UCTB.NodeMoves[BestNodeNum].first, UCTB.NodeMoves[BestNodeNum].second); //**记录步伐 deleteUCTTree(UCTB); } else { CB.eatAllCTypeBoxes(Player, pace); //**记录步伐 latterSituationMove(CB, Player, pace); //**记录步伐 } }
时间: 2024-02-14 08:25:37 浏览: 122
这段代码是一个UCT算法的实现,用于在给定的游戏局面下选择最佳的移动步骤。以下是代码的主要逻辑:
1. 创建一个UCT的根节点,表示当前的游戏局面。
2. 如果当前局面没有确定的胜者(UCTB.BoardWinner == 0),则进行以下操作:
- 初始化计时器和迭代次数。
- 在规定的时间内进行迭代,每次迭代调用UCTProcess函数。
- 找到最佳收益的节点,记录节点的索引和平均价值。
- 根据最佳节点的移动步骤更新游戏局面和步伐记录。
- 删除树结构以释放内存资源。
3. 如果当前局面有确定的胜者,则执行特定的操作(eatAllCTypeBoxes和latterSituationMove),并记录步伐。
整体来说,该函数使用UCT算法对游戏局面进行搜索和评估,选择最优的移动步骤。
阅读全文