前言:
  最近在研究德州扑克的AI, 也想由浅入深的看下, 在网上找了一圈, 发现很多文章都提到了一篇文章: Programming Poker AI. 仔细拜读了一下, 觉得非常不错. 这里作下简单的翻译工作, 可能加些自己的一些理解, 权当做一回大自然的搬运工, ^_^.

扑克数据模型抽象(Poker Data Type):
  本文的作者倾向于使用位/字节级别来描述牌的数据模型(Hand=玩家手牌+公共牌), 也算一种高阶的抽象.
  花色(Suit), 其值范围为0..3, 并假定梅花(Clubs)=0, 方块(Diamonds)=1, 红心(Hearts)=2, 黑桃(Spades)=3.
  等级(rank), 其值范围为0..12, 赋予 2(deuce)=0, 3=1, ..., King=11, Ace=12.
  牌(Card)其就对应一个0..51的整数, 三者满足如下等式:

card = suit*13 + rank.
Suit = card/13
Rank = card%13 

  Hand就可以用一个52bit的表示, 其中每一位都代表一个具体的牌. 可以借用4个16位字节来简单实现, 其中每个16位字节(word)覆盖一组花色牌.
  
  对于牌类型(Hand Type), 这边设定:

高牌(no pair) = 0
一对(pair) = 1
两对(two pair) = 2
三条(trips) = 3
顺子(straight) = 4
同花(flush) = 5
葫芦(full house) = 6
金刚(quads) = 7
同花顺(straight flush) = 8

  注: 这边的Hand, 我的理解是对应玩家手牌+公共牌组合后的结果.

牌力编码(Encoding Hand Values):
  牌力的编码可以用32位正整数来标识, 其值的大小和牌力是正相关.
  牌力编码设计为6个半字节(4位)的组合, 最高的半字节代表牌类型, 接下来的5个半字节代表依序的数值.
  

  样例一: AH,QD,4S,KH,8C 是高high牌型, 所以牌型半字节为0. 数值排序为(A, K, Q, 8, 4), 其经值转换后为(12, 11, 10, 6, 2). 用16进制来表示, 则变为(C, B, A, 6, 2). 最终的32位整数为: 0x000CBA62.
  样例二: 4D,JD,3D,4C,AD 是一对牌型, 所以牌型半字节为1. 数值排序为(4, A, J, 3), 16进制表示为(2, C, 9, 1). 最终的32位整数位: 0x0012C910.
  样例三: 7C,6C,5C,4C,3D 是顺子牌型, 所以牌型半字节为4. 数值排序(7), 16进制表示为(5). 最终的32位整数位: 0x00450000. 注: 顺子类型选取最高的数值代表.
  结合这些样例, 你会发现, 其牌力和代表的数值, 是符合正相关的. 因此牌力的比较变得非常的容易.

计算牌力(Calculating Hand Values):
  我们需要定义一个函数, 能够快速的计算hand到牌力值的转换. 这边提供了一些思路.
  比如同一花色的13位可以有8192种组合(2的13次方=8192), 这个数值不大. 它给我们了一种思路去优化计算, 就是提供一个预计算好的8K大小的table表, 用于加速评估. 比如快速找到同花, 顺子等等.
  再比如计算每个牌数的不同花色数, 利用有不同花色的rank, 然后快速确定牌型.
  这个函数最终涉及按位操作, 表查询和简单比较, 那它的性能将非常的快.

计算胜率(Calculating Hand Strength):
  胜率(HS)是一个0.0到1.0之间的一个数值, 它代表赢得当前局的概率. 比如HS=0.33意味着, 33%的概率赢得胜率.
  这边胜率计算方式, 采用了模拟法(俗称的蒙特卡洛算法). 比如随即模拟1000次, 你赢得423局, 那么你的HS为423/1000=0.423.
  这个模拟过程, 可以用如下伪代码来表示:

Create a pack of cards
Set score = 0
Remove the known cards (your hole cards, and any community cards)
Repeat 1000 times (or more, depending on CPU resources and desired accuracy)Shuffle the remaining packDeal your opponent's hole cards, and the remaining community cardsEvaluate all hands, and see who has the best handsIf you have the best hand thenAdd 1/(number of people with the same hand value) to your score (usually 1)End if
end repeat
Hand Strength = score/number of loops (1000 in this case).

  真实的胜率评估可能要比这要复杂, 你需要考虑其他玩家位置, 行为, 筹码量, 盲注等. 所以计算胜率的过程, 需要一定程度的修改. 当然这是个开放性的话题.

