40 votes

Évaluateur de main de poker à 7 cartes

Quelqu'un connaît-il un algorithme rapide pour évaluer les mains de poker à 7 cartes ? Quelque chose qui soit plus efficace que la simple vérification par force brute de toutes les 21 combinaisons de mains à 5 cartes d'un ensemble de 7.

A la vôtre,

Pete

0 votes

Bonne question, mais je pense que vous feriez mieux de vérifier les 21 combinaisons au lieu d'essayer de trouver un truc fou pour raccourcir.

8 votes

David En fait, rien n'est plus éloigné de la vérité. Les gens ont fait beaucoup d'efforts pour écrire des évaluateurs rapides de 7 cartes. Lorsque vous voulez faire des millions de mains par seconde, la vitesse devient importante.

0 votes

David : Il existe de bien meilleures méthodes, plus faciles à lire et ne nécessitant AUCUN tri. Elles sont également plus rapides de plusieurs ordres de grandeur. Un exemple est - ahem - trouvé ici : code.google.com/p/specialkpokereval .

32voto

Subskybox Points 141

J'en ai écrit un dans JavaScript . La méthode d'évaluation de base n'utilise que des manipulations de bits et est donc extrêmement rapide. Dans cette optique, l'examen de 21 combinaisons est toujours très rapide. Le seul moment où nous devons aller plus loin, c'est en cas d'égalité. Dans ce cas, nous devons regarder plus en détail pour voir quelle main de 5 cartes est réellement la meilleure. Voici la solution que j'ai trouvée :

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],  [ _[""], _[""], _[""], _[""], _[""] ] ); 

Explication ici
Démonstration ici

0 votes

Beaucoup d'efforts pour ce projet ! +1 :)

0 votes

C'est un sorcier ! Article génial.

4 votes

Il y a un bogue dans ce code - si vous avez une quinte avec un As comme carte basse (par exemple A 2 3 4 5 6 K ), il choisit incorrectement la carte de l'As. inférieur droit. Dans cet exemple, la quinte par 6 devrait être la meilleure. En effet, elle donne plus de poids à l'As, mais dans ce cas, ce n'est pas la quinte haute qui est la meilleure, mais la quinte basse. imgur.com/a/e9wGR

14voto

Greg Bray Points 3352

Ce site répertorie un certain nombre de Bibliothèque d'évaluation des mains de poker et donne quelques détails sur chacun d'eux. La plupart d'entre elles concernent des mains à 5 cartes, mais il y en a au moins une pour une main à 7 cartes appelée L'évaluateur Snezee7 . De plus, le site donne un excellent aperçu des différentes techniques et algorithmes utilisés pour analyser rapidement les mains de poker.

J'ai utilisé le portage C# de Keith Rule de l'évaluateur Pokersource dans plusieurs contextes différents. projets de poker et pense que c'est une excellente bibliothèque. Il existe de nombreux trucs astucieux que vous pouvez utiliser pour créer des évaluateurs manuels très rapides, mais l'écriture du code représente beaucoup de travail et je vous conseille vivement d'utiliser une bibliothèque existante.

0 votes

Notez que Snezee7 nécessite une table de consultation de 266 Mo.

2 votes

C'est vrai... mais c'est ainsi que l'on obtient un évaluateur de main rapide (beaucoup de pré-calculs). L'évaluateur Two Plus Two utilise une approche similaire pour évaluer les mains à 7 cartes en utilisant une table de consultation de 123 Mo. Pour les mains à 5 cartes, les tables de consultation sont beaucoup plus petites.

0 votes

Shameless Plug - Bien qu'il ne soit pas aussi rapide que certains des systèmes ci-dessus, j'en ai un qui fait ~70 millions de mains/s sans utiliser de tables : github.com/ashelly/ACE_eval .

8voto

SK9 Points 9683

Heureux que vous demandiez :) Oui, voici une toute nouvelle solution qui pourrait bien être la bonne :

Code : http://code.google.com/p/specialkpokereval/
Blog : http://specialk-coding.blogspot.com/2010/04/texas-holdem-7-card-evaluator_23.html

Une évolution commerciale de cet évaluateur est disponible pour l'iPhone/iPod Touch via l'iTunes Store. Elle s'appelle " Poker Ace ".

