Schnelles Iterieren über bestimmte Bitfolge?


  • Mod

    Um mal zu fragen, was das Ziel ist: Ich habe gerade mal ganz naiv einen Brute-Forcer implementiert. Sicherlich noch sehr verbesserungsfähig bei der Handevaluierung und ganz ohne irgendwelche Tricks. Gegeben 4 Karten rechnet dieser die Präflopgewinnwahrscheinlichkeit für beide Spieler in rund 0.5 CPU-Sekunden auf einem i7 exakt aus. Wie viel schneller soll es noch sein und warum sind 0,5 Sekunden zu langsam?

    edit: Ach, du willst 32x32 Kombinationen testen. Das wäre wirklich ein bisschen langsam, sofern die Berechnung "live" erfolgen soll. (Was wird das denn dann? Alle möglichen Kombinationen von Starthänden sind doch sicherlich lange schon durchgerechnet tabelliert. Und ich verstehe nicht, wofür man das Ergebnis von 32x32 Händen sofort braucht)



  • Na ja, 32x32 wäre nicht Mal unbedingt nötig. Aber definitiv 16x16. Und 16 ist ja nur eine Hand, nämlich jede nicht-gepaarte wie AK, denn hierfür gibt es 16 Kombinationen.

    Das Programm soll Live-Berechnungen machen wie die herkömmlichen Programme. Ich will aber darauf aufbauend noch grafische Geschichten machen und einen Excel-Befehl einbinden usw. usf.



  • Okay, ich habe mir Mal ein paar Tabellen gemacht, welche Hand gg welche andere Hand welche Redraw-Chancen etc. hat.

    Fest steht leider so gut wie gar nichts. Str8flush gewinnt immer gegen Quads, das steht fest. Aber Str8flush gewinnt nicht Mal zwangsläufig gegen ein einzelnes Paar, da dieses Redrawchancen auf einen höheren Str8flush haben könnte... mit vielen Bedingungen lassen sich dann ein paar Fälle finden, die man mit einer Vorabfrage ausschließen könnte.

    Aber: diese Vorabfragen kosten Zeit und man spart zu selten etwas ein, als dass die gut wären.

    Mir ist jetzt aber eine andere Optimierung eingefallen: Wenn ich Spieler1 und 2 jeweils nur eine Kombination gebe, ist mein Programm ja schnell genug (wenn auch bei Weitem nicht so schnell wie Pokerstove oder Konsorten -.-). Mein Problem war ja, dass ich bei AK gegen QJ z.B. 16x16 Kombinationen habe. Aber da gibt es dann tatsächlich viele Äquivalente, also kann ich da schon Mal sehr viel einfach rauskicken.

    Ich schaue Mal, wie viel ich damit einsparen kann...



  • Ich hab zwar überhaupt keine Ahnung von Poker aber wenn die Spiele die du durchprobieren willst unabhängig voneinander sind kannst du parallelisieren. Mein Tip mit OpenCL war nicht wirklich als Scherz gemeint. Selbst mit einfachem Multithreading kannst du auf nem Dual Core dann wohl schon annähernd 100% rausholen...



  • dot schrieb:

    Ich hab zwar überhaupt keine Ahnung von Poker aber wenn die Spiele die du durchprobieren willst unabhängig voneinander sind kannst du parallelisieren. Mein Tip mit OpenCL war nicht wirklich als Scherz gemeint. Selbst mit einfachem Multithreading kannst du auf nem Dual Core dann wohl schon annähernd 100% rausholen...

    Das Bruteforcen, was er vorhat, ist ein Musterbeispiel für parallelisierbare for-schleifen 😉



  • Eben, denk ich mir...



  • Ja, das mit der Parallelisierung hatte ich auch schon im Kopf, danke. 🙂 Werde das nachher definitiv noch einbauen. Aber damit verbessere ich die Laufzeit ja auch nur um das Doppelte beim Dualcore oder um das Vierfache beim Quadcore. Das bringt mir also nicht viele Dimensionen an Performance-Verbesserung.



  • OpenCL/DirectCompute/CUDA. Damit kannst du um das 20 - 100 fache verbessern (vorausgesetzt deine Grafikkarte gibt was her)...



  • Oh... ich wusste nicht, dass die Grafikkarte so gut ist. Aber wie kann die Grafikkarte einen so viel stärkeren Prozessor als die CPU haben?

    Übrigens kann man die 16x16 Abfragen auf 15 reduzieren, denn so viele Gruppen gibt es. Bei Bedarf lade ich Mal das Excel hoch. 😉



  • Die Grafikkarte hat keinen stärkeren Prozessor sondern einen anderen. Genauer: Gaaaaanz viele kleine und dumme Prozessoren (ne GTX 580 hat 512 Cores). Wenns um Numbercrunching geht hat da keine CPU der Welt ne Chance (eine NVIDIA Tesla liefert 1TFLOP Peak Performance). Aber das ist dann auch schon wieder alles was das Ding kann. Ist eben eine hoch spezialisierte Architektur...



  • Das klingt super. Wenn ich noch mehr Performance brauche, schaue ich mir das dann definitiv Mal an, danke. 🙂

    Ich bin mit meiner 16x16 -> 15 Kombination jetzt allerdings genau so schnell wie Pokerstove. Die haben wohl auch keinen anderen Trick angewandt. 😉 Jetzt könnte ich also noch schneller werden, wenn ich wollte.



  • Eisflamme schrieb:

    Das klingt super. Wenn ich noch mehr Performance brauche, schaue ich mir das dann definitiv Mal an, danke. 🙂

    Ich bin mit meiner 16x16 -> 15 Kombination jetzt allerdings genau so schnell wie Pokerstove. Die haben wohl auch keinen anderen Trick angewandt. 😉 Jetzt könnte ich also noch schneller werden, wenn ich wollte.

    Ich frag mich die ganze Zeit, wie ihr auf 16 Kombinationen kommt?

    2-A sind 13 Karten, macht also 13x12 unpaired off-suit kombinationen, 13x12 suited kombinationen und 13 pairs, die ein Spieler auf der Hand haben kann.



  • Ich meinte 16 Kombinationen pro Hand. Wenn der Benutzer A-K eingibt (also Ass-König), dann gibt es 4 Karten für das Ass und 4 für den König, also 16. Und eine übliche Abfrage ist, dass ein Benutzer für Spieler 1 AK und für Spieler 2 QJ oder so eingibt. Und die will ich ja optimieren. 🙂



  • Eisflamme schrieb:

    Ich meinte 16 Kombinationen pro Hand. Wenn der Benutzer A-K eingibt (also Ass-König), dann gibt es 4 Karten für das Ass und 4 für den König, also 16. Und eine übliche Abfrage ist, dass ein Benutzer für Spieler 1 AK und für Spieler 2 QJ oder so eingibt. Und die will ich ja optimieren. 🙂

    Das sind dann 12 off-suit kombinationen und 4 suited Kombinationen, die für sich gesehen schon verschiedene Gewinnwahrscheinlichkeiten haben.
    Je nachdem ob der Gegner dann auch eine der Farben hält verschieben sich die Wahrscheinlichkeiten weiter. So einfach ist das leider nicht 😞



  • Deswegen gibt es ja 16x16 Möglichkeiten. 16 für Spieler 1, 16 für Spieler 2.

    Für den Fall, dass die Kartenwerte (A,K,Q,J) zumindest disjunkt sind, habe ich Mal eine Tabelle gemacht. Und in dieser lässt sich sehen, dass wir 16x16 bereits auf 15 Gruppen reduzieren können:
    http://mihahome.de/groups.JPG

    Die Farben habe ich mehrfach verwendet. Sie sind pro Bereich (der von einem anderen Bereich durch weiße Zellen getrennt ist, sodass es vier Bereiche gibt) aber eindeutig.

    Bei Kartenübereinstimmungen sind natürlich andere Gruppen zu unterscheiden. Aber das kriegt man mit etwas Arbeit schnell hin. 🙂



  • ah okay, jetzt versteh ich... dann kommen jetzt "nurnoch" tausende anderer solcher Tabellen? ;o)



  • Die Tabelle sieht mir jetzt auch nicht wirklich relgemäßig aus.



  • otze schrieb:

    Die Tabelle sieht mir jetzt auch nicht wirklich relgemäßig aus.

    Darum gehts nicht. Es geht nur drum, dass er z.B. wenn beide Spieler ausschließlich Pik auf der Hand haben die gleichen Equities hat wie wenn beide Spieler ausschließlich Herz oder ausschließlich Karos haben etc. (das sind die vier roten kästchen oben links). Genauso sind die Equities gleich, wenn die 4 Karten der beiden Spieler 4 unterschiedliche Farben haben, egal ob das As von Spieler 1 jetzt Pik oder Herz oder Karo ist (die hellgrünen Kästchen unten rechts)



  • Regelmäßig hin oder her. Alles mit gleicher Farbe hat die gleiche Equity, es ist nicht wirklich kompliziert.

    Und ich brauche kaum noch solche Tabellen. Es gibt halt den Fall, dass beide Karten unterschiedlich sind und dass eine der Karten mit der anderen übereinstimmt. Wenn beide gleich sind, ist die Equity eh 50% und wenn man bestimmte Kombinationen gegeneinanderlaufen lässt (also AK in herz und AK in herz,kreuz), greift ja meine Gruppierungs-Sache nicht.

    So, was bleibt noch übrig? Paare, die man auf der Hand hält. Da gibt es jetzt noch weniger, weil Paare erstmal nur 6 Kombinationen haben. Jetzt hat man wiederum nur zwei Tabellen. Eine, wo das Paar eine der Karten teilt (AK vs AA z.B.) und eine, wo das nicht der Fall ist.

    Insgesamt also vier Tabellen, das ist doch total überschaubar.



  • Eisflamme schrieb:

    Insgesamt also vier Tabellen, das ist doch total überschaubar.

    Ich sehe mehr:

    1. unpaired unmatched, d.h. 4 verschiedene Werte (wie oben)

    2. unpaired matched, d.h. 3 verschiedene Werte, z.B. AK, AQ

    3. unpaired double matched, d.h. 2 verschiedene Werte, z.B. AK, AK.

    4. paired unmatched, z.B. AA, QK

    5. paired matched, z.B. AA, AK

    6. double paired unmatched, z.B. AA, KK

    7. double paired matched, z.B. AA, AA

    8. hast du schon.

    9. ist auch relativ kompliziert, und zwar eine 16x12 Tabelle (die gematchte Karte von Spieler 2 kann nicht die gleiche Farbe wie die von Spieler 1 haben, daher für das A jeweils nur 3 Möglichkeiten)

    10. 16x9-Tabelle, mit relativ wenig verschiedenen Equities (6?)

    11. 4x16-Tabelle (4 Equities?)

    12. 4x8-Tabelle (3 Equities?)

    13. 4x4-Tabelle (3 Equities?)

    14. Equity = 1:1, nicht wirklich ne Tabelle...


Anmelden zum Antworten