texas_algorithm德州撲克算法
德州撲克算法
用于德州撲克的算法,包括以下功能
查表算法
評估算法
使用
<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到當(dāng)前文件夾
運(yùn)行TestUtil.Main
生成表玩玩
解壓texas_algorithm.rar到當(dāng)前文件夾
運(yùn)行TexasAlgorithmUtil.Main,需要添加vm參數(shù)-Xmx8000m
查表算法
查表算法,給定任意7張牌(5張和6張也支持),查表給出5張最大牌的牌面以及大小、勝率、類型。查表方法很簡單,下面講一下生成表的算法。
算法實(shí)現(xiàn)
窮舉C(52, 7)的組合
52張牌里面選7張,一共有1億多種組合,對7張牌進(jìn)行編碼變成long類型,得到一個1億長度的數(shù)組。
給定6張和5張,也是同理生成
多線程快速排序
對這1億長度的數(shù)組進(jìn)行從小到大排序,排序依據(jù)就是7選5后的大小。使用多線程快速排序,在8核的機(jī)器上,排完大概需要10小時。
如果把最終的查表算法替換原始的比牌算法,速度可以縮短到2小時。
結(jié)果輸出
數(shù)組已經(jīng)排好序,現(xiàn)在按照順序輸出到一個文件,內(nèi)容有key、大小順序、max牌的值、max牌的類型、可閱讀的牌面信息。最后文件大小差不多12G。
注意到大小其實(shí)是階梯狀的,就是有很多牌是一樣大,但是先后順序不同,所以在輸出的時候,要再做一下比牌處理。
結(jié)果去色
1億條數(shù)據(jù)如果直接用,內(nèi)存會爆,使用去色算法縮減規(guī)模。分為有花色和無花色兩個文件,最后文件總大小18M。實(shí)際加載到內(nèi)存占用幾十M。
對于同花的類型,比如同花、同花順、皇家同花順,7張牌的分布肯定是比如紅紅紅紅紅梅黑,就是至少5張牌是同花色的,于是可以轉(zhuǎn)變花色成為方方方方方黑黑,節(jié)省key值
對于非同花的類型,花色毫無作用,那么只需要把花色全去掉,變成方方方方方方方即可
查詢方法
給定7張牌,先去同花表里查,如果沒有就去非同花表里查,兩個都有就誰大選誰。
評估算法
評估算法,給定2張手牌,0-4張公牌,大致估算出這手牌在1v1情況下的勝率。
算法實(shí)現(xiàn)
勝率計算
注意到前面已經(jīng)生成了7張牌的大小順序了,那么現(xiàn)在給定N張牌(2<=N<=6),只需要去7張牌的集合里遍歷,看包含這N張牌的7張牌的勝率,做一下平均值就是平均勝率。順便還會生出最大勝率最小勝率。5個輸出文件最終大小是2G。
結(jié)果去色
這個N張牌的勝率表同樣存在重復(fù)的,采用類似的方法去掉花色,分為兩張表,查詢先查詢原始表,沒有再去查詢?nèi)サ艋ㄉ谋怼Mㄟ^這種方法,6個文件可以縮減到300M。實(shí)際加載到內(nèi)存差不多200M。
公牌查詢
把公牌代入上面計算的勝率表中,查詢得到公牌的勝率情況,也就是說對方用這個公牌去組成7張牌的平均勝率記為P1,以及最大和最小勝率P1Max和P1Min。
手牌公牌查詢
把我的手牌和公牌加起來,代入上面的勝率表中,查詢得到一個平均勝率P2。注意這時候P2是不準(zhǔn)確的,因?yàn)槭峙票恢貜?fù)使用了。這里存在誤差。
勝率預(yù)估
P1、P2都已經(jīng)拿到,根據(jù)P1和P2的關(guān)系用P1Max和P1Min做下差值即可得出勝率。這里假定分布是均勻的所以也會有誤差。
預(yù)估誤差
如果采用最原始的方法窮舉所有組合,即固定手牌和固定公牌,窮舉剩下公牌和對方手牌,并計算勝率,目前2張手牌4張公牌需要20多天才能計算完,并且數(shù)據(jù)量已經(jīng)超標(biāo)。通過和實(shí)際勝率比較,誤差大部分在0.1以內(nèi),比如實(shí)際勝率0.5,預(yù)估0.6。
