我试图通过蒙特卡罗树搜索来解决2048的变体。我发现UCT可以很好地在勘探/开采之间进行权衡。
我唯一的问题是,我所见过的所有版本都认为分数是胜率。如何将其改编为一个游戏,其中得分是最后一个州的董事会价值,因此从1-MAX开始而不是赢。
我可以使用常数c除以MAX来对比分进行标准化,但是在比赛的早期阶段(因为你获得了糟糕的平均得分)以及在游戏后期的超重开发时,它会超重探索。
答案 0 :(得分:0)
实际上,大多数文献都假设您的游戏是输了还是赢了,并给出了 0或1 的分数,这将转化为获胜率< / strong>(平均)。然后通常将勘探参数C设置为sqrt(2),这对于在匪徒问题中的UCB是最佳的。
要弄清楚什么是好的C语言,您必须退后一步,看看UCT的实际作用。如果树中的一个节点在一个卷展栏中的得分非常差,那么利用漏洞将使您不再选择它。但是您只玩过一次该节点,所以它可能只是倒霉。要确认这一点,您可以给该节点加分。多少? 即使它的平均分数是最低的,而其他某个节点的平均分数是最高的,也足够使之成为可行的选择。因为有了足够多的游戏,您可能会发现坏节点的一次部署确实是a幸,而该节点实际上分数相当可靠。当然,如果您得到的分数更高,那么运气就不会太差,因此也就不值得推广。
因此,分数在0到1之间,sqrt(2)的C值是一个很好的值。如果您的游戏得分最高,那么您可以归一化得分,方法是将得分除以最大值,然后将得分强制设为0-1范围,以适应sqrt(2)的C值。或者,您不对分数进行归一化,而是将C乘以最大分数。效果是一样的:UCT的探索奖金足够大,可以使您的失败者节点得到一些展示,并有机会证明自己。
还有一种动态设置C 的替代方法,它给我带来了很好的效果。播放时,您会跟踪在每个节点(和子树)中看到的最高和最低分数。这是可能的得分范围,这为您提供了多少C的提示,以使未充分研究的弱者节点有一个公平的机会。每次我进入树中并选择新的根时,都会将C调整为新根的 sqrt(2)*得分范围。此外,随着推出的完成和他们的分数成为新的最高或最低分数,我以相同的方式调整C。通过在演奏时不断调整C的方式以及选择新的根,您可以保持C 与收敛所需的大小一样大,但与收敛所需的小一样< / strong>。请注意,最低分数与最高分数一样重要:如果每次推出的最低收益都一定,则C无需克服。只有最大和最小之间的差异才重要。