對于三上聽以外的手牌(由上文圖中可知三上聽以外的手牌約占手牌所有組合的80%),由于手牌中會存在大量的孤張或簡單搭子,只需單獨比較孤張或簡單搭子的效率即可,計算量更小。
除了上述窮舉手牌搜索樹的方法,還可以采用模擬的方法。比如讓麻將 AI 在短時間內模擬兩種打法各1000手牌,哪個和牌率更高就選哪種打法。雖然這樣不太精確但已經足夠保證比人要強了。
2. 和牌限制與番數價值
很多麻將規則對和牌有限制,比如國標麻將必須八番起和,四川麻將必須缺一門,太原麻將和牌必須包含指定牌張等等。我們只需在上述基礎牌效率算法搜索樹的基礎上,“砍掉”那些結局不符合要求的分支即可。
有些時候我們不僅關注和牌的概率,也關注和牌的大小,比如有些牌我們寧可損失一些進張也想去做清一色,追求更高的和牌得分。我們只需為樹的所有結果賦值(和牌得分),并用結局對應的值與路徑對應的概率求出不同打法的得分期望并進行比較。
3. 副露判斷
“這個牌該不該碰”似乎是打麻將時比較令人頭疼的問題。但其實副露判斷只是計算量大,并不需要特殊的算法,依然是對比碰與不碰兩種選擇所對應的所有結局的得分期望即可。日本麻將中的立直(報聽)判斷也是同理。
只不過當我們在考慮“打哪張好”的時候,兩種打牌選擇之間所對應的路徑和結局有大部分都是重合的;而我們在考慮“該不該碰”的時候,兩種選擇所對應的路徑和結局基本是完全不同的,這無形中增大了計算量。
其實人腦在做蒙特卡洛樹搜索時,比較容易做到“想得很深”,比如職業棋手可以提前算到 20 甚至30步棋;但難以做到“想得很廣”,通常情況下大腦只能做到從兩種選擇中找幾個概率較大、有代表性的結局樣本做比較。
所以副露判斷顯得難,其實只是計算量的問題,而對于麻將AI來說,這不是問題。
4. 防守端
防守端需要解決的是攻守判斷和防守打法兩個問題,即“什么時候要防守”和”要防守應該打什么”。
解決這些問題最好的方法是讓麻將AI自己通過大量的牌譜(千萬場量級)進行自我學習。正如前文我所提到的,其實人們對于麻將應該如何科學防守的研究也才剛剛開始,想要分析一個打過三筒和八筒的人真正需要的是幾筒,需要大量的牌譜作為樣本進行研究。
這部分研究現在還要等待電腦去完成,未來的麻將AI在這方面要比人類做得更好可以說是必然的。
對大量牌譜所做的出牌模式研究還可反過來應用于牌效率算法的改進中。比如早巡打過八萬的人手牌中有九萬的概率較小,那么牌墻中剩余九萬的概率就有所上升,牌效率中利用九萬的路徑的概率就可以做出相應的修正。
5. 狀況判斷
狀況判斷指的是麻將的“大局觀”,如為了爭取第一名或者為了規避第四名而采取不同的策略。狀況判斷其實就是對得分期望做進一步的修正。
比如某狀況下我必須自摸13番牌才能逆轉,那么最終結果是13番以下的牌的得分期望可以進一步降低,而13番及以上的牌的得分期望則可以提高。
總之,麻將的復雜度較低,算法上可以用搜索樹窮舉法以及大量牌譜的自我學習來解決,只要有大量牌譜資料,有人肯花時間,有人愿意出資,開發一個能勝過人類的麻將AI,非常容易。