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__),所以未經測試的移動屬性節點當然是相對於玩家位置的,在每次移動之後重新產生。 –