Home    About me    Publications    Blog    Undergrad memories

Fabio Ruini’s blog

Because Italians do it better! What the f**k? Ehm… the blogs, I mean… obviously! :-/

Riflessioni su un software in grado di giocare a poker…

E’ ormai da diverso tempo che mi bazzica per la testa l’idea di scrivere un software in grado di giocare a poker. Ovviamente, il mio target è il No Limit Texas Hold’Em. La mia variante preferita, nonchè quella ad oggi più diffusa, anche perchè utilizzata per il main event del World Poker Tour. Alias, il campionato del mondo di poker.

Poker - robot vs human

Una delle domande sulle quali mi sto dibattendo senza successo da diverso tempo riguarda il come scrivere un algoritmo in grado di gestire in maniera corretta le chiamate dopo il flop. Nel pre-flop, infatti, il meccanismo di betting è abbastanza standardizzato e facilmente replicabile in un algoritmo. In genere, le puntate vengono espresse in termini di multipli del big blind e variano nel range 2BB-6BB (per poi ridursi man mano, con il crescere dei buii). Vi sono talvolta delle puntate grosse, generalmente all-in, che data la loro rarità e la scarsità di informazioni disponibili nel momento in cui vengono effettuate, possono comunque essere trattate come eccezioni e gestite pertanto in maniera estremamente specifica, con codice scritto ad-hoc.

Ovviamente, anche nel pre-flop sono moltissimi i parametri da tenere in considerazione. Un algoritmo che gestisca il primo round di puntate deve infatti agire in funzione della propria posizione al tavolo, del proprio e degli altrui stacks, del livello dei buii, delle precedenti puntate già effettuate, del numero e dello stile degli avversari che ancora devono parlare. Credo tuttavia che utilizzando un approccio ben formalizzato (prendendo ispirazione, ad esempio, da quanto teorizzato da Dan Harrington), il compito sia fattibile. Allo stesso modo credo sia importante che lo schema di riferimento utilizzato sia tendenzialmente tight, in maniera da semplificare il più possibile le decisioni da prendere dopo il flop.

Perchè il problema arriva appunto dopo il flop. Qui, lo stile e la teoria se ne vanno spesso e volentieri a farsi fottere. Logica vuole che le puntate si trasformino durante questa fase in sotto-multipli del pot. Ma non sono rari i casi (dovessi azzardare una percentuale, direi almeno un 15/20% del totale) in cui le puntate pareggiano o superano abbondantemente il pot. Forse è un limite del sottoscritto, ma io non uso (e dunque non so identificare) una regola precisa per giocare dopo il flop. Di volta in volta decido, sulla base della conoscenza dei giocatori che sono attivi, se la mia mano è la più forte in circolazione oppure no. Molto più frequentemente mi trovo a sperare che lo sia, senza tuttavia averne la certezza matematica. Questo, tra parentesi, è a mio avviso il momento in cui emerge il tilt mentale del giocatore di poker (esattamente quello, pesantissimo, che sto attraversando io in questi giorni). Un giocatore in tilt tende a sovrastimare le probabilità di vittoria della sua mano. Ed è così portato a perdere ancora più frequentemente di prima. Se a questo, poi, si aggiunge pure un po’ di sfortuna (tanto per dirne una, in uno dei miei soliti sit&go di ieri sera, nel giro di 20 mani mi sono trovato contro, in heads-up, due four of a kinds: mi sono salvato nel primo caso, mi sono rovinato nel secondo avendo indovinato la scala che stavo cercando al river), la frittata è fatta. Ed uscirne è una tragedia. Ma parlavamo di algoritmi. Finchè le puntate post-flop sono “standard”, il compito di un software è relativamente facile. Schematizzando un po’ brutalmente, riassumerei le situazioni che possono verificarsi dopo il flop in cinque categorie principali:

  1. non si è azzeccato niente, si è in tanti ed il flop contiene delle overcards rispetto alle proprie. E’ meglio foldare senza pensarci su troppo. La logica vuole che si bluffino i pochi, mai i molti;
  2. non si è beccato niente, ma si è in pochi (due, massimo tre giocatori) ed il flop è stato difficilmente indovinato dagli avversari (tipicamente perchè contiene carte basse, oppure solo una figura). Si può provare ad aggiudicarsi il pot con una continuation bet, magari raisando una analoga puntata da parte di un avversario;
  3. non si è beccato niente, ma vi è la possibilità di azzeccare qualcosa con le carte successive. Si può valutare la situazione calcolando le odds e decidendo di conseguenza se vale la pena o meno di giocare. In questo caso non è troppo importante il numero degli avversari, siccome possono esserci vantaggi sia che essi siano pochi, sia che invece siano molti. Il problema consiste semmai nel calcolo delle odds. Per un computer, calcolare le explicit odds è di una semplicità, nonchè di una velocità, disarmante. Più difficile, molto più difficile, calcolare quelle implicite. Talvolta può infatti essere conveniente fare una chiamata senza avere le necessarie odds esplicite se si ritiene che quelle implicite (ossia le chips che entreranno nel caso in cui si colpisca il bersaglio grosso) siano in grado di ricompensare il rischio affrontato;
  4. si è girato un mostro. Questa è la situazione più divertente e si può decidere a seconda dell’umore se giocarlo slow, da valore reale o in maniera forte;
  5. si è colpito qualcosa, ma questo non è necessariamente il punto più forte in circolazione (possibilità di scala/colore, coppia con kicker che non è un asso, possibilità di tris, coppia non-top, ecc…). Che fare? Dipende…

