Poker Code - Optimierungsmöglichkeiten?



  • Ich habe ein Poker Evaluator geschrieben und versuche nun dieses Programm zu optimieren.
    Ein voller Durchlauf (alle Möglichkeiten für 2 beliebige Starthände mit 5 beliebigen Gemeinschafskarten und 2 beliebigen Karten eines einzigen Gegners) benötigt 70h (reicht gerade so für eine erste Analyse, aber für weiteres ist das dann doch ziemlich lange, stets 70h auf das Ergebnis zu warten).

    Das Programm wurde mit XCode geschrieben, aber ich nutzte nur Standard-Befehle (da ich mich mit allem anderen nicht wirklich auskenne).

    ===

    Am Ende werde ich das ganze wohl mit Look-Up Tabellen machen (wie z.B. im 2+2 Forum beschrieben), aber im Moment muss ich erst mal die Grundlagen lernen.
    Daher meine Frage, was man an diesem Code optimieren könnte, dass er schneller wird ohne die grundlegnde Funktionsweise über den haufen zu werfen (das mache ich dann, wenn ich die Basics verstehe).

    Ich hatte ein ähnliches Programm schon mal in PHP versucht und dort durch verwendung von Array_Search und Array_Sort (statt eigener Funktionen mit Schleifen) einen Faktor 3 herausgeholt, durch das invertieren der Schleife (von X bis 0 statt wie üblich von 0 bis 😵 einen Faktor 2 bei den Sortierungen, da diese nun mehr oder weniger vorsortiert waren, etc...
    Solche Funktionen fand ich bei C++ nicht (weil es sie nicht gibt oder weil man keine weitere Zeit gewinnt?) und daher wollte ich mal hier fragen, ob noch jemand Optimierungsmöglichkeiten in dem Code sieht.

    Evtl wird jeder erfahrene Programmierer jetzt sagen "blöde frage, mach ..., ist doch logisch", aber für einen Neuling in C ist das halt leider nicht ganz so offensichtlich.

    http://buchty.com/_pokercalc3.txt





  • lapdancer schrieb:

    suchst du
    std::sort
    std::binary_search
    😕

    so in der art.
    std::sort habe ich per google auch gefunden,
    das versteht mein XCode aber nicht 😕

    aber vielleicht gibt es auch weitere prinzipielle tricks
    (i++ statt i+=1 hat ein bisschen gebracht, die messung der array länge aus den for schleifen herausnehmen brachte sehr viel, etc... anfänger-fehler, aber für den anfänger eben nicht offensichtlich)



  • Stormcastle schrieb:

    so in der art.
    std::sort habe ich per google auch gefunden,
    das versteht mein XCode aber nicht 😕

    was heißt "versteht nicht"? hast du <algorithm> inkludiert?
    das dürfte schon einiges an speed geben, quicksort ist schneller als dein bubblesort, binäre suche ist viel schneller als deine lineare suche. ausserdem ist das ganze zeug mit strings etc. in deinem code bestimmt auch langsam, das könnte man mit integralen werten lösen.



  • lapdancer schrieb:

    was heißt "versteht nicht"? hast du <algorithm> inkludiert?
    das dürfte schon einiges an speed geben, quicksort ist schneller als dein bubblesort, binäre suche ist viel schneller als deine lineare suche. ausserdem ist das ganze zeug mit strings etc. in deinem code bestimmt auch langsam, das könnte man mit integralen werten lösen.

    das mit "include <algorithm>" muss ich heute abend gleich mal testen. das habe ich in all den sort-seiten über google nicht gesehen.
    qsort und binäre suche habe ich auch nicht zum laufen gebracht (vielleicht der selbe fehler bezüglich algorithm...)
    die binäre suche kannte ich noch nicht, da muss ich mich mal einlesen.

    für die strings habe ich mich entschieden, da die rückmeldung immer unterschiedlich lang ist. mit zahlen würde das nicht gehen (B ist immer noch größer wie AA, 2 ist jedoch kleiner wie 11).
    zudem sind es 13 karten, da hätte 0-9 zahlen nicht gereicht, mit buchstaben A-M konnte ich es darstellen.

    aber der tip ist gut, dass ich mir da vielleicht etwas verbaue.
    ich könnte z.b. die werte im 13er-system zurückgeben, also 0-12 für die kartenwerte, dann mal 13^0 für die letzte karte, mal 13^1 für die zweitletzte ... und mal 13^4 für die erste karte der hand, das macht 371293 möglichkeiten, dann noch 1000000 addieren für high card, 2000000 für ein paar bis 8000000 für den vierling und 9000000 für straight flush / royal flush...
    dann kann man das ganze über longint übergeben...



  • Musst/Willst Du das unbedingt selbst schreiben?
    Falls nicht, sowas gibt es bereits:
    http://poker-stove.updatestar.com/de



  • Stormcastle schrieb:

    aber vielleicht gibt es auch weitere prinzipielle tricks
    (i++ statt i+=1 hat ein bisschen gebracht, die messung der array länge aus den for schleifen herausnehmen brachte sehr viel, etc... anfänger-fehler, aber für den anfänger eben nicht offensichtlich)

    Nein, das bringt nichts. Der Compiler kann einiges optimieren. Diese Dinge gehören dazu.

    Aber apropos Optimizer: Hast du Optimierungen angeschaltet? Ich kenne XCode nicht, aber irgendwo in den Compileroptionen kann man sicher Optimierungen anschalten. Das macht sicher etwa Faktor 2 aus ohne den Code zu ändern.



  • Belli schrieb:

    Musst/Willst Du das unbedingt selbst schreiben?

    Bei den ersten Versuchen sollten schon alles selbst geschrieben werden.
    Ich kenn das noch von damals auf der Uni... wenn man zu früh begann einfach die Lösungen vom Semester zuvor abzuschreiben (die man noch nicht wirklich verstand), kam meist nur Mist heraus, man war non-stop am herumfragen, wer beim debugging helfen könnte und am ende funktionierte es, man wusste aber immer noch nicht wie.

    Für Fremdlösungen gibt es zwei sehr geile Seiten, beide klingen im Moment noch nach Fachchinesisch (da gehe ich ran, wenn es in meinem programm nichts mehr zu optimieren gibt)
    http://forumserver.twoplustwo.com/45/software/7-card-hand-evaluators-597
    http://www.codingthewheel.com/archives/poker-hand-evaluator-roundup/



  • optimizer schrieb:

    Nein, das bringt nichts. Der Compiler kann einiges optimieren. Diese Dinge gehören dazu.

    oh, das wusste ich nicht. im PHP forum hatten sie mir empfohlen, das zu tun (meine ersten versuche dieses programms waren in PHP auch wenn das sehr langsam ging), ich hatte einfach mal angenommen, dass das für C auch gilt.

    optimizer schrieb:

    Aber apropos Optimizer: Hast du Optimierungen angeschaltet? Ich kenne XCode nicht, aber irgendwo in den Compileroptionen kann man sicher Optimierungen anschalten. Das macht sicher etwa Faktor 2 aus ohne den Code zu ändern.

    Diesen tipp hatte ich heute morgen auch bekommen, fand die einstellung in XCode aber nicht, da muss ich heute abend mal kräftig googeln.


Anmelden zum Antworten