首页 >> 计算机科学 >> 文章

电脑搓麻高手Comments>>

发表于 2010-10-20 18:32 | Tags 标签:,

“二饼!三条!吃,五万!东风!九条!和了!!!”一到夜幕降临,全国各地大街小巷,房前屋后,无数麻友开始摆起了“万里长城”,很多居民区里“听取麻声一片”。“搓麻”可以称得上中国最普及的运动了,不管在寒冬腊月,东北农村的火炕上,还是炎炎夏日,“麻将之都”成都庭院里的小方桌,每当一次战役结束,一百多个麻将士兵在四双手间跑来跑去,犹如哗哗流水,广东话里还因此给麻将起了个别名“游干水”。除了中国内地和港澳台以外,“打麻雀”也是日本人、韩国人的一大爱好,据说韩国人士还提议过把麻将作为奥运会的一个项目。

麻将作为一项智力游戏,能够如此充满吸引力,在于其中牌局的千变万化,乐趣无穷,如何打好麻将也可以称得上一项学问,不过对于这项广为流行的学问,在科学界“正了八经”的研究却是少之又少。在2008年,台湾国立交通大学的一位学生的硕士毕业论文正是“麻將人工智慧之研究”,他设计了一套人工智能软件教电脑打麻将。

这篇论文中的程序与现有的电脑麻将游戏中的那些电脑“玩家”大不相同,因为这些游戏的制作者为了降低编写程序的难度,这些虚拟的玩家实际都是“作弊”的,知道扣着的牌是什么,并不是真正的以一个打麻将者的身份在玩。你如果和游戏中的三个虚拟玩家在玩,实际上他们三个都是一个电脑程序的三个部分,都是事先安排好的,你只是在和一台电脑在对抗。而这套人工智能软件则是真真正正模仿一个打麻将的人在面对亮着的牌和未知的牌如何决定打哪张牌,留哪张牌,如何猜测可能性和做决定。

我们首先简单看一下麻将的规则,有意思的是,在全国各地,麻将各有各的玩法,各成一派,有徐州麻将、温州麻将、杭州麻将、郑州麻将……,连相距几十公里的两个县城的打法也不相同,不过基本的玩法都差不多,简单的说,最开始所有的牌都是扣着的,四个人各抓13张牌(台湾玩法是15张),之后每个人轮流从自己的这13张牌中打出一张,再从扣着的牌中取回一张新的,总数还是保持在13张左右,同时玩家还可以在适当的时候把别人扔出的牌通“吃”“碰”“杠”夺到自己的牌中,这样,通过不断更新自己的十几张牌,谁先使它们形成一定整齐的花样,比如二饼三饼四饼和四组三张相同的牌,就算赢了(也就是和牌),花样不同,赢钱数额也不同,一般来说,越齐整的花样赢钱越多。在差一张牌就和的时候,叫做“上听”、“听牌”,从上听到最后和牌的这“临门一脚”有两种方式,一种是自己从扣着的牌里抓到,称为“自摸”,此时其余三人都是输家,每人都要给赢家少量的钱;另一种是从别人扔出的牌里得到,称为“点炮”、“放枪”,此时输家只有一个,就是扔出这张倒霉牌的那个家伙,另外两人不输不赢,所有的责任都由这个“点炮”者承担,要给赢家较多的钱。

这份人工智能程序在打麻将的时候,不仅时刻记录着手中的十几张牌,还记录着之前已经打出的每一张牌和已经亮出的牌,然后经过快速计算,可以算出自己手中的牌可以达到“上听”情况的所有可能性,每一次可能有几十种,然后自动选择其中最容易达到的,以此为依据来打牌和吃牌。麻将的真人玩家的大脑没有计算机的运算速度,自然没办法记住所有的牌和算出所有的牌组合方式。不过,这份程序的缺陷是没有考虑不同和牌花样赢钱数额就不同,只是追求最快的和牌可能,所以“玩一次大的”的情况一般不会有。