Neanche a farlo apposta, la situazione più frequente è anche la più difficile da gestire. Si tratta oviamente della numero 5. Il poker è un gioco di informazione. Che quando non è disponibile, come in questo caso, dev’essere andata a cercare. Quando non sono sicuro della posizione della mia mano, io sono solito osservare la situazione, oppure, se tocca a me parlare per primo, fare una cosiddetta probe bet. Una puntata di entità sufficiente (da 1/3 ad un 1/2 del pot) per far foldare chi non ha azzeccato niente (è importante per questo che l’importo non sia troppo basso, anche per non far apparire la puntata come sand-bagging ed incentivare così un call da parte degli avversari che potrebbe essere confuso per forza reale quando invece non lo è), lasciando in gioco soltanto chi, eventualmente, ha un bel punto. Se ricevo una call o un raise ed io non ho la top-pair in mano, in genere lascio andare la mano alla puntata successiva. Altrimenti, in altre condizioni, decido in un maniera diversa e non-standard, seguendo perlopiù l’ispirazione del momento.

Il problema, più in generale, è quello di stabilire, in un dato momento, se la propria mano si trova “davanti o dietro” rispetto a quella degli avversari attivi. Un software, così come d’altronde accade anche i per giocatori professionisti, non deve necessariamente essere in grado di stimare questa informazione mancante con il 100% di accuratezza. Un certo margine di errore è accettabile. E finchè le puntate effettuate dagli avversari sono di entità modesta, tale margine di errore non costituisce un problema serio. Lo costituisce, però, nel caso in cui le puntate a cui rispondere siano pesanti e mettano a rischio, in parte o integralmente, lo stack del giocatore/software. In tali circostanze, l’accuratezza della stima deve essere la massima possibile. Anche perchè un margine di errore troppo elevato dovrebbe far propendere il software verso un approccio conservativo: foldare ad ogni puntata grossa, quando si ha in mano un buon punto che però non è necessariamente il migliore in tavola. Il che costituirebbe un punto debole troppo facilmente exploitabile: il software potrebbe essere “bulleggiato” in tutta tranquillità.

A mio avviso, la risposta di un software alle puntate post-flop dovrebbe basarsi in maniera esclusiva su una rappresentazione della mano dell’avversario. Una rappresentazione che sia però dinamica, creata durante il pre-flop e funzione della storia passata, ma in grado di modificarsi (non troppo, altrimenti sarebbe perennemente a rischio bluff) nei round successivi sulla base della dinamica delle puntate. La rappresentazione beneficerebbe non poco di una preventiva categorizzazione dei giocatori seduti al tavolo (magari in una delle varie categorie delineate da Vorhaus), cosa per la quale una rete neurale potrebbe essere perfettamente adeguata (pur considerando il problema della categorizzazione in un contesto con così poche osservazioni a disposizione: nel poker, i giocatori sono costretti a categorizzare i propri avversari con un singolo data point a disposizione). Quale strumento utilizzare per rappresentare le mani è invece un problema al quale non so al momento trovare una risposta. Mi viene naturale pensare a qualche sistema Fuzzy, ma la mia pressochè nulla esperienza nel campo mi lascia con il vuoto in testa. Ma voglio trovare una risposta. Almeno in linea teorica. Quindi, cari lettori, preparatevi ad altri filosofeggiamenti del genere in futuro. I quali, purtroppo per voi, mi sono necessari per fissare un po’ le idee che in maniera troppo anarchica mi fluttuano per la mente.

Commenti

  1. fungo
    febbraio 24th, 2008 | 14:32

    c’è da fidarsi però ti un tuo programma visti i risultati recenti? LOL :-D

  2. febbraio 24th, 2008 | 14:54

    Beh, serve appunto per eliminare il fattore umano… cioè io… :-p

Lascia un commento