麻将的深度学习方案

写完了斗地主的AI之后,我就开始着手写一个麻将的人工智能算法。使用了20万条数据进行训练之后,发现机器人水平已经明显比普通人的胜率要高。下面我详细介绍一个这个方案,如果有不妥之处,请与我联系。

这个方案提供一种机器学习的新思路,使模型可以根据当前游戏的情况,进行智能判断更加准确的打出哪张牌,使手上的牌可以更快的胡牌。

为此,本方案提供了一种麻将游戏的机器学习实现方法。所述方法包括:

  1. 如何设计模型数据与标签。
  2. 如何建立模型。
  3. 如何训练模型。

在开始设计模型数据之前,有必要先介绍一下麻将的玩法,理解玩法之后,对于理解数据的设计有很大帮助。

麻将介绍

麻将是一种易学难精的一种游戏,麻将的玩法因各地方不同而各有不同,这里介绍的是一种广东地区的一种癞子玩法,它需要4个人一起打,每个人开始的时候都有13张牌。然后逆时针由庄家开始先摸一张牌,庄家要么胡牌,要么从手上打出一张牌。庄家打出一张牌后,其它玩家可以选择碰牌,如果玩家都不碰牌那么就轮到下一个玩家摸牌。

麻将牌:
麻将牌共分为条子,万子,筒子,字牌4类。
条子分别是1条,2条,3条,4条,5条,6条,7条,8条,9条


image.png

万子分别是1万,2万,3万,4万,5万,6万,7万,8万,9万


image.png

筒子分别是1筒,2筒,3筒,4筒,5筒,6筒,7筒,8筒,9筒


image.png

字牌分别是东,南,西,北,中,发,白; 注意这里红中,白板为癞子


image.png

以上每一种牌都有4张。其中条子9 * 4 = 36张, 万子9 * 4 = 36张, 筒子 9 * 4 = 36张 以及字牌7 * 4 = 28张,一共36 + 36 + 36 + 28 = 136张
条子9种牌,万子9种牌,筒子9种牌,字牌7种牌,总共9+9+9+7 = 34种不同的牌。
分别用0~33表示每一种牌。
0,1,2,3,4,5,6,7,8分别表示:
1筒,2筒,3筒,4筒,5筒,6筒,7筒,8筒,9筒

9,10,11,12,13,14,15,16,17分别表示:
1条,2条,3条,4条,5条,6条,7条,8条,9条

18,19,20,21,22,23,24,25,26分别表示:
1万,2万,3万,4万,5万,6万,7万,8万,9万

27,28,29,30,31,32,33分别表示:
东,南,西,北,中,发,白

例如0表示1筒,9表示1条,18表示1万,27表示东,

胡牌
当玩家把手上的牌形成m * ABC + n*AAA + DD 的形式,就是胡牌。
其中ABC表示顺子,条子,万子,筒子这3条牌相连的3张牌,称为顺子。例如1条,2条,3条,形成顺子。 4筒,5筒,6筒形成顺子。但是8万,9万,1万,不是顺子,东,南,西,也不是顺子。

其中AAA表示坎,相同的3张牌形成坎。例如1万,1万,1万是坎;西,西,西是坎。
其中DD表示一对,相同的2张牌就是一对。例如2条,2条。
其中m与n 表示个数,可以有任意的顺子个数,任意的坎个数。
以下牌形就是胡牌
1条,2条,3条,7条,8条,9条,4筒,5筒,6筒,1万,2万,3万, 9万,9万.


image.png

这里有4个顺子,没有坎,9万,9万形成一对。

以下牌形也是胡牌
1条,1条,1条,3条,3条,3条,5条,5条,5条,7筒,7筒,7筒,东,东。


image.png

这里没有顺子,有4个坎,东,东形成一对。

以下牌形也是胡牌
1条,2条,3条,5条,5条,5条,7条,8条,9条,7筒,7筒,7筒,8筒,8筒
这里有2个顺子,1,2,3条以及7,8,9条;有2个坎5条,5条,5条,7筒,7筒,7筒
两个8筒形成了一对。


image.png

癞子
癞子也叫鬼牌;癞子是指可以变成任意牌的牌,这里我们指定红中,白板为癞子,手上有这两种牌时,它们可以变成任意的牌。有了癞子可以更方便凑成胡牌。
例如
1条,2条,3条,7条,8条,9条,4筒,6筒,1万,2万,3万, 9万,9万,中
可以胡牌,这里面的“中”可以变成5筒形成胡牌。


image.png

听牌
玩家手上只需要再加上一张牌就形成胡牌,这种牌型,我们称之为听牌。
例如1条,2条,3条,7条,8条,9条,4筒,5筒,1万,2万,3万, 9万,9万


image.png

是听牌,正在听3筒和6筒。

设计模型数据与标签

我们建立了一个称之为FoxThinker的神经网络系统,可以根据手中的牌形,来选择打出哪张牌后,可以更快的形成胡牌牌形。
在麻将数据中,我们设定了一个N * 70的数据,其中N表示数据的条数,我们训练的时候,取N为20万,也即是我们使用了20万条数据进行训练。


