texas_algorithm 1.0.12发布,德州扑克算法

栏目: 软件资讯 · 发布时间: 5年前

内容简介:德州扑克算法 用于带鬼牌的德州扑克的算法,目前支持两张鬼,包括以下功能 查表算法(内存占用十几M) 评估算法(内存占用300M) 使用 <dependency> <groupId>com.github.esrrhs</groupId> <artifactId>...

德州扑克算法

用于带鬼牌的德州扑克的算法,目前支持两张鬼,包括以下功能

  • 查表算法(内存占用十几M)
  • 评估算法(内存占用300M)

 

使用

<dependency>
    <groupId>com.github.esrrhs</groupId>
    <artifactId>texas_algorithm</artifactId>
    <version>1.0.12</version>
</dependency>
// 获取2张手牌5张公牌的最大的5张牌
TexasAlgorithmUtil.getMax("黑2,黑3", "方2,方A,黑7,黑5,鬼");
// 获取7张牌的大小,用于比牌
int win = TexasAlgorithmUtil.getWinPosition("方4,方A,鬼,黑A,黑3,黑5,黑6");
// 获取2张手牌4张公牌的胜率,用于评估
float p = TexasAlgorithmUtil.getHandProbability("方3,鬼", "黑2,黑4,黑5,黑K");

 

测试玩玩

  • 解压texas_algorithm.rar到当前文件夹
  • 运行TestUtil.Main

 

生成表玩玩

  • 解压 texas_algorithm.rar 到当前文件夹
  • 运行 TexasAlgorithmUtil.Main,需要添加 vm 参数 -Xmx8000m

 

查表算法

查表算法,给定任意 7 张牌(5 张和 6 张也支持),查表给出 5 张最大牌的牌面以及大小、胜率、类型。查表方法很简单,下面讲一下生成表的算法。

 

算法实现

 

穷举 C(52, 7)的组合

52 张牌再加 2 张鬼牌里面选7张,一共有 1 亿多种组合,对7张牌进行编码变成 long 类型,得到一个 1 亿长度的数组。

  • 给定 6 张和 5 张,也是同理生成

 

多线程快速排序

对这 1 亿长度的数组进行从小到大排序,排序依据就是 7 选 5 后的大小。使用多线程快速排序,在8核的机器上,排完大概需要 10 小时。

  • 如果把最终的查表算法替换原始的比牌算法,速度可以缩短到2小时。

 

结果输出

数组已经排好序,现在按照顺序输出到一个文件,内容有 key、大小顺序、ma x牌的值、max 牌的类型、可阅读的牌面信息。最后文件大小差不多 12G。

  • 注意到大小其实是阶梯状的,就是有很多牌是一样大,但是先后顺序不同,所以在输出的时候,要再做一下比牌处理。

 

结果去色

1 亿条数据如果直接用,内存会爆,使用去色算法缩减规模。分为有花色和无花色两个文件,最后文件总大小 18 M。实际加载到内存占用几十 M。

  • 对于同花的类型,比如同花、同花顺、皇家同花顺,7张牌的分布肯定是比如红红红红红梅黑,就是至少 5 张牌是同花色的,于是可以转变花色成为方方方方方黑黑,节省 key 值
  • 对于非同花的类型,花色毫无作用,那么只需要把花色全去掉,变成方方方方方方方即可

 

查询方法

给定 7 张牌,先去同花表里查,如果没有就去非同花表里查,两个都有就谁大选谁。

 

评估算法

评估算法,给定 2 张手牌,0-4 张公牌,大致估算出这手牌在 1v1 情况下的胜率。

 

算法实现

 

胜率计算

注意到前面已经生成了 7 张牌的大小顺序了,那么现在给定 N 张牌(2<=N<=6),只需要去 7 张牌的集合里遍历,看包含这 N 张牌的 7 张牌的胜率,做一下平均值就是平均胜率。顺便还会生出最大胜率最小胜率。5个输出文件最终大小是 2G。

 

结果去色

这个N张牌的胜率表同样存在重复的,采用类似的方法去掉花色,分为两张表,查询先查询原始表,没有再去查询去掉花色的表。通过这种方法,6 个文件可以缩减到 300 M。实际加载到内存差不多 200 M。

 

公牌查询

把公牌代入上面计算的胜率表中,查询得到公牌的胜率情况,也就是说对方用这个公牌去组成 7 张牌的平均胜率记为 P1,以及最大和最小胜率 P1Max 和 P1Min。

 

手牌公牌查询

把我的手牌和公牌加起来,代入上面的胜率表中,查询得到一个平均胜率 P2。注意这时候 P2 是不准确的,因为手牌被重复使用了。这里存在误差。

 

胜率预估

P1、P2 都已经拿到,根据 P1 和 P2 的关系用 P1Max 和 P1Min 做下差值即可得出胜率。这里假定分布是均匀的所以也会有误差。

 

预估误差

如果采用最原始的方法穷举所有组合,即固定手牌和固定公牌,穷举剩下公牌和对方手牌,并计算胜率,目前 2 张手牌 4 张公牌需要 20 多天才能计算完,并且数据量已经超标。通过和实际胜率比较,误差大部分在0.1 以内,比如实际胜率 0.5,预估 0.6。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Release It!

Release It!

Michael T. Nygard / Pragmatic Bookshelf / 2007-03-30 / USD 34.95

“Feature complete” is not the same as “production ready.” Whether it’s in Java, .NET, or Ruby on Rails, getting your application ready to ship is only half the battle. Did you design your system to......一起来看看 《Release It!》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换