关于麻将的算法问题

2014-08-14 21:23:30 +08:00
 SakuraSa
1.麻将基本
(1. 麻将是一种将手中的牌(14张)通过交换变成特定形式从而获胜的游戏
(2. 当手牌变成 (AA)*2 + (AAA | ABC)*4 的形式时获胜。其中AA表示一对相同的牌,AAA表示3张相同的牌,ABC表示3张牌面数字相邻的不同的牌。
(3. 当最少只要交换1次就可以获胜时,叫做“听牌”
(4. 当最少只要交换n次就可以“听牌”时,叫做“n向听”

2.问题
通过牌面,计算出当前牌是“x向听”(可记“听牌”为“0项听”;获胜为“-1项听”

3.当前思路
http://stackoverflow.com/questions/4239028/how-do-i-calculate-the-shanten-number-in-mahjong
基本是按照上面搜索到的方法来做的

4.需求
希望能在1s内完成1k个手牌的项听数计算,当前我的python实现的算法需要1min才能完成1k次计算。

5.碎碎念,可以略过……
我是一名日麻爱好者,可惜实力实在是没法看,以至于在小伙伴里抬不起头……
于是,就想着通过分析牌谱,找出自己的缺点,找出高手们的技术特点,来改进自己。
其中,这个向听数计算,就是分析每一步是不是最优的必要算法(评价函数)。
可惜,想了很久也没有实现快捷的算法。
现在我手里已经收集了大约1w个牌谱(通过自己的网站,从大家那里收集)。
如果以现在的算法速度,全分析完成大约要几个月……
所以现在只能玩一盘,就用电脑跑10min左右的分析……
想想,自己花在这上面(包括做网站)都快追上打麻将的时间了,可惜麻将水平毫无长进……
真不知道自己是怎么想的。
10071 次点击
所在节点    问与答
28 条回复
jianghu52
2014-08-15 09:19:50 +08:00
我觉得楼主可能有点走偏了。据我所知,目前对于数据应用最强调的还是德州扑克,但是那个应用很多时候也是在针对的是人,而不是出牌策略。
事实上,楼主做这个策略本身就有问题。你的这个胡牌策略应该是基于河里已经出的牌,来判断剩下的牌哪些更多,然后来做胡。
但是问题在于,如果是这样的话,你会频繁的换张,从而导致你的下家更快的胡牌。通常来说,我们觉得风牌比较不重要,而万筒条这样的权重相对较高,而万筒条里面的1 9的权重又比较低,如果你引入了权重的概念,那么计算程度恐怕会上好几个数量级。
再接下来还有上下家的条件,比如上家一个劲的出条子,或者下家一个劲的吃万。那么我们的换张策略也应该跟着变。甚至在危险的牌面下,宁可黄牌也不让其他人胡牌等等。这些都是牌技的一部分,但是如果用算法实现的话,我觉得会很困难。
SakuraSa
2014-08-15 09:36:56 +08:00
@msg7086
的确,麻将是个运气成分非常高的游戏
所以才需要非常多盘的统计,才能将运气成分削减到可以看到真实水平的地步
现在的网络麻将有着良好的记录系统,
在加上相应的算法的话,
我想应该就能更好的辅助选手提高水平

但是,我自己是水平几乎没有提高,真是很伤心的结果……
SakuraSa
2014-08-15 09:57:34 +08:00
@jianghu52
1) “向听数”只是评价函数的一部分。我现在的思路是:

评价函数 = 向听数 - 下一次摸牌使得向听数减少的概率 + 1

这样,字牌和19牌的权重自然会小(并且,会根据牌面和打出的牌而不同)
自认为,这还是一个比较科学的评价手牌好坏的方法(虽然实现似乎很麻烦

2) 手牌好坏的判断,只是出牌策略的一部分(基础部分)。
真正游戏中,还要加上 局势判断 ,才能决定是进攻还是防守。
局势判断,我实在是没什么思路,而且基础部分还没有实现……

3) 由于我现在希望作的是牌谱分析的系统,而不是麻将AI
所以一下部分只是想想(而且这部分比上面的要复杂太多了……

局势判断,我现在的想法是,用选手的 出牌、摸切、副露 为输入,
训练一个神经网络来估计对手的 手牌进度、手牌大小、是否在进攻 之类的参数
最后根据这些参数与自己手牌进度、手牌大小,判断如何进攻、防守
jianghu52
2014-08-15 11:49:56 +08:00
另外,建议还要再加一个番数的输赢赔率问题。这个在德州里面已经很成熟了。可以借鉴。
简单来说,就是如果对手是高番数的听牌,那么你应该倾向于快速胡牌,番数的权重降低。反之,可以适当提高番数的权重。同时,这个对于你要打出去的牌也很有影响。
经常是你为了胡牌而放炮。
imn1
2014-08-15 12:51:26 +08:00
如果你是查表的,1k/min绝对是慢得可以了
麻将花色不超过6种,每种花色不同的牌不超过10种,所以很适合16进制高低位,多用位运算能加速
msg7086
2014-08-15 13:34:36 +08:00
另外,推荐看看天凤十段所著的麻将理论书,我觉得说得很专业了。

http://www.amazon.co.jp/麻雀-魔神の読み-マイナビ麻雀BOOKS-渋川-難波/dp/4839944466 (也有kindle版)
http://tieba.baidu.com/p/3220055762
Sunyanzi
2014-08-15 20:44:31 +08:00
http://www.v2ex.com/t/126619#reply17

供你参考 ... 算法什么的我就不重复说了 ...

我只想问你为何你的统计只考虑向听数而不考虑避铳 ..?
SakuraSa
2014-08-15 21:04:01 +08:00
@Sunyanzi
因为我想不清楚,防御时应该运用的策略的细节……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/127929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX