授权协议 未知
开发语言 Java
操作系统 跨平台
软件类型 开源软件
所属分类 程序开发数学计算
开源组织
地区 国产
投 递 者 SHFUITCK
适用人群 未知
收录时间 2018-08-27

软件简介

德州扑克算法

用于德州扑克的算法,包括以下功能

  • 查表算法

  • 评估算法

使用

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

测试玩玩

  • 解压texas_algorithm.rar到当前文件夹

  • 运行TestUtil.Main

生成表玩玩

  • 解压texas_algorithm.rar到当前文件夹

  • 运行TexasAlgorithmUtil.Main,需要添加vm参数-Xmx8000m

查表算法

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

算法实现

穷举C(52, 7)的组合

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

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

多线程快速排序

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

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

结果输出

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

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

结果去色

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

  • 对于同花的类型,比如同花、同花顺、皇家同花顺,7张牌的分布肯定是比如红红红红红梅黑,就是至少5张牌是同花色的,于是可以转变花色成为方方方方方黑黑,节省key值

  • 对于非同花的类型,花色毫无作用,那么只需要把花色全去掉,变成方方方方方方方即可

查询方法

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

评估算法

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

算法实现

胜率计算

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

结果去色

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

公牌查询

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

手牌公牌查询

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

胜率预估

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

预估误差

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

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
发表于AI & 大数据专区
2019/08/08 20:47

texas_algorithm 1.0.12发布,德州扑克算法

德州扑克算法 用于带鬼牌的德州扑克的算法,目前支持两张鬼,包括以下功能 查表算法(内存占用十几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张牌的大小,用于比牌...

2
29
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
2019/03/14 15:45

[Algorithm] Radix Sort Algorithm

For example we have the array like this: [53, 89, 150, 36, 633, 233] First step is using Counting sort for last digit, in our example is: [53, 89, 150, 36, 633, 233] [3, 9, 0, 6, 3, 3] Then sort according to the last digit: [150, 53, 633, 233, 36, 89] Then using second last digit to the sort: [633, 233, 36, 150, 53, 89] Last using the last digist to do the sort, and using '0' if missing the dig...

0
0
发表了博客
2015/02/12 20:38

algorithm

lexicographical_compare 比较关系 此时没有大于,小于这类概念,而是按照先后规则进行排序,C++中有许多排序规则,如:std::less<T>,std::greater<T>,等等,这些规则都有一个共性, bool 对象名(或函数名)(const T &left,const T &right); // 若返回真,则表示 left 在 right 之前; // 若返回假,则表示 left 在 right 之后,或者 left 与 right 在同一位置.如: // std::less<int>()(3,7) 返回真,表明在 std::less...

0
0
发表了博客
2019/08/01 12:55

ReliefF Algorithm

# ReliefF Algorithm

0
0
发表了博客
2014/08/27 22:30

MD5 Algorithm(Message-Digest Algorithm 5)

Introduction MD5 algorithm was developed by Professor Ronald L. Rivest in 1991. According to RFC 1321, “MD5 message-digest algorithm takes as input a message of arbitrary length and produces as output a 128-bit "fingerprint" or "message digest" of the input …The MD5 algorithm is intended for digital signature applications, where a large file must be "compressed" in a secure manner before bei...

0
0
发表了博客
2020/08/20 08:21

【Algorithm】NMS

NMS: Input: A list of Proposal boxes B, corresponding confidence scores S and overlap threshold N. Output: A list of filtered proposals D. Algorithm: Select the proposal with highest confidence score, remove it from B and add it to the final proposal list D. (Initially D is empty). Now compare this proposal with all the proposals — calculate the IOU (Intersection over Union) of this proposal w...

0
0
发表了博客
2011/08/17 13:15

算法(algorithm)

算法(algorithm): 对一个现有的问题我们采取的解决过程及方法,可简单可复杂,可高效可低效。一个用算法实现的程序会耗费两种资源:处理时间和内存。很显然,一个好的算法应该是耗费时间少、所用内存低,但是,在实际中,我们往往不能两方面顾全! 算法的效率分析标准: 衡量算法是否高效主要是从以下几个方面来分析: ¨ 简单性和清晰度 一般我们都希望算法越简单越清晰就越好,但是要保证效率为前提。可是,往往我们在复杂的项...

0
5
发表了博客
2019/02/13 20:46

Prim's Algorithm & Kruskal's algorithm

1. Problem These two algorithm are all used to find a minimum spanning tree for a weighted undirected graph. 2.Kruskal's algorithm 2.1 Pseudocode A = ∅ foreach v ∈ G.V: MAKE-SET(v) foreach (u, v) in G.E ordered by weight(u, v), increasing: if FIND-SET(u) ≠ FIND-SET(v): A = A ∪ {(u, v)} UNION(u, v) return A 2.2 Complexity O(E logE) , equivalently, O(E log V) time ,because $$ E \le ...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
7 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部