關於2048局面的價值判斷及ai思路?

標準2048(0.1概率4,0.9概率2),編寫一個ai的時候如何判斷不同局面的價值,編寫ai除了簡單的評估進行一步的價值評估還有什麼更好的實現方法?


作為曾經的2048愛好者和現役OIer,來回答一下這個問題...

目前我找到的表現最好的AI,10%出4,90%出2的無撤銷標準版本玩到32768的概率能夠達到30%多

,比人玩的穩定性要強不少。

github地址:nneonneo/2048-ai

最高分達到過83W多,接近65536。這裡放一張32768的截圖:

這個AI是一個老外寫的,大概思路就是位壓縮表示局面,預處理移動,MAX-AVG搜索。

就是在「移動」節點返回子節點的最大值,「出數字」節點返回所有子節點的價值和出現概率加權求和的結果。

它的估價函數我沒細看,不過我自己也寫過一個AI,也用了MAX-AVG搜索,能玩到8192。

估價函數是這樣的:有三個權值矩陣分別代表三種陣型。然後對局面進行加權求和,8個方向分別做一次(旋轉+翻轉一個局面可以得到等價的8個方向),這樣就得到了24個和,取最大值作估價結果。

三個權值矩陣如下:

16,15,14,13

9 ,10,11,12

8 ,7 ,6 ,5

1 ,2 ,3 ,4

16,15,12,4

14,13,11,3

10,9 ,8 ,2

7 ,6 ,5 ,1

16,15,14,4

13,12,11,3

10,9 ,8 ,2

7 ,6 ,5 ,1

第一個能明顯看出來,就是爛大街的蛇形陣,屬於層疊陣型的一種。對於人來說,這是最好掌握的陣型。

第二個陣型名字叫SPD,以一個角落為中心,其他數字環繞著排列。之前談到的nneonneo寫的AI,大部分時間都使用的是這種陣型(那個AI並未有意設定陣型,只是愛好者們根據現象總結出來的)

AI使用這種陣型時比蛇形陣穩定得多,也不容易出失誤,而對於人來說則很難掌握,容易失誤,不過也能玩到16384。

第三個陣型名字叫ZSL,在3*3的區域使用層疊陣型,最外圈使用和SPD類似的方法玩。該陣依然總結自nneonneo寫的AI,對於AI來講使用這種陣型也比較穩定。

在三種陣型加權作用下,AI就會表現出"選擇最適合當前局面的陣型進行遊戲"的行為。但有個大缺點,由於陣型比較相似,AI也容易陷入一種"中間陣型",而大大降低陣型的優勢,也更容易死。

綜上,對於演算法,目前看來MAX-AVG搜索效果最好。

對於估價函數,如果只是想讓AI玩到2048就結束,估價函數大可簡單粗暴地加權,成功率很高的。但如果想讓AI得到高分,可以參考參考nneonneo。


感覺2048狀態這麼少,直接暴力搜索應該也不會太慢。。。有隨機的地方,就多隨機幾次。。不複雜


推薦閱讀:

為什麼5%的CPU佔用會造成這麼大的性能損失?
為什麼工控還在用c?
C++中左值、右值與寄存器的關係是怎樣的?
LOL盒子這類的輔助工具一般都是用什麼開發的?
一個典型的遊戲循環是怎樣的流程?

TAG:編程 | 博弈論 | 編程學習 | CC | 2048小遊戲 |