image.png

这里列出了10条训练数据,表示在某种场合下,应该打什么牌。
其中前34位表示手上有什么牌,第35位~68位表示哪些牌为癞子,第69位表示应该打出什么牌,第70位表示,打出牌之后听几张牌。
我们以第一行的数据来具体解释每一位的含义。
0,0,1,0,0,0,0,1,1,0,0,0,0,2,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,28,0

前34位表示手上有什么牌例如
0,0,1,0,0,0,0,1,1,0,0,0,0,2,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,0,1
共34位,每一位代表一种牌的数量。
从左到右分别代表1筒,2筒, 3筒, 4筒, 5筒, 6筒, 7筒, 8筒,9筒, 1条,2条, 3条, 4条, 5条, 6条, 7条, 8条,9条, 1万,2万,3万,4万,5万,6万,7万,8万,9万, 东,南,西,北,中,发,白。
0,0,1,0,0,0,0,1,1,0,0,0,0,2,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,1,0,0,1
这34位中,第1位为0表示没有1筒,第2位为0表示没有2筒,第3位为1表示有一个3筒. 如此类推,上面这串数字代表的牌型为:


image.png

第35到68位用于表示什么牌将会作为癞子。
这里0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1
只有2个位置为1, 代表红中与白板为癞子。

第69位表示玩家打出什么牌,这里是28, 28表示南。
第70位表示,打出南之后,听几张牌,这里是0,表示听0张牌。也即没有听牌。

这里再举一个例子:
0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,1,1,1,3,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,18,4

表示手牌为:


image.png

打出18, 18表示1万。
打出1万之后,可以听4张以上的牌,听的牌分别是1筒,2筒,3筒,4条,北。
听牌个数中,0表示没听牌,1表示听1张牌,2表示听2张牌,3表示听3张牌,4表示听4张及以上的牌。
值得注意的是,红中白板是癞子,它可以变成任意一张牌。

数据输入层,我们使用68位数组,分别表示手牌是什么,癞子是什么。
69位是标签,表示应该打什么牌。
70位也是标签,表示打出牌之后,可以听多少张牌。

建立模型
我们使用了20 万条游戏数据,从中抽取出胜利玩家的打牌习惯,输入到神经网络中,进行训练。然后把训练好的模型来预测手上有某些牌型时,应该打出什么牌。

模型的流程如下图所示:


image.png

上面模型,我们采用了Tensorflow 2.0的版本进行训练,代码参考如下图所示


image.png

训练模型

我们采用了监督学习的方法,让网络训练20万条游戏数据。

FoxThinker里面有2个模型,一个是选牌模型,另一个是听牌模型。结合两者的结果,最终决定打出什么牌。


image.png

第一层网络层,我们采用了1024个神经元,采用了Tanh激活函数。
第二层网络层, 我们采用了1024个神经元,采用了relu激活函数。
第三层网络层,我们采用了128个神经元,采用了Tanh激活函数。
第四层全连接层,我们采用了34位输出,用于表示从1筒到白板34种牌中,打出牌的概率。

经过测试我们发现1024个神经元是最为稳定的,当神经元过少的时候,训练速度比较快,但是预测的准确率比较低。当神经元比较多的时候,例如2048, 训练速度非常的慢,并且预测的准确率并没有显著的提高。

测试模型

测试效果,我们以其中一局牌为例子,在本局中,一个真实玩家,对3个机器人玩家。
以其中一个最终胡牌的机器人手牌为展示。


image.png

打出了4筒,没有打南风,软件正在打算做混一色。

image.png

摸一张西之后,软件打出5条,混一色动机已经非常明显。


image.png

摸一张6万之后,打出西。


image.png

当摸一张白板后,打出南,形成听牌,最后该机器人摸3万自摸。

实施过程中,我们使用Mac 系统10.13.6版本,T采用ensorflow2.0版本,使用了1个cpu进行训练。20万条游戏数据,我们一共花费了4个小时就训练完成了。

Java Script环境中,我们采用Node JS 8.9.3; Tensorflow JS 2.0

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 文章转载于:http://blog.csdn.net/ichiryuu/article/details/77967...
    FENG_e15c阅读 1,528评论 0 6
  • 1.147,258规则:下家丢1万,3、4、7万基本不吃,2、5万可能要吃;2.牌过半旬,上家开始落风子,不要碰(...
    书是解药阅读 2,140评论 0 8
  • 斗地主的深度学习方案 原论文出处:https://openreview.net/pdf?id=rJzoujRct7...
    歌莫信息阅读 6,861评论 3 4
  • 斗地主是起源于湖北的一项棋牌休闲游戏,游戏是根据湖北当地十分流行的棋牌玩法跑得快变化改进创造出来的。 斗地主是根据...
    JunChow520阅读 3,012评论 0 1
  • 豆子学摄影day6 如何在复杂的背景下突出拍摄主体 1线条可以当引导线,将视线引导到视觉中心(主体) 2,用好前景...
    豆子爱摄影阅读 133评论 0 3