Algorithmus zur Berechnung der Handstärke

    • jayjay
      jayjay
      Bronze
      Dabei seit: 23.01.2005 Beiträge: 1.114
      kennt jemand einen algorithmus um pokerhände möglichst effektiv zu berechnen, dh. unter einer bestimmten anzahl von karten herausfinden was man hält? (zb. top pair, set, draw auf flush oder straight usw.) darüber hinaus sollte so wenig speicher wie möglich in anspruch genommen werden um die karten abzulegen, da eine grosse anzahl von händen im RAM liegen bleiben soll.
      Hab zwar schon ein paar ansätze, die mich allerdings nicht wirklich zufriedenstellen.

      um eines vorwegzunehmen: ich hab nicht vor irgendwelche illegalen programme zu schreiben sondern will mir lediglich einen vernünftigen hand-'reviewer' in den kommenden monaten/jahren :) basteln. falls jemand eine vergleichbare software kennt, kann mir den namen auch nennen, dann kann ich mir villeicht eine menge arbeitszeit ersparen.

      edit: grammatik usw.
  • 6 Antworten
    • DonBlech
      DonBlech
      Bronze
      Dabei seit: 21.09.2005 Beiträge: 2.182
      Original von jayjay
      kennt jemand einen algorithmus um pokerhände möglichst effektiv zu berechnen, dh. unter einer bestimmten anzahl von karten herausfinden was man hält? (zb. top pair, set, draw auf flush oder straight usw.)
      Wo ist das Problem? Du legst die möglichen Ergebnisse fest, also:
      RF, SF, foak, FH, toak, 2Pair ... usw.
      Solange Du weniger als 6 Karten zu reviewen hast, prüfst Du gegen diese Möglichkeiten.
      Bei 6 - 7 Karten, also auf Turn und River, stellst Du durch eine rekursive Funktion alle möglichen 5Kartenkombinationen her und bewertest diese alle wie oben.

      Gruß,

      Don
    • Temar
      Temar
      Bronze
      Dabei seit: 14.07.2006 Beiträge: 536
      Original von jayjay

      kennt jemand einen algorithmus um pokerhände möglichst effektiv zu berechnen, dh. unter einer bestimmten anzahl von karten herausfinden was man hält?
      Hmm, du willst wissen wie gut deine Hand im Vergleich zu denen deiner Gegner ist, oder? Weil deine eigene Handstärke kannst du ja ganz leicht abschätzen.

      Das kannst du allerdings nur mit vorberechneten Erwartungswerten erreichen, denn sobald du mehr als vier Gegner hast ist das nicht mehr wirklich berechenbar. Hier ein Zitat aus Wikipedia:

      http://en.wikipedia.org/wiki/Poker_probability_(Texas_hold_'em)

      An exhaustive analysis of all of the match ups in Texas Hold 'em of a player against nine opponents requires evaluating each possible board for each distinct starting hand against each possible combination of hands held by nine opponents, which is

      169 * bincoeff(50, 18) * 17!! * bincoeff(32, 5) = 2.117 * 10e28

      If you were able to evaluate one trillion (1012) combinations every second, it would take over 670 million years to evaluate all of the hand/board combinations. While it is possible to significantly reduce the total number of combinations by pruning combinations with identical properties, the total number of situations is still well beyond the number that can be evaluated by brute force. For this reason, most software programs compute probabilities and expected values for Hold 'em poker hands against multiple opponents by simulating the play of thousands or even millions of hands to determine statistical probabilities.
      Gruss,
      Alex
    • Temar
      Temar
      Bronze
      Dabei seit: 14.07.2006 Beiträge: 536
      War gerade am lesen des Artikels "Pre-flop: Fundamental Concepts". In diesem ist eine Tabelle mit den Erwartungswerten verlinkt:

      http://www.pokerroom.com/games/evstats/totalStats.php?order=card

      Vielleicht hilft dir das weiter.

      Gruss,
      Alex
    • jayjay
      jayjay
      Bronze
      Dabei seit: 23.01.2005 Beiträge: 1.114
      also ich will keinen evaluator schreiben der wie pokerstove die wahrscheinlichkeiten berechnet, sondern einen hand-'reviewer' der es mir ermöglicht eine angegebene session (oder beliebige HH) nochmal anzusehen und, falls gewünscht, bestimmte spielsituationen rausfiltert. (zum beispiel will ich mir nur solche hände nochmal ansehen wo ich am flop ein oesd hatte + 2 overcards, oder nur die hände wo ich top pair oder besser habe oä.)
      dazu werden die gewünschten hände nacheinander durch"gesehen" ob sie die gewünschten kriterien erfüllt. und genau hier will ich wissen ob jemand ahnung hat in welchem format man die karten am besten im pc ablegt und wie man das ganze so effektiv wie möglich berechnen kann. für jedes kriterium eine formel schreiben die dann überprüft wird ist klar.
      aber wie überprüft man am schnellsten (dh. am wenigsten rechenarbeit) ob aus 5 oder 6 karten ein oesd/flush/tptk/.. vorhanden ist. beispielsweise könnte man die karten in eine 13x4 matrix schreiben, wobei die 13 zeilen einen kartenwert darstellen und die spalten die farbe. einen flush erkennt man dann daran ob die summe einer der vier spalten höher als 4 ist. für eine straight wäre eine andere methode schneller (zuviel tipparbeit).
      daher meine frage: kennt jemand eine (die) ultimative lösung für dieses problem?
    • Caius
      Caius
      Bronze
      Dabei seit: 02.03.2005 Beiträge: 205
      Wenn Du es speicherschonend machen möchtest, nimm char oder int(1..52). Die Farbe einer Karte berechnest Du mit div13, das value mit mod13. Ansonsten wie schon beschrieben Permutationen bilden und auf Handvalue überprüfen.

      Beste Grüße.
    • Temar
      Temar
      Bronze
      Dabei seit: 14.07.2006 Beiträge: 536
      Original von jayjay
      hier will ich wissen ob jemand ahnung hat in welchem format man die karten am besten im pc ablegt und wie man das ganze so effektiv wie möglich berechnen kann.
      Ablegen würde ich das ganze in einer SQL Datenbank, damit du hinterher möglichst schnell die Karten rausziehen kannst, die auf deine Kriterien treffen - z.B. eine Hand mit mindestens einem Ass als PocketPair und Gutshot Straight Draw. Ob eine Hand ein Draw ist (und welche Art von Draw) musst du halt vorher berechnen (wenn du den Eintrag in der DB anlegst) und als Flag markieren. Dann kannst du dir sofort alle Hände anzeigen lassen, bei denen du z.B. einen Flush-Draw hattest. Das evaluieren aller Hände pro Anfrage halte ich für zu aufwendig.

      Deine Methoden zum evaluieren der einzelnen Hände solltest du hier mal posten, dann kann man darüber diskutieren und Verbesserungsvorschläge machen. Bei Flushs hätte ich z.B. einfach die Farben gezählt anstatt erst eine doch recht speicherintensive Matrix anzulegen. Straigt Draws würde ich aufsteigend sortieren und dann den Abstand zwischen zwei Karten messen.

      Aber poste doch mal deine geplanten Algorithmen. Vielleicht hat der ein oder andere weitere Verbesserungsvorschläge.

      Gruss,
      Alex