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