您的位置:首页 > 大数据 > 人工智能

小白的柳州麻将黑科技.Part1 = 你不知道的门清

2015-06-20 23:53 459 查看
小白打过很多麻将,比如国标麻将、十六番、柳州、四川、日本、台湾麻将等等。然而让我失望的是大部分麻将都是靠运气,包括所谓国标认可的国标麻将,往往冠军都不知道自己为什么能赢。但是令我十分高兴的是,自从我接触柳州麻将,我就发现,这个东西居然是可以非作弊手段来提高胜率的,完全因为柳州麻将存在一个最大BUG—门清居然是两番!也许有人说,你不是逗我?国标里门清也是两番啊,那里怎么不BUG;答案是,国标麻将有更多比门清收益更大的BUG,所以门清就不算什么了。
 
这几年来,我一直跟朋友们安利,“得门清者得柳麻”。也就是说:以某种合理的策略去刻意的追求门清,亦即在某种前提下放弃吃碰并放弃别人点炮,是可以获得比正常策略更大的期望收益的。
然而并没有人鸟我,所以我觉得很需要用科学的方法和实验数据来证明一下我的想法是对的,顺带证明一下我不是AI届的耻辱。那我也不废话了,下面写一写证明的思路。
( 没兴趣也可以直接往下拉至※实验结果 ╮(╯▽╰)╭ )
 
Step 1 :编写一个会打麻将的AI。(AI可以理解为机器人哈)
Step 2 :编写一个会使用特定的门清策略的AI。
Step 3 :编写一个“自动麻将机”,然后让AI坐在一起打麻将
Step 4 :让3个普通AI和一个门清AI昼夜不停的打麻将,然后统计数据验证,门清AI赚的钱多。
 
这大概就是我在Part1要做的事情了,Part2可能会研究一个具体的“最优门清策略”,Part3可能会研究2个或3个门清AI欺负普通AI小朋友会不会比一个门清结果要更好,Part4可能会公开源代码和程序设计思路。
 
※规则说明
首先,我们做实验所使用的规则也不完全是柳州麻将。规则如下:
         整个麻将只有两种胡法:普通胡一番(自摸每家一番)、门清两番(每家两番,不计普通胡)。
(我们也把“番”称为“子”)
所谓门清就是不吃不碰不杠(暗杠可以),并且最后自摸胡牌。
可能就有人看不下去了:跟柳州麻将规则差那么多?没有杠上花,清一色,碰碰胡,结果不会差很多么?!
我认为,清一色碰碰胡等等牌型,在柳州麻将里不是应该刻意去追求的牌型。这种说法可以通过国标麻将里给这些牌型的定番来证明。国标麻将里各种牌型的期望收益(番数×牌型概率)相对其它麻将应该是比较合理的。让我们来看看国标给这些牌型的定番:
         清一色 24番; 碰碰胡 6番(实际上有人研究说碰碰胡比想象的更难胡);
         七对 24番; 杠上花 8番;
而这些牌型在柳州麻将里统一是3番不计普通胡(等价于国标的两番),也就是说柳州麻将对这些做成这些牌型的奖励非常低,可以去追求完成这些牌型会付出极大的机会成本。
所以理性的AI完全会无视这些牌型,随缘打。所以我们把这些牌型从规则中删除并不会对结果造成很大的影响。
※实验结果
(1)作为参照组,我们先看四个普通AI打牌会不会得出平均的结果,以验证我整个控制程序的对称性。结果如下:



也就是说4个小朋友打了3200盘麻将(T T好累),最终2号小朋友之比最后一名小朋友多赢了15次。可以说明,这4位小朋友水平基本相当,并且自动麻将机没有给谁“位置”上的优势(所谓对称性)。



这个实验组也得出了另一个结果:

我们这里称每摸4张为打1圈,这和我们平常所说的打1圈不太一样,因为这样好统计。
那么实验结果是,用普通的AI打牌,每盘牌局平均持续8.7圈,也就是说每个人摸了8.7张牌(不计吃碰杠),就有人胡牌了。
这能说明什么呢?这说明了我的这些小朋友AI并不那么小朋友,他们还是有一定实力的,可能比一般人强一点点。回想一下,大家平时打麻将是不是摸起8张牌还不胡就开始害怕别人要胡了?
 