Un excellent résumé des différentes solutions, accompagné de liens, se trouve sur le blog de James Devlin, intitulé " Codage de la roue ".

Un évaluateur dont on n'a pas encore parlé est Klaatu's .

Bonne chance !

0 votes

J'ai ajouté votre évaluateur à mon rassemblement . J'apprécierais tout commentaire.

1 votes

@AShelly Votre évaluateur ACE est assez incroyable. Je rêve de le porter sur GPU depuis des années... mais malheureusement, je ne joue plus au poker !

2voto

MGB Points 21

Je pense que vous devriez faire les 21 combinaisons et utiliser une sorte de table 7462. 1er : chaque 7 cartes a 21 combinaisons différentes de 5 cartes. 2ème : chaque main finale possible (2.598.960) représente un des 7462 types de mains différents. donc, c'est facile.

Il vous suffit de regarder toutes les 21 combinaisons de vos cartes et, pour chacune d'entre elles, de voir le classement de la table 7462. http://www.sendspace.com/file/pet0dd

Ensuite, pour chaque 7 cartes, vous aurez 21 classements différents à partir de ce tableau de 7462 que j'ai fait. Le classement le plus élevé des 21 combinaisons est celui que vous voulez connaître.

Pour comprendre le tableau : Dans chaque ligne, vous avez la main de 5 cartes (Z pour convenable, Y non convenable) et vous avez le classement de celle-ci. C'est tout ce dont vous avez besoin. Je vous donne le tableau et un exemple d'algorithme. Ce n'est pas vraiment le code. C'est un format Visual Basic et je l'ai écrit maintenant. Ça ne marche probablement pas mais vous devriez comprendre. Le code serait quelque chose comme ça :

'############### 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

Le classement final est la variable myranking. Vous devriez connaître votre main en moins d'une seconde. Et il est également bon de comparer avec d'autres mains, car vous avez la valeur du classement et non son nom. Et si vous voulez faire quelque chose avec les algorithmes de poker, c'est par là que vous devriez commencer. Avec les valeurs de classement, tout est rapide et facile.

Note : Je ne suis pas un programmeur. Je suis un futur programmeur. Je comprends quelques fonctions de base visuelles. J'aimerais savoir comment faire de vrais programmes. Si l'algorithme fonctionne, merci de laisser un commentaire. Si vous voulez qu'il soit très très rapide, je ne sais pas comment faire. J'aimerais avoir un algorithme ultra rapide qui me permette de vérifier (en temps réel) mes chances contre n'importe quel adversaire à chaque étape du jeu. J'ai essayé plusieurs algorithmes pour calculer mes chances au flop en temps réel mais le plus rapide que je puisse faire est de 30 secondes. Maintenant, je peux calculer mes chances au flop en 3 secondes mais j'utilise une base de données de 150 gigaoctets avec beaucoup de choses pré-calculées. Si vous voulez connaître vos chances en temps réel, vous devez avoir beaucoup de choses pré-calculées. C'est comme ça que j'ai fait.

0voto

MGB Points 21

Bien sûr, si vous voulez le faire très rapidement. L'algorithme que j'ai mis avant est trop lent.

Le tableau 7462 devrait être dans un tableau, pas dans un fichier.

Ensuite, vous devez précalculer toutes les différentes mains de 7 cartes et les stocker dans une base de données. Il y a 133.784.560 combinaisons de 7 cartes différentes.

Vous devez utiliser ce format (ordre alphabétique) :

"2c2d2h2s3c3d3h" et le classer

Stocker toutes les 133.784.560 combinaisons différentes. Tu fais 52C7 cicles, tu les classes et tu les stockes dans une base de données. Peut-être que dans quelques jours, il sera prêt. Quand vous l'avez prêt, vous n'avez plus besoin de 21 combinaisons, il suffit de mettre votre main classée par ordre alphabétique et de la chercher dans votre base de données.

Si vous faites cela, vous verrez que vous pouvez calculer vos chances contre vos adversaires en temps réel, quand vous le souhaitez.

Croyez-moi. Je ne suis pas un programmeur et je peux le faire. Je connais mes chances au flop en 3 secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X