人工智能在麻将领域能够战胜人类吗?

对于一个两上听以内的手牌来说,这个树的深度最多也就是 4~5 步,每一步的分支平均在 15 种左右,也就是说复杂度最多在 10^5 数量级。由于每条路径都对应着一个确定的概率,一个好的麻将 AI 完全可以做到遍历这个树,比较两种或更多种打牌选择之间所对应结局的和牌期望之和。

对于三上听以外的手牌(由上文图中可知三上听以外的手牌约占手牌所有组合的 80%),由于手牌中会存在大量的孤张或简单搭子,只需单独比较孤张或简单搭子的效率即可,计算量更校

除了上述穷举手牌搜索树的方法,还可以采用模拟的方法。比如让麻将 AI 在短时间内模拟两种打法各 1000 手牌,哪个和牌率更高就选哪种打法。虽然这样不太精确但已经足够保证比人要强了。

2. 和牌限制与番数价值

很多麻将规则对和牌有限制,比如国标麻将必须八番起和,四川麻将必须缺一门,太原麻将和牌必须包含指定牌张等等。我们只需在上述基础牌效率算法搜索树的基础上,「砍掉」那些结局不符合要求的分支即可。

有些时候我们不仅关注和牌的概率,也关注和牌的大小,比如有些牌我们宁可损失一些进张也想去做清一色,追求更高的和牌得分。我们只需为树的所有结果赋值(和牌得分),并用结局对应的值与路径对应的概率求出不同打法的得分期望并进行比较。

3. 副露判断

「这个牌该不该碰」似乎是打麻将时比较令人头疼的问题。但其实副露判断只是计算量大,并不需要特殊的算法,依然是对比碰与不碰两种选择所对应的所有结局的得分期望即可。日本麻将中的立直(报听)判断也是同理。

只不过当我们在考虑「打哪张好」的时候,两种打牌选择之间所对应的路径和结局有大部分都是重合的;而我们在考虑「该不该碰」的时候,两种选择所对应的路径和结局基本是完全不同的,这无形中增大了计算量。其实人脑在做蒙特卡洛树搜索时,比较容易做到「想得很深」,比如职业棋手可以提前算到 20 甚至 30 步棋;但难以做到「想得很广」,通常情况下大脑只能做到从两种选择中找几个概率较大、有代表性的结局样本做比较。所以副露判断显得难,其实只是计算量的问题,而对于麻将 AI 来说,这不是问题。

4. 防守端

防守端需要解决的是攻守判断和防守打法两个问题,即「什么时候要防守」和「要防守应该打什么」。解决这些问题最好的方法是让麻将 AI 自己通过大量的牌谱(千万场量级)进行自我学习。正如前文我所提到的,其实人们对于麻将应该如何科学防守的研究也才刚刚开始,想要分析一个打过三筒和八筒的人真正需要的是几筒,需要大量的牌谱作为样本进行研究。这部分研究现在还要等待电脑去完成,未来的麻将 AI 在这方面要比人类做得更好可以说是必然的。

对大量牌谱所做的出牌模式研究还可反过来应用于牌效率算法的改进中。比如早巡打过八万的人手牌中有九万的概率较小,那么牌墙中剩余九万的概率就有所上升,牌效率中利用九万的路径的概率就可以做出相应的修正。

5. 状况判断

状况判断指的是麻将的「大局观」,如为了争取第一名或者为了规避第四名而采取不同的策略。状况判断其实就是对得分期望做进一步的修正。比如某状况下我必须自摸 13 番牌才能逆转,那么最终结果是 13 番以下的牌的得分期望可以进一步降低,而 13 番及以上的牌的得分期望则可以提高。

总之,麻将的复杂度较低,算法上可以用搜索树穷举法以及大量牌谱的自我学习来解决,只要有大量牌谱资料,有人肯花时间,有人愿意出资,开发一个能胜过人类的麻将 AI,非常容易。

原文发表于知乎

登陆|注册欢迎登陆本站,认识更多朋友,获得更多精彩内容推荐!