因此,我使用UCT在蒙特卡罗树搜索算法中实现了转置表。这允许保持游戏状态的累积奖励值,无论在何处,以及在整个树中遇到多少次。这提高了在特定游戏状态下收集的信息的质量。
唉,我注意到这会对UCT的开发与探索选择阶段造成一定的问题。简而言之,分配给州的UCT分数考虑了访问父母州的次数与孩子(我们计算UCT分数的次数)之间的比率。从这个图中可以看出,在将一个状态从转置表中拉入一个新创建的树分支时,这个比例完全没有了,子状态已被访问了很多时间(来自树的其他地方)和访问过的父状态的次数要少得多,这在技术上是不可能的。
因此,使用转置表并保持状态的累积奖励值有助于算法的利用部分做出更好的选择,但同时它以可能有害的方式扭曲算法的利用部分。您是否知道有任何方法可以抵消这种意外问题?
答案 0 :(得分:1)
直观地说,我希望您能尝试以下方法。
对于UCT的利用部分,您将要存储和使用子节点的平均分数W / V
。整个平均值可以通过换位来共享。因此,在您的示例中,您不一定要分别共享W = 300
和V = 600
,而只是分享平均分W / V = 300 / 600 = 0.5
。这意味着,由于换位,您可以分享更准确的分数估算值(基于较大样本量的估算值)。
对于UCT的探索部分,我认为您希望使用统计数据"从角度来看"父节点(您没有转置),而不是子节点(它是树中其他位置的节点的转置)。在选择要转到的子节点时,不要使用子节点的访问次数,这意味着您将使用父节点中每state + action
对收集的访问次数。
例如,假设我们在您编写V: 2, W: 300
的节点中(将此节点称为P
),我们必须选择子节点。更标准的实现将遍历子节点,并使用子节点的访问计数。在您的情况下,我认为最好循环遍历节点P
中的操作,并跟踪这些操作的访问次数而不是子节点的访问次数。在P
中,您尚未采取导致转置子节点的操作,因此(P + action)
对的访问次数仍为0。
我个人并不具备MCTS +换位组合的经验,因此您可能希望进行额外的研究,以了解其他人过去的想法。例如,有以下文件:
答案 1 :(得分:1)
我实现了以下方法,这些方法与Chess的Alpha Zero样式算法很好地结合在一起:
(moveValueSum + transpositionValueSum) / (moveVisits + transpositionVisits)
。
通过这种方式,我们不会在一次动作的所有访问中求和,而是仅将动作值与其单个访问量最大的实例进行平均。