当一局麻将进行到后期的时候,可能几个玩家都已经“上听”,这时如果不能和牌,避免点炮成为大输家就成了首要任务,在这一点上,这套程序也有自己的办法。每一次它可以在一秒钟内决定打出哪一张牌,可是在这短短一秒钟内,电脑内却发生了复杂无比的计算,程序会模拟出其他三个玩家,每一次以一定的概率打骰子的形式决定他们是否上听,如果上听了,需要的牌是哪一张以及扣着的牌是什么,然后分别模拟自己的打出一张牌后之后会发生什么,最后是谁和了。整个过程相当于自己和自己打了成千上万场麻将,来决定自己目前的三张或四张牌中打出哪一张对自己最有利。

通过“尽快上听和牌”和“避免点炮”的两个设计思想,这套程序已经可以驰骋于牌场。其实除了会打麻将的电脑之外,会下棋的电脑很早就有了,最著名的当数美国卡内基梅隆大学开发的深蓝电脑,在1997年战败国际象棋棋王卡西帕罗夫的故事了。在2006年的中国象棋人机大战比赛中,电脑浪潮天梭也以11比9的总比分战胜了由柳大华、徐天红等五位全国冠军和象棋大师组成的联队,后来又和全国象棋冠军许银川打成了平手。不过不是所有的电脑棋手都有这么高的水平,科学家们研发的会下围棋的电脑表现就都不尽如人意,最好的只相当于围棋九段中最低的初段。也有人研制过会打桥牌的电脑,不过也只达到了业余选手标准。有人分析其中主要原因是围棋和桥牌的每一步棋或者每次出牌的复杂程度和不确定性是两种象棋的很多倍,电脑下起围棋来也常常会有点“脑子不够用”,这是造成电脑在这两个项目上“状态不佳”的主要原因。

那么这套麻将程序又有几段的水平呢?在论文中,作者把这套程序连接到一个游戏网站的服务器上,和别人打了一百局麻将后,结果在六十多局中都和牌,表现尚佳,因为麻将运气的因素不可忽略。看来如果让装着这套程序的电脑去“聚众赌博”,一晚上还十有八九可以赢一笔。

0
为您推荐

