En gros j’ai fais un solveur dans un but de recherche, je voulais comprendre comment ça fonctionne en interne et les principes mathématiques sous jacent. Du coup je me suis concentré exclusivement sur le backend, j’ai quand même fais une petite interface graphique rudimentaire pour tester des trucs plus facilement mais mon but n’était pas de faire un produit pouvant être mis en production.
Pour le créer, j’ai étudier et implémenter des variantes des techniques de « Counterfactual regret minimization » (CFR) (pleins d’articles très bien écrit sur le sujet en ligne), plus précisément je me suis focus sur CFR avec chance sampling càd que l’algo ne tente pas de faire converger la strat vers un équilibre de Nash sur tout l’arbre de décision à chaque itération mais plutôt sur des sous arbres. CFR avec chance sampling demande plus d’itérations pour converger mais chaque itération est plus rapide et l’algorithme est globalement plus performant.
J’ai créé une interface qui représente une variante d’un jeu de poker et en implémentant cette interface on peut résoudre différentes variantes, des toys games, short deck au classique Texas Hold’em. Mon programme de base solve une game à partir du préflop car j’étais short niveau temps, mais si je bossais dessus une journée supplémentaire je pourrais facilement permettre de définir des ranges préflop et un flop pour solve de là, car bien entendu il faut des serveurs et des machines super puissante pour solve le NLHE sans abstraction en partant du préflop.
Je suis capable de définir différents paramètres comme les stack size, la valeur des blindes, les sizings, en bidouillant un peu j’arrive aussi à faire des node lock. Plus on définis un grand nombre d’itérations et plus la simulation sera précise, j’ai remarqué que globalement le solveur converge assez vite vers une bonne approximation et qu’en suite tu peux passer beaucoup de temps à le faire tourner pour grapiller un peu d’ev par ci par là.
Je me suis amusé aussi à comparer mes résultats dans certaines situations avec les résultats de gto+ et gtowiz et mes résultats sont cohérant, de toute façon la convergence de l’algo vers un équilibre de nash est prouvée. Après encore par manque de temps, mon programme n’est pas super optimisé, un truc tout con mais j’ai pas eu le temps de faire du multithreading par exemple (peu être un jour). Pareil mon architecture peut grandement être amélioré et un gros refactoring du code s’impose, j’avais testé mon code mais comme j’avais déjà tout refactorer une première fois à la dernière minute je dois refaire des tests unitaires et des tests d’intégration.