7カードポーカーハンドを評価するための高速アルゴリズムを知っている人はいますか? 7のセットから21の5枚ごとのハンドの組み合わせを単純に総当たりチェックするよりも効率的なもの。
乾杯、
ピート
このサイトには、多数の Poker Hand Evaluatorライブラリ がリストされており、それぞれについていくつかの詳細が説明されています。それらのほとんどは5枚のカードハンド用ですが、7枚のカードハンド用に少なくとも1つ The Snezee7 Evaluator と呼ばれます。さらに、このサイトでは、ポーカーハンドをすばやく分析するために使用されるさまざまなテクニックとアルゴリズムの概要を説明しています。
私はいくつかの異なる pokerプロジェクト でPokersourceエバリュエーターのキースルールC#ポートを使用し、優れたライブラリだと思います。非常に高速なハンドエバリュエーターを作成するために使用できる巧妙なトリックはたくさんありますが、コードの記述は大変な作業なので、既存のライブラリーを使用することを強くお勧めします。
JavaScriptで作成しました。コア評価方法はビット操作のみを使用するため、非常に高速です。これを念頭に置いて、21の組み合わせを見るのはまだ非常に高速です。さらに深くする必要があるのは、同点が発生したときだけです。これが発生した場合、どの5カードハンドが実際に最高であるかを確認するために、詳細を調べる必要があります。これが私が思いついた解決策です:
hands=["4 of a Kind", "Straight Flush", "Straight", "Flush", "High Card",
"1 Pair", "2 Pair", "Royal Flush", "3 of a Kind", "Full House" ];
var A=14, K=13, Q=12, J=11, _ = { "♠":1, "♣":2, "♥":4, "♦":8 };
//Calculates the Rank of a 5 card Poker hand using bit manipulations.
function rankPokerHand(cs,ss) {
var v, i, o, s = 1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4];
for (i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)) {v += o*((v/o&15)+1);}
v = v % 15 - ((s/(s&-s) == 31) || (s == 0x403c) ? 3 : 1);
v -= (ss[0] == (ss[1]|ss[2]|ss[3]|ss[4])) * ((s == 0x7c00) ? -5 : 1);
document.write("Hand: "+hands[v]+((s == 0x403c)?" (Ace low)":"")+"<br/>");
}
//Royal Flush
rankPokerHand( [ 10, J, Q, K, A], [ _["♠"], _["♠"], _["♠"], _["♠"], _["♠"] ] );
よろしくお願いします:)はい、これはチケットだけの新しいソリューションです。
コード: http://code.google.com/p/specialkpokereval/
ブログ: http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html
このエバリュエーターの商用グレードの進化版は、iTunes Storeを介してiPhone/iPod Touchで利用できます。 「 ポーカーエース 」と呼ばれています。
リンク付きのさまざまなソリューションの優れた概要は、James Devlinのブログ「 Coding The Wheel 」にあります。
そこでまだ議論されていない評価者が Klaatu's です。
幸運を!
21通りの組み合わせすべてを繰り返すことなく、7枚のカードの手札を評価するアルゴリズムを開発しました。
基本的に、それは7枚のカードの手を2つのカテゴリーに分けます:フラッシュとフラッシュではありません。フラッシュの場合、8192エントリのテーブルで値を検索するのは簡単です。フラッシュでない場合は、動的プログラミングの手法でハッシュ関数を実行し、49205エントリのハッシュテーブルで値を検索します。
興味があれば、githubで私の作品をチェックしてください。
Cでポーカーエバリュエーター用のテストベッドを作成しました here 。私がテストした評価者のうち、 poker-eval ライブラリが勝者でした。 Steve BrecherのHoldem Showdown も非常に高速で、必要なメモリが大幅に減少しました。私自身 ACE_Eval それは自分のものだと思った。
他のエバリュエーターの追加、および他のマシンからのテスト結果の貢献を歓迎します。
私はあなたが21の組み合わせをして、何らかの種類の7462テーブルを使うべきだと思います。 1枚目:7枚のカードには5枚のカードの組み合わせが21種類あります。2枚目:すべての最終的なポーカーハンド(2.598.960)は7462種類のハンドの1つを表すため、簡単です。
あなたはちょうどあなたのカードの21の組み合わせごとを見て、それぞれについて、7462ランキング表のランキングを見る必要があります。 http://www.sendspace.com/file/pet0dd
次に、7枚のカードごとに、この7462テーブルから作成した21の異なるランキングがあります。 21の組み合わせの最高ランキングは、知りたいものです。
テーブルを理解するには:すべての行に5枚のカードの手(Zがスーテッド、Yがスーテッドではない)があり、そのランキングがあります。それだけが必要です。テーブルとアルゴリズムの例を示します。実際のコードではありません。それは視覚的な基本フォーマットであり、私は今それを書きました。おそらく動作しませんが、理解する必要があります。コードは次のようになります。
'############### 1st: Define your hand, for example "2c2d2h2s3c3h3s" #############################################################################################
Dim mycard As New ArrayList
mycard(1).Add("2c")
mycard(2).Add("2d")
mycard(3).Add("2h")
mycard(4).Add("2s")
mycard(5).Add("3c")
mycard(6).Add("3h")
mycard(7).Add("3s")
mycard.Sort() '################# you need to sort in alphabeticall order to match it later with 7462 table #############################################
' ################## 2nd: Let´s transform it to every kind of 5 cards combinations (21). It will also preserve the alphabeticall order ##################################
Dim myHand5 As String = ""
Dim suited as String = ""
Dim ranking as Integer = 0
Dim myranking as Integer = 7462
Dim mystring as String = ""
For cicle1 = 0 to 2
For cicle2 = cicle1 + 1 to 3
For cicle3 = cicle3 + 1 to 4
For cicle4 = cicle3 + 1 to 5
For cicle5 = cicle4 + 1 to 6
myhand5 = left(mycard(cicle1),1) & left(mycard(cicle2),1) & left(mycard(cicle3),1) & left(mycard(cicle4),1) & left(mycard(cicle5),1)
suited = left(mycard(cicle1),2) & left(mycard(cicle2),2) & left(mycard(cicle3),2) & left(mycard(cicle4),2) & left(mycard(cicle5),2)
if suited = "ccccc" or suited = "ddddd" or suited = "hhhhh" or suited = "sssss" then myhand5 = myhand5 & "Z" Else myhand5 = myhand5 & "Y"
ranking = 0
FileOpen (1, "7462.txt", Input)
Do
ranking = ranking + 1
Input(1, mystring)
Input(1, ranking)
If mystring = myhand5 Then
If ranking < myranking then myrankin = ranking
End If
Loop Until EOF(1)
FileClose(1)
Next cicle5
Next cicle4
Next cicle3
Next cicle2
Next cicle1
最終ランキングはmyranking変数です。 1秒足らずであなたの手がわかるはずです。そして、あなたはそれの名前ではなくランキング値を持っているので、他の手と比較するのも良いです。ポーカーアルゴリズムで何かをしたい場合は、ここから始めます。ランキング値を使用すると、すべてが迅速かつ簡単です。
注:私はプログラマではありません。私はなりたいです。私はいくつかの視覚的な基本機能を理解しています。実際のプログラムの作り方は知っていました。アルゴリズムが機能する場合は、コメントを残してください。非常に高速にしたい場合は、方法がわかりません。ゲームのすべてのステージで、対戦相手とのオッズを(リアルタイムで)チェックできる超高速アルゴリズムがあります。多くのアルゴリズムを試して、フロップでのオッズをリアルタイムで計算しましたが、最速は30秒です。これで、フロップで3秒でオッズを計算できますが、150ギガバイトのデータベースを使用して、多くのものが事前計算されています。オッズをリアルタイムで知りたい場合は、事前に多くのことを計算しておく必要があります。それが私がやった方法です。
お勧めします https://github.com/chenosaurus/poker-evaluator/
JavaScriptで記述され、128 MBのHandRanks.datファイルを使用します。
コードはほんの数行で、他の言語への移植が非常に簡単です。
私はテキサスホールデムシミュレーターを開発し、この開発中にフロップで7462のユニークな組み合わせ(52-5/5カード)の数を見つけました。次に、この数は6075(5/6)に減少し、川では4824(5/7)に減少します。これは、1枚か2枚のカードがポーカーハンドを分類する上で重要ではないためです。例:76543QK = 7654332直線(3から7)
私のシミュレーターはEasy Pokerと呼ばれ、私のサイトで利用できます http://crvltda.webs.com
参照Pokersoftware.com/forum
もちろん、それを非常に速く実行したい場合は。前に置いたアルゴリズムが遅すぎる。
Table7462はファイル内ではなく配列内にある必要があります。
次に、7カードのさまざまなハンドをすべて事前に計算し、データベースに保存する必要があります。 133.784.560種類の7カードの組み合わせがあります。
次の形式を使用する必要があります(アルファベット順):
「2c2d2h2s3c3d3h」とランク付け
133.784.560の異なる組み合わせごとに保存します。 52C7 cicleを実行し、ランク付けしてデータベースに保存します。たぶん数日であなたはそれを準備しています。準備ができたら、21の組み合わせはもう必要ありません。手をアルファベット順にソートして、データベースで検索してください。
そうすれば、必要なときにいつでも対戦相手に対するオッズをリアルタイムで計算できることがわかります。
私を信じてください。私はプログラマーではないので、それを行うことができます。私はフロップで3秒でオッズを知っています。