底池赔率(Pot Odds):
  底池赔率是指你的加注/跟注和最终底池的比例值.
  比如你加注$20, 加注前底池总额为$40. 那么底池赔率为20/(40+20)=0.333.

收益率(Rate Of Return):
  收益率也可以称为回报率, 我们如下定义它:

 Rate Of Return = Hand Strength / Pot Odds.

  

决策(The Fold/Call/Raise Decision):
  定义FCR为每一轮棋牌/跟住/加注的策略行动. 同时定义RR为回报率(Rate Of Return).

If RR < 0.8 then 95% fold, 0 % call, 5% raise (bluff)
If RR < 1.0 then 80%, fold 5% call, 15% raise (bluff)
If RR <1.3 the 0% fold, 60% call, 40% raise
Else (RR >= 1.3) 0% fold, 30% call, 70% raise
If fold and amount to call is zero, then call.

  对于上面的阈值, 可以适当的进行调整.
  同时这边也加入一些模糊策略, 包括在牌力不强情况下的诈唬.
  注: 这边的诈唬, 某种角度也可以理解为半诈唬, 是自带防守, 就算诈唬失败依旧有机会逆转.

筹码保护(Stack Protection):
  当你的筹码很深且盲注很小时, 上述的简单规则会表现的很出色. 但是自身处于短筹或者盲注变高时, 需要做些保护策略, 否则很容易All-In而失去所有.
  比如你手牌为AD, 2D, 此时公共牌为QC, KC, 2C. 此时你2一对, 但对手可能是同花牌. 如果底池为$500, 而对家raise $100. 刚好你筹码只有$100. 这种情况下, 你的Pot Odds(底池赔率)为100/(500+100)=0.1666, HS(胜率)为0.297. 这样RR=0.297/0.1666=1.8, 按照上述决策, 应该call. 但是这种情况下, 你有70%的大概率会失去所有, 请不要这样决策.
  为了处理这种情况, 引入一个简答的启发式条件: 除非大概率胜率, 否则不轻易压上全部/大部分筹码.
  添加如下规则:

if (stack- bet) < (blind * 4) and (HS < 0.5) then fold

  

更多的工作(More Work):
  当前的AI策略, 还有如下需要加强的地方:
  1). 翻前手牌胜率预估(Pre-flop hand strength tables)
  2). 对手模型(Opponent modeling)
  3). 隐含赔率(Implied Odds)
  4). 个性化建模(Personality modeling)
  5). 基于位置的策略(Positional play)
  6). 概率搜索空间(Probabilistic search space)
  7). 游戏理论和纳什均衡(Game theory and Nash Equilibrium)

AI测试:
  总的来说, AI效果还是很赞的. 包括网上的很大大拿, 实现了该算法之后, 都竖起了大拇指. 当然这个算法, 遇到蛮不讲理的玩家, 把把All In, 它的弃牌率有些高. 其实真实玩家去玩, 也会是类似的囧境, 只不过人是可以根据对手的打法动态的调整策略, 这一点确实是该AI算法的不足. 还有就是对玩家的反raise, 该算法没有相应策略应对.

评价:
  其实这个AI算法, 最让我眼前一亮的, 其实是它的数据模型抽象, 以及牌力值函数设计, 对于快速计算也提供一种很好思路, 确实很赞. 算法本身借助蒙特卡洛算法, 隐含了当前牌力/发展面(抽牌命中率), 对手的可能牌力分布, 这些综合的因素, 完美而简洁地现实了效果. 总的来说, 这是一个很好的文章, 其数据模型可被后续很多AI算法继续沿用.

个人站点:

  个人游戏作品集站点(尚在建设中...): www.mmxfgame.com

