# AI-doudizhu **Repository Path**: creasson/AI-doudizhu ## Basic Information - **Project Name**: AI-doudizhu - **Description**: 直接预测出牌的AI. - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-07-14 - **Last Updated**: 2023-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### AI斗地主服务程序 运行: `python -u manage.py runserver 0.0.0.0:端口号` 访问: `http://127.0.0.1:端口号/example` 牌的分拆和可选出牌的计算采用onestraw编写的引擎:https://github.com/onestraw/doudizhu 平台对54张牌的编号与这套引擎不一样:0到12表示黑桃3-4-5-6-7-8-9-10-J-Q-K-A-2, 然后是红桃,方块和梅花, 52是BJ, 53是CJ。 ##### 输入 当前玩家所掌握的信息, json数据,示例: { "玩家当前牌": [53, 52, 21, 7, 32, 6, 44, 31, 16, 41, 28, 15, 39, 26, 13, 0], "地主id": 0, "玩家id": 0, "历次出牌": [[0, [14, 1], 18], [1, [33, 20], 15], [2, [], 17], [0, [37, 11], 16], [1, [], 15], [2, [], 17]], "底牌": [7, 32, 11], "桌面上的牌": [14, 1, 33, 20, 37, 11] } 其中历次出牌按顺序记录:玩家的id --- 所出的牌 --- 玩家的剩余张数。 ##### 输出 预测出牌和牌的具体选择。 #### 模型说明 大约是在2019年5月份,公司让我与一个外包团队对接, 他们正参照网络流传的[《AI喊你斗地主——首个搞定斗地主的深度神经网络》](https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/83189966) 进行AI斗地主的实现。 其基本思想是将盘面转化为数字矩阵,再用图像的VGG方法,分两阶段预测出牌类型和具体出牌。后来,我提出了一种简化的数据编码方案和模型,经讨论觉得可行后就由我来 进行开发。几经修改,并参照openAI的AI-DOTA做法, 模型现在的结构是,对玩家角色-牌的张数进行Embedding嵌入, 对牌进行二值化的位置编码,拼接组成一个50\*15\*6的矩阵。 再用mobilenet提取特征,特征与可选出牌的Embedding表示进行点乘,乘积最大的即为预测出牌。 #### 数据预处理 最近借鉴MIT&Google提出的用置信学习找出错误标注方法[cleanLab](https://github.com/cgnorthcutt/cleanlab ),对训练数据进行了清理,效果有明显提升。 #### 示例 ``` 1. {"地主id":1,"底牌":[5,41,47],"桌面上的牌":[40,11],"玩家id":2,"玩家当前牌":[43,4,17,44,18,31,32,45,46,33,8,34,23,49,38,12],"历次出牌":[[1,[40],19],[2,[11],16],[0,[],17],[1,[],19]]} 地主0 出牌: 4,剩余19张 农民1 出牌: A,剩余16张 农民2 出牌: pass,剩余17张 地主0 出牌: pass,剩余19张 农民1当前牌: 2-2-K-K-J-J-10-10-9-9-8-8-8-7-7-7 预测出牌: 9-9-10-10-J-J ``` ``` 2. {"地主id":0,"底牌":[41,24,25],"桌面上的牌":[25,21,7,43,30,17,42,16,3,41,28,2,39,26,13,0,11,49,22,8,20,6,31,19,40,27,14,53,52,45,32,38,12,5,4,29,15,1],"玩家id":2,"玩家当前牌":[44,18,33,47,34,48,35,9,23,50],"历次出牌":[[0,[25,21,7,43,30,17,42,16,3,41,28,2],8],[1,[39,26,13,0],13],[2,[],17],[0,[],8],[1,[11,49,22,8,20,6,31],6],[2,[],17],[0,[],8],[1,[19,40,27,14],2],[2,[],17],[0,[53,52],6],[1,[],2],[2,[],17],[0,[45,32],4],[1,[],2],[2,[38,12],15],[0,[],4],[1,[],2],[2,[5,4,29,15,1],10],[0,[],4],[1,[],2]]} 地主0 出牌: 2-J-10-7-7-7-6-6-6-5-5-5,剩余8张 农民1 出牌: 3-3-3-3,剩余13张 农民2 出牌: pass,剩余17张 地主0 出牌: pass,剩余8张 农民1 出牌: A-K-Q-J-10-9-8,剩余6张 农民2 出牌: pass,剩余17张 地主0 出牌: pass,剩余8张 农民1 出牌: 9-4-4-4,剩余2张 农民2 出牌: pass,剩余17张 地主0 出牌: CJ-BJ,剩余6张 农民1 出牌: pass,剩余2张 农民2 出牌: pass,剩余17张 地主0 出牌: 9-9,剩余4张 农民1 出牌: pass,剩余2张 农民2 出牌: 2-2,剩余15张 地主0 出牌: pass,剩余4张 农民1 出牌: pass,剩余2张 农民2 出牌: 8-7-6-5-4,剩余10张 地主0 出牌: pass,剩余4张 农民1 出牌: pass,剩余2张 农民2当前牌: A-K-Q-Q-Q-J-J-10-8-8 预测出牌: 10-J-Q-K-A ```