我已经为一个四人游戏实现了MCTS,运行得很好,但我不是很确定当游戏结束的移动在实际的树中而不是在模拟中时,如何进行扩展。
在游戏开始时,赢或输的位置只在模拟中找到,我知道如何对这些位置进行评分并将结果回传到树上。但随着游戏的进行,我最终找到一个由UCB1选择的叶子节点,这个节点无法扩展,因为它是一个输的位置,没有可能的移动,因此没有什么可以扩展的,也没有游戏可以’模拟’。目前我只是将这个节点评分为最后剩余玩家的’胜利’,并为他们回传一个胜利。
然而,当我查看访问统计时,这个节点被重新访问了数千次,显然UCB1’选择’多次访问这个节点,但这实际上有点浪费,对于这些’总是赢’的节点,我应该回传除了单一胜利之外的其他东西吗?
我已经在谷歌上进行了广泛的搜索,但找不到太多关于这个问题的提及,所以我是否误解了什么或错过了什么明显的东西,所有的’标准’MCTS教程/算法甚至都没有提到树中的游戏结束节点作为特殊情况,所以我担心我误解了一些基本的东西。
回答:
目前我只是将这个节点评分为最后剩余玩家的’胜利’,并为他们回传一个胜利。
然而,当我查看访问统计时,这个节点被重新访问了数千次,显然UCB1’选择’多次访问这个节点,但这实际上有点浪费,对于这些’总是赢’的节点,我应该回传除了单一胜利之外的其他东西吗?
不,你目前所做的已经是正确的。
MCTS本质上是将一个节点的价值评估为通过该节点运行的所有路径结果的平均值。实际上,我们通常对极小极大式评估感兴趣。
为了使MCTS基于平均的评估在极限情况下(经过无限时间后)等于极小极大评估,我们依赖于选择阶段(例如UCB1)将如此多的模拟(=选择+模拟阶段)发送到根据极小极大评估认为最优的路径上,以至于平均评估在极限情况下也趋向于极小极大评估。
例如,假设在根节点下直接有一个赢的节点。这是你的情况的一个极端例子,其中终端节点在选择阶段就已经达到,之后不需要模拟。根节点的极小极大评估将是一个胜利,因为我们可以直接在一步内达到胜利。这意味着我们希望MCTS基于平均的评分也非常接近于根节点的胜利评估。这意味着我们希望选择阶段将绝大多数模拟立即发送到这个节点。例如,如果99%的所有模拟立即从根节点进入这个赢的节点,根节点的平均评估也将非常接近于胜利,这就是我们所需要的。
这个回答仅涉及基本UCT(使用UCB1进行选择的MCTS)的实现。关于与问题相关的对基本MCTS实现的更复杂修改,请参见manlio的回答