德州扑克AI--Programming Poker AI(译)相关推荐

  1. 浅谈德州扑克AI核心算法:CFR

    本文首发于行者AI 引言 自2017年AlphaGo打败世界围棋冠军柯洁后,人工智能彻底进入大众视野,一时间棋牌类的AI在人工智能界掀起了一股大风.其实早在AlphaGo之前,人们就对棋牌类的人工智能 ...

  2. AI 首次在德州扑克战胜人类职业玩家,新算法让机器拥有“直觉”

    2017年刚开年,人机大战激战正酣:从围棋上孤独求败的 Master 到人脸识别的小度,现在,国外科学家宣布,机器已经在一对一的无限注德州扑克中赢过人类.扑克是典型的不完美信息博弈游戏,也是人工智能面 ...

  3. android德州扑克计算器,学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum...

    原标题:学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum 选自arXiv 参与:路.晓坤 CMU 冷扑大师团队在读博士 Noam Brown.Tuomas Sandho ...

  4. 德州扑克算法幕后研发者CMU博士Brown专访:AI如何打败顶级人类牌手?

    在上个月举行的单挑无限注德州扑克( heads-up no-limit hold'em)人机对战中,由卡耐基梅隆大学研发的AI程序Libratus以每100手14倍大盲(译者注:缩写为14bb/100 ...

  5. 德州扑克 java 算法_德州扑克算法幕后研发者:AI如何打败顶级人类牌手?

    原标题:德州扑克算法幕后研发者CMU博士Brown专访:AI如何打败顶级人类牌手? 在上个月举行的单挑无限注德州扑克( heads-up no-limit hold'em)人机对战中,由卡耐基梅隆大学 ...

  6. 完胜四名专业级德州扑克玩家?AI软件Libratus何以称雄?

    全文共2786字,预计学习时长8分钟 来源:Pexels 科技世界正在以我们无法想象的速度千变万化. 当激励机制还为人类所掌控,而我们作为人类-技术关系中唯一开拓者的日子已经一去不复返了. 如今,情况 ...

  7. 德州扑克AI辅助实时建议

    基础问题: 1. NZT AI支持哪些平台? 国内几个APP平台主要是:德扑圈HHpoker.微扑克WePoker.扑克王.扑克时间.红龙.扑克之城COP.鱼扑克Runit.WePoker Plus ...

  8. 【杂谈】有三AI专业版学习扑克牌上线,一副扑克,看懂AI核心技术

    相信现在大部分小伙伴只要有可能都躲在家里,外面有病毒和酷暑,那怎样才能学习娱乐两不误呢?是时候该我们出手了,有三AI专业版学习扑克牌今日奉上! 一副扑克,看懂AI核心技术 目前AI技术在各行各业中都大 ...

  9. 用百行Python代码写一个关于德州扑克的类

    德州扑克是一款竞技类的扑克游戏,随着人类在各种竞技游戏被ai所碾压,我思考有着像棋类这种考验计算能力封闭式的游戏被电脑统治在所难免,德州扑克这种考验人性和心理的游戏在2017年也被ai攻克,本人是德州 ...

最新文章

  1. [c#]解决方案:需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。
  2. 「ZJOI2016」大森林 解题报告
  3. eclipse左侧框不见了怎么办
  4. 前端工程与性能优化:静态资源版本更新与缓存
  5. Struts2之环境配置
  6. Tableau可视化学习笔记:day13-14
  7. php去掉 部分字符,输出,php如何去除某个字符
  8. AWK学习笔记八:AWK内置函数
  9. Vanya and Triangles 暴力枚举
  10. 使用vue脚手架进行模块化开发
  11. python通过GUI 界面搭建实现嵌套功能_搭建系统|升级基于财务数据的选股工具!从清单中剔除ST股和次新股...
  12. qvodplayer.hta:按个人使用习惯自写易用的整合搜索资源的p2p电影搜索/播放程序(能自动升级)
  13. 腾达AC15改内存闪存刷AC68U梅林
  14. C语言将txt文本文档数据重新排序并放至新txt文本文档中
  15. Android 视频播放 界面变形处理
  16. 我账户不显示pop3服务器地址,Hotmail 邮箱POP3服务器的设置方法
  17. “成本刺客”防不胜防,如何应用亚马逊云科技驾驭云成本
  18. Android音视频开发:MediaRecorder录制音频
  19. ISP简介(stm32)
  20. Cisco Packet Tracer中配置三层交换机

热门文章

  1. [Java] 蓝桥杯ALGO-125 算法训练 王、后传说
  2. [Java] 蓝桥杯 BASIC-5 基础练习 查找整数
  3. [Python] L1-037. A除以B 团体程序设计天梯赛GPLT
  4. ios11+html5偏移20pt,iOS tableView内容向下偏移20pt或向下偏移64pt的问题?
  5. python cv.rectangle_Python OpenCV cv2.rectangle()用法及代码示例
  6. Java中什么时候使用extends,什么时候使用implements?
  7. Ecplise + Xdebug 一波三折终于能单步调试了
  8. 构建jQuery对象(转)
  9. dbentry访问带密码的Access
  10. 常用的C#方法【Format.CS】