非完备信息的机器博弈-麻将篇

前言

本文是在我参加完八月的‘2021年中国大学生计算机博弈大赛暨第十五届中国计算机博弈锦标赛’的麻将项目后总结的一些程序的具体思路(不包含源代码),希望对以后参加比赛或者是想了解的同学做到参考的作用。

不同的棋牌类Ai对战都属于计算机博弈,根据参与者在博弈过程中能够获取到的信息的程度,可以把博弈问题分为完备信博弈和非完备信息博弈。完备信息博弈也就是在博弈过程中,能够获取到所有的游戏状态信息,而不存在信息隐藏的情况。而非完备信息信息博弈是指参与者在博弈的过程中,只能获取到自己可见的游戏信息以及一些公共的信息,而不能获取到全部的游戏信息。本文所涉及的麻将就属于非完备信息博弈。

整个程序的设计思路

关于整个程序的设计思路如下图:
在这里插入图片描述游戏开始后,接收到当前对局信息,在定义的json格式接口中,对局信息包括

字段类型描述举例
pon_handstring自己已经碰的牌,不同的碰用逗号间隔“D2D2D2,C3C3C3”
chow_handstring自己已经吃的牌,不同的碰用逗号间隔“C3C4C5,D6D7D8”
kon_handstring自己已经杠的牌,不同的碰用逗号间隔“D4D4D4D4,B8B8B8B8”
handstring自己的手牌“D2D3D4D7D8D9B1B5
historyarray历史动作序列,array中所有动作均用三元组字符串来表示。其中每个三元组由“谁”、“决策”、“内容”来决定。历史动作中不含“Pass”和“Win”。[“0,Discard,D1”]
dealerint庄家是谁2
seatint当前决策方是谁4

接着通过自己手牌的张数判断出该回合是属于自己的打牌阶段(偶数张即为刚摸牌后的打牌阶段)还是处理其他玩家打出的牌(做出吃碰杠胡的操作)。
如果是自己的打牌阶段,首先判断摸得牌能否自摸,如果能直接返回胡牌操作。而返回的动作信息包括:

字段类型描述举例
codeintHTTP状态码200
chow_handstring决策方的策略类型“Chow” ,“Pon”,“Kon”,“”Listen“,Win”、”Discard”、”Pass”
kon_handstring决策具体内容同历史序列里的“内容”,比如吃“C5C6C7”

如果不能胡则进行搜索计算,在展开的数中选出最优的节点打出。
而如果是处理其他玩家出的牌则相同也是通过博弈树计算是否进行吃碰杠,本文在最后有讲到如何计算。

Expecitmax搜索

在阅读相关的非完备信息博弈的文章后选择到了Expectimax搜索算法。
Expectimax搜索是一种常见的博弈树搜索算法,在非完备信息博弈过程中,因为游戏内对手手牌信息,以及牌山里剩余的牌和下一次自己摸得牌都具有随机性和隐藏性。所以该算法很适合该问题的解决。
expectimax搜索树包含两种节点,分别为chance节点和max节点,每一层可理解为分别由两层不同的节点构成。chance节点代表着该回合你可能会摸得牌,而max节点则代表着摸牌后打哪张牌获胜的概率最大。在游戏过程中分别有吃,碰,杠,摸四种方式来获得一张牌,所以四种操作都看作特殊的摸牌。通过麻将过程,结合算法,现在举个例子展开博弈树。例如我们现在手中牌为

关于吃碰杠决策的设计

因为原本初始版本程序中吃碰杠操作是触发了该动作就默认执行,也就是能碰则碰,能吃则吃。然而打麻将的过程中事实上每一次的动作都很重要,合理的吃碰杠决策可以使玩家能够尽快凑齐胡牌牌型 ,从而加速打牌的流程,提高胡牌效率,然而,如果吃碰杠的决策有误,反而会破坏原来手牌的组合。因此,吃碰杠决策的设计在整个算法中也非常重要。本来最开始也考虑了胡牌这一动作的决策,以此来获取更高分数,但本麻将一旦一方胡牌整局就结束,所以该动作不需要决策,触发即执行,降低风险。
该决策设计通过展开博弈树来进行解决,也就是说我们通过区别是否执行的这个动作和过这两个动作哪个动作更优,将两个不同的动作构造成两个不同的节点,从而采用打牌的expectimax算法计算哪个节点的预估值更高来决策执行哪个动作,最后函数返回一个bool值来决定是否执行动作,结果为Flase则向服务端发送Pass的请求。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值