(2)门清组。我们把player4换成门清的AI。这个门清AI的具体策略是:首先,在发牌后,18张牌被摸起之前,使用普通的AI;如果在18张牌被摸起之后,自己的手牌仍保持门清并且已经听牌则开始一心门清自摸,无视任何吃碰杠和点炮。
可能大家觉得数有几张牌被摸起了有点奇怪,这只是因为这么写程序好写。更合理的方式是把别人的鸣牌也作为牌局被推进的线索,考虑在内,可能未来我会改进这一点。
为什么是数18张呢?其实只是我的第一感觉,这种感觉来源于一些数据。比如在参考组实验中,平均有38张牌被摸起时会有人胡牌。数18张时,完成门清听牌就具有很大的优势。但是这个数不能定的太小,因为那样太谨慎会错过很多机会。我觉得这当然不是最优的,但是实验表明数18张是有效的策略。在Part2我会给出数多少张是最佳的策略。
说了这么多我们来看结果吧,我们以1个门清AI对战3个普通AI的形式,进行了四把3200盘的麻将大战,结果如下:

 


 






第一把:门清AI输了10块钱,触发了52次门清策略,成功了32次。
第二把:门清AI赢了122块钱,触发了47次门清策略,成功了23次。
第三把:门清AI输了8块钱,触发了46次门清策略,成功了19次。
第四把:门清AI赢了55块钱,触发了56次门清策略,成功了22次。
         总的来说在总共12800盘麻将中,使用门清策略的AI净盈利159块钱。相对于运气好的小朋友4号打了3200盘赢了10块钱那次实验来说,门清策略可以说是表现了显著的不靠运气的竞争力。有没有心动呢~!如果你觉得每打32盘才赚稳1.5块的策略算什么,我只能说U Can U Up。
请心中默默牢记这条魔咒:每当有一张牌被摸起时数一个数,数到十八,如果发现自己门清听牌了,就门清到底!
         当然如果你看Part2,会有更大的惊喜。
       
(3)有趣的彩蛋。
         在我没有设置策略的时候,有一个版本的AI他是从头开始,不管场上形势如何,不管自己手牌如何就一直无脑门清的。我开始认为他是一个Little Idiot(XSB)。然而实验结果表明,他是一个Huge Idiot(DSB)!!
         在仅仅400盘的比赛中,它输掉了122块钱!!
 
         实际我想展示的是我无意中观察到的一个结果,大家有没有这样的经历,如果你是最后一个摸牌的,第一轮马上轮到你摸牌的时候被下家一个碰打断,然后就开始抱怨他让不让人打牌了!我们可以称这种现象叫滚雪球,因为第一家比你多摸一张牌,他的牌就比你有更高的几率鸣牌,一旦他鸣牌,这种差距又进一步拉大,并一直领先你直到胡牌。
我的程序一开始没有设置随机起手玩家,这个错误反而让我观察到了这种现象。如果很多局麻将一直由player1开始,那么他会获得多大的先手优势呢?下面是结果:

 


        
 


 


观察三把3200局的比赛,我们会发现,这种优势不仅第一名玩家有,第二名玩家几乎具有同等的优势,这真的是一件很神奇的事,And I don’t know why。第三名玩家还好,而第四名玩家简直是太惨了T T。。。
我们把这些优势具体为数字吧。各个玩家的平均胜场为773.75,以这个数字为标准数,计算出各个玩家的优势:
先手优势 3.6%
第二个出牌 3.5%
第三个出牌  -0.74%
         第四个出牌 -6.4%
 
所以这个故事告诉我们惨痛的教训:千万不要给下家的美女喂牌,因为她赢了,她下下把还会赢,下下下把还会赢,而你永远处在可怕的劣势中!
 
※小小的后记
可能这只是一个小小的研究,也不会让大家多赚多少钱,但对我自己来说是一个不小的长进。因为为了这个研究所写的程序,是我的第一个面向对象设计程序,也真的学到了很多。不得不感谢ZZT,我们真是彼此的天使啊!
         敬请期待Part2,因为里面有终极魔咒。然而我可能会休息几天。
         还有有一句话必须跟诸位好朋友说:
不要找小白打柳州麻将,你们就是送╭(╯^╰)╮~~~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ai 面向对象 数据