47 Responses to “电脑搓麻高手”

  1. 说道:

    电脑杀花手!

  2. Mr.Leo说道:

    拿这个程序去赚一笔。。。。
    科技果然是第一生产力。。。

  3. wclight说道:

    “深蓝”麻将版...

  4. 中子豆说道:

    围棋程序,貌似只能比上业余初段。跟职业初段差得远呢。
    业余九段相当于职业初段。

    • Izual_Yang说道:

      业余最多7段吧,业8则是获得过业余世界冠军者的荣誉称号。其实业余高段跟职业低段的界限很模糊的

      • DS说道:

        大哥,文章里说的程序跟你家PC里运行的程序完全两码事。

        • Hubert说道:

          没看出来怎么是两码事。

          • DS说道:

            深蓝下国际象棋,数据库有几乎全部棋谱,3分钟算600亿步寻找最优。
            你家那破电脑加下载的小程序能装多少棋谱?3分钟能算多少步?

          • 贝雅特丽齐的但丁说道:

            深蓝的计算能力比不过目前的顶级PC,你可以用core i7 980X来试试,保证每秒搜索的步数比深蓝多数倍
            技术在发展,深蓝那堆棋谱实际上也占用不了多少空间,给个2T的硬盘完全装得下

  5. 波浪理论说道:

    有才,用软件来打确实会提高一些胜率

  6. 小耿说道:

    围棋要模拟的话,计算量太大,远远超过象棋和国际象棋,所以比较难一些。
    麻将的计算量应该比围棋小,直觉这么觉得。
    围棋361个点,开局的时候,每一步都要面对三百多种可能性,一乘起来就不得了。
    麻将136张牌,开局还确定了13张,不同的可能性相对围棋要少一点。

    • Metaverse说道:

      361!种可能性……当然,可以通过在程序中写入棋谱来减少很多显然很傻很电脑的选择。。。

      • madbyte说道:

        【361!种可能性……当然,可以通过在程序中写入棋谱来减少很多显然很傻很电脑的选择。。。】
        没听说过“愚形的妙手”和“职业的盲区”吗?围棋之妙在于棋子的价值是流动的,此时的废子是彼时的棋筋。靠棋谱下棋的只能下出书房棋。

    • 拭刀说道:

      这其中还引入了概率,使用了随机数发生器,进行了期望计算。我估计这位麻将帝是使用了类似贪心算法的某种算法,能根据历史出牌进行计算,并根据本轮对手出牌进行调整。程序的复杂程度和智能程度应该和计算的下几步出牌有直接关系,如果每一步都只考虑当前的下几步出牌的最优化,而不是全局最优,程序就不复杂了。要不这个运算时间绝对是不能接受的。

  7. ether说道:

    想起了伤心黑白棋!

  8. sswv说道:

    吴毅成老师。。我 和他照过相呢。。

    • alreadydone说道:

      吴毅成也是六子棋的发明者,其六子棋的人工智能NCTU6棋力也不错。

  9. biohu说道:

    以前听说有人玩轮盘赌,把程序装在有手机里作弊,狠赚了一笔。

  10. 狐狸说道:

    围棋的算法复杂度是最高的,到现在还不能战胜人脑。

  11. 心理学说道:

    研究得很深入

  12. Norz说道:

    避免点炮比上听和牌更有难度呢

  13. sz说道:

    有意思

  14. sz说道:

    有意思

  15. sheldon说道:

    以后可以进行打麻将考级了

  16. 合十说道:

    这就是传说中的麻将外挂……

    • 沐右说道:

      要是能配合自动记录别人打牌的设备就好了
      然后通过耳机告诉人应该打什么牌

  17. 拼音佳佳说道:

    我打麻将也会计算概率的,实际上可以转换成电脑程序.另外,不同规则下,对牌张的取舍要求是不同的,需要算番的麻将,考虑的情况要多一些.
    比如,发牌之后是否做十三幺,看一下不同幺九的张数以及对子情况(对子越多越不宜,幺九越多越适宜).之后做个随机预判(张数越多越倾向于做十三幺),同时根据以往牌局做十三幺的成功率与出铳率做一个加权(成功率高则提高加权,出铳率高则降低加权).

  18. wrench说道:

    来个职业初段, 估计可以让最强的围棋程序9个子
    围棋的大局观这种东西太难数字化了

  19. 喜羊羊和一休哥说道:

    这算法是怎么简单的?

  20. 食人鱼说道:

    太. . . .高级了吧?

  21. jiba说道:

    再哪下

  22. 就是民工说道:

    偶有这篇论文原文,台湾的硕士论文都是这样,比较短小,

  23. 就是民工说道:

    算是一篇工程硕士论文吧。

  24. 常德人才说道:

    这个学问还真大呀

  25. 木棉说道:

    我搓麻将水平很烂,能让电脑帮我打参谋就好了

  26. 殷剑宏说道:

    我估计是用了类似MoGO中的UCT算法

  27. 纯钧说道:

    最后一段很好玩,似乎有人实践过哦

  28. LRZ说道:

    那有人用超级计算机破除过像奥塞罗,五子,这种相对简单的棋么?我所谓破除是两台运算能力足够的计算机交手,在某种条件下(先后手,换子,禁手什么的),一方必定获胜之类的。

  29. william H.Wei说道:

    有没有人计算过混一色 与 碰碰和 的概率相差多少?
    混一色,即一种花色+字牌。
    碰碰和,全是3个相同的组成和牌。可以自己摸成的,也可以是碰成的。

    规则:不能吃牌,只能碰牌。和牌时,则可自摸,也可和别人打的。。。(广东打法)

  30. Deejay说道:

    如果把算法实现写好的话也不失为一篇好文,浅见:可以应用模糊数学以及神经网络的方法加以完善,程序会更智能

  31. 有品快手38D说道:

    請大家不要瞎猜這程式還很粗淺.
    它是利用蒙的卡羅方法來模擬對手可能的手牌及尚未摸到的暗牌牌牆所有可能的組合.主要是在從第10巡起開始模擬.目的是在避免放槍. 至於打牌的邏輯與演算法都還是利用原來他的學長在網路CYC遊戲大聯盟台灣麻將16張程式的原本邏輯.
    請自己下載該碩士論文來看就知道 :
    http://nctur.lib.nctu.edu.tw/handle/987654321/12821?mode=full&submit_simple=%E9%A1%AF%E7%A4%BA%E6%96%87%E4%BB%B6%E5%AE%8C%E6%95%B4%E7%B4%80%E9%8C%84

  32. 大梦说道:

    台湾麻将是16张而不是15张

  33. 算数说道:

    台湾麻将是抓16张。和牌是第17张。

    楼主小学算数都不会哦。

Leave a Reply