0

任何人都可以请澄清如何(因为我没有在任何地方找到任何明确的例子)MCTS算法迭代为第二个球员。蒙地卡罗树搜索交替

我看起来似乎只是看起来像它正在播放,例如P1每次移动。 我理解一个代理的步骤,但我从来没有发现任何显示P2放置其计数器的代码的任何内容,这肯定在增长树时必须发生。

基本上我所期望的:

每个ITER:

选择节点PLAYER1 扩大PLAYER1

选择节点Player2 扩大玩家2

推出 backpropogate

下一个iter

这是对吗?任何人都可以拼出一些显示的伪码吗?无论迭代还是递归,我都不介意。

感谢您的任何帮助。

+0

好的,谢谢你的额外建议,我会再考虑一下。 – progan01

+0

我现在还不确定。我想迭代必须是这样的: 每个ITER \t PLAYER1选择 \t播放器1扩大 \t player2选择 \t player2扩大 \t推出 \t backpropogate 未来ITER – progan01

回答

1

这个技巧是在反向传播部分,在那里你从移动到这个位置的玩家的角度更新“胜利”变量。下UCT功能

Code for MCTS

注意,特别是评论:

#Backpropagate 
    while node != None: # backpropagate from the expanded node and work back to the root node 
     node.Update(state.GetResult(node.playerJustMoved)) # state is terminal. Update node with result from POV of node.playerJustMoved 
     node = node.parentNode 

如果按照函数调用,你会意识到visit变量总是更新;然而,wins不是。

+0

感谢您回复。我会很快审查代码。然而,我仍然没有得到选择方面 - 我当然必须在P1可用的动作之间进行切换,然后让该节点为玩家2重复所有事情,类似于极小极大? – progan01

+0

您的代码看起来非常具有描述性,谢谢。我认为我遇到的困难是,在我的比赛中,每个球员都有一系列独特的动作,比如在国际象棋中,所以我无法保留(如我所见)可用剩余动作列表 - 它们与球员的位置相关也类似邻居,所以我必须在每次移动后重新生成它们。 – progan01

+0

关于选择方面,每个节点都知道它的子节点从他的角度来看赢得/访问配给,所以遵循相同的UCB公式是可以的。 关于第二条评论,请注意每个节点都有与之相关的相应状态。你要求从该状态开始的所有未经测试的移动(Node的__init__),所以未经测试的移动属性节点当然是相对于玩家位置的,在每次移动之后重新产生。 –