這個也不是我原創的,我只是個學習者。
第一次聽蒙地卡羅樹搜尋是關於阿爾法狗大戰李世石。
回合制遊戲中,每個選手都沒有什麼資訊可以對對方隱藏的,而且也沒有概率的因素在裡面,比如擲骰子或者從牌隊裡面抽一張牌出來。
很多遊戲都是這種型別,比如西洋棋,圍棋等。
什麼東西在這類遊戲中都是確定的,從理論上來說,可以構建一顆樹來包含所有可能的結果,然後可以給其中一位選手賦予乙個和贏或者輸相關的值。
找到最佳的可能的應對方案,就是對樹進行搜尋的過程,通過一種選擇的方法,
在每乙個回合中交替的取得最大值或者最小值,匹配不同選手衝突的目標,這個過程會一直對樹搜尋下去。
這個演算法就稱作minimax。
minimax的問題在於,要花很長的時間時間才能對樹進行完全的搜尋,尤其對於高度分支因子的遊戲,或者說每一回合中可以走的步子很多。
這是由於對於很基礎的minimax版本需要對樹中所有的節點進行搜尋才能找到最優解,同時樹中待檢驗的節點數目隨著分支因子以指數增長。
有很多的方法可以緩和這個問題,比如說僅僅搜尋有限長度的步數,然後用評價函式來評估位置的值,或者修剪待搜尋的分支如果它們可能是沒有價值的。然而很多此類方法都需要對遊戲的主要規則進行編碼,然而這難以收集和制定。
即使這種方法可以做出下象棋的程式來擊敗象棋大師,但是這種成功並不適用於圍棋,特別是不適用於在19x19的棋盤上。
然而,確實有一種遊戲智慧型技術對這種高分支因子的程式有效,並且逐漸在圍棋對弈程式的領域中佔據主導。
很容易建立這種演算法的基本實現,對較低分支因子的程式可取得不錯的結果,可以基於它進行很簡單的改進,然後對其改善可用於下圍棋或者象棋。
可以對它進行配置,使得計算任意長度的時之後停止,當然,計算時間越長,取得的結果越好。
由於它實際上不需要和遊戲相關的特定知識,可以用來進行一般的遊戲對戰。
同樣也可以對它進行改進應用於那些規則中有隨機性的遊戲。
這種方法被稱為monte carlo tree search(蒙地卡羅樹搜尋,mcts)。
待會就會講解mcts是如果進行的,特別是一種稱作upper confidence bound的東東應用於這種樹(uct),
然後就會向你展示如何用python構建乙個實現基本功能的mcts。
設想,你將,你面對一排老(和)虎(諧)機,每個都有不同的回報概率和數目。
作為乙個理性的人(呵呵,我就不理性),如果你將把它們都玩一遍,你會更傾向於用一種使你淨收益最大的策略。
但是你如何才能做到這樣呢?
無論出於什麼原因,旁邊乙個人都沒有,所以你不可能看到別人玩一會,然後獲得那台是最好的機器。
很明顯,你的策略將會是通過你自己平衡所有玩過的機器,從而靠自己收集資訊,集中玩觀察到的最好的機器。
有一種稱為ucb1的策略,通過這樣做對每個機器構建置信區間:
其中:
xi是第i臺機器的平均回報
ni是第i臺機器的遊戲次數
n是總的遊戲次數
然後,你的策略就是每次挑選出具有最大上界的那台機器。正如你這樣做了之後,那台觀測的機器的平均值會移動,
並且它的置信區間也會變窄,但是所有其他機器的區間都會變寬。最終,其他機器中有一台將會比你當前的這台會有更高的上界,
然後你就轉到這一台上來。這種策略的特點在於,你的後悔度,即你只在實際上最好的那台機器上玩所得到的收益和你在這種策略下的期望收率的誤差的增長速度是o(ln n)。這是一種和這種問題(被稱作multi-armed bandit problem)理論上最好結果一樣的大o增長速率,然後另外乙個好處就是容易計算。
蒙地卡羅的的原理也在與此。在乙個標準的蒙地卡羅過程中,大量的隨機模擬過程被執行,在這種情況下,你想從棋盤上找到最優的位置。從這個開始狀態的所有可能步驟都會被統計,然後根據返回過來的全域性最優解來決定下哪一步。這種方法的缺點是,在模擬的給定的任一回合,都會有很多種可能的步子可下,但是只有一兩處是很好的。如果每一輪都隨機下一步,會使得模擬極不可能向前獲得最優路徑。因此,uct作為乙個增強的方法被提出來。這種想法是:如果所有位置僅僅移動一步的統計資訊可以獲得,任何一種給定的棋盤的位置都可以看作一種multi-armed bandit problem。因此,uct採用計算多步的收益,而不是靠純隨機模擬進行。
第一步,選擇,直到你獲得了必要的統計資訊來處理你達到的每乙個位置,就像面對乙個multi-armed bandit problem一樣。
採用的那一步,將會通過ucb1演算法選擇出來,而不是隨機選擇,然後應用於獲得下乙個要考慮的位置的資訊。
選擇過程將會進行到你達到了乙個並給所有子位置的統計資訊都被記錄的哪個位置。
選擇 每一步加粗標記的是通過ucb1演算法選擇的位置和下的步驟。注意到很多次的遊戲過程已經進行了,從而獲得如上的統計資訊。
每個圈圈包含了贏的次數/總共進行的次數。
第二步,展開,當你不能在用ucb1時就會展開。乙個隨機選擇乙個未訪問過的子位置,並且乙個新的記錄節點被加入到這顆統計樹中。
在樹的最底部標記的1/1下面並沒有更多的統計資訊,因此我們隨機選擇一步,並且把它加入到新紀錄中,初始化為0/0。
展開過後,剩餘的對戰是在第三階段,模擬。這一步通過乙個典型的蒙地卡羅模擬來完成,要麼是通過純隨機選擇要麼是通過一些簡單的啟發式權重,或者是一些需要大量計算的啟發式方法並且評估。對於分支因子較小的遊戲,light playout是個不錯的選擇。
一旦新的記錄被加入進來,蒙地卡羅模擬過程便開始了,這裡用乙個點畫線的箭頭描述。
在模擬過程中下的步驟是完全隨機的,或者為了下得更好而使用一些權重計算。
最終,第四步是更新或者反向傳遞過程。這一過程發生在博弈進行到末尾之後。
在博弈過程過所有訪問過的位置對戰次數增加,並且如果在這個位置的選手贏得了對戰,那麼贏的次數也會增加。
在模擬達到最後時,在路徑中的所有採納的記錄都會被更新。每個的對戰的次數都會加1,並且如果匹配贏的一方贏的次數也會加1,這裡用加粗來來表示。
這個演算法可以設定在任意計算時間長度或則其他條件下停止。如果對戰的次數進行地越多,這棵樹的統計資訊在記憶體中會增長,並且最終選擇的落子步驟也會接近於實際的最優解,根據遊戲的不同,所花的時間也許會很久。
想要了解更過關於ucb1和uct的數學上的知識,可以參考和
現在讓我們來看看**。為了分隔某些考量,我們將需要乙個board類,其目的是包含遊戲規則並且不考慮ai,以及乙個montecarlo類,這個類只考慮ai演算法,並且會查詢board物件以獲得關於遊戲的資訊。我們假設棋盤類支援如下介面:
未完。。。
蒙地卡羅法求 PI
蒙地卡羅法求 pi 蒙地卡羅為摩洛哥王國之首都,該國位於法國與義大利國境,以賭博聞名。蒙地卡羅的基本原理為以亂數配合面積公式來進行解題,這種以機率來解題的方式帶有賭博的意味,雖然在精確度上有所疑慮,但其解題的思考方向卻是個值得學習的方式。演算法說明 蒙地卡羅的解法適用於與面積有關的題目,例如求pi值...
蒙地卡羅模擬和 CPA
最近除了鍛鍊,一直看 head first 叢書系列的第二本,今天看了90多頁,整個章節都是關於時間管理的,和數學關聯較多,這次的24道習題居然全對了。有兩個 term 比較有意思,可以寫寫。乙個是monte carlo simulation,這又是個從賭場匯出的統計模擬演算法,在金融建模方面也有廣...
蒙地卡羅法求 PI
蒙地卡羅為摩洛哥王國之首都,該國位於法國與義大利國境,以賭博聞名。蒙地卡羅的基本原理為以亂數配合面積公式來進行解題,這種以機率來解題的方式帶有賭博的意味,雖然在精確度上有所疑慮,但其解題的思考方向卻是個值得學習的方式。解法蒙地卡羅的解法適用於與面積有關的題目,例如求pi值或橢圓面積,這邊介紹如何求p...