Gioco della briscola: calcolo delle probabilità
Ciao a tutti, sono appena arrivato.
Nel preparare un esame all'università, devo implementare l'AI (intelligenza artificiale) di un giocatore artificiale (computer) al gioco della briscola (uno contro uno) all'interno di un programma scritto in linguaggio C.
Al che necessito di conoscere la probabilità che nelle 3 carte in mano all'avversario ci sia ALMENO una briscola.
Al fine di impostare il problema, i dati che ho disponibili sono:
1- Numero delle restanti carte nel mazzo + la briscola (che è visibile ad entrambi i player)
2- Numero delle briscole in mano al giocatore artificiale (computer)
3- Memoria delle carte uscite (e quindi eventuali briscole già giocate in mani precedenti).
Spero possiate fornirmi qualche suggerimento.
Nella speranza, porgo cordiali saluti a tutti. Ciao
Nel preparare un esame all'università, devo implementare l'AI (intelligenza artificiale) di un giocatore artificiale (computer) al gioco della briscola (uno contro uno) all'interno di un programma scritto in linguaggio C.
Al che necessito di conoscere la probabilità che nelle 3 carte in mano all'avversario ci sia ALMENO una briscola.
Al fine di impostare il problema, i dati che ho disponibili sono:
1- Numero delle restanti carte nel mazzo + la briscola (che è visibile ad entrambi i player)
2- Numero delle briscole in mano al giocatore artificiale (computer)
3- Memoria delle carte uscite (e quindi eventuali briscole già giocate in mani precedenti).
Spero possiate fornirmi qualche suggerimento.
Nella speranza, porgo cordiali saluti a tutti. Ciao
Risposte
Carino questo programmino, poi postalo così ci gioco.
Io farei così.
Abbiamo 40 carte: di queste 3 sono scoperte del computer, 3 coprente del giocatore, 2k scoperte che sono state giocate, 1 scoperta che e' la briscola ed le restanti 40-3-3-1-2k=33-2k che sono nel mazzo coperte.
k varia tra 0 nel caso incui non e' stata giocata una mano fino a (fatti i conti dove) in maniera che siano rimaste la briscola scoperta ed una carta coperta (prima della pescata). Una volta finite le carte da pescare e i due giocatori sono rimasti con le 3 carte ciascuno se c'è memoria delle carte uscite tutti e due sanno le carte dell'altro.
Fatto questo introduco le due variabili x ed y che dicono il numero di briscole in mano al computer (x) e quelle uscite (y).
Dunque 2k carte di cui y di briscola sono uscite, 3 carte del computer di cui x briscole sono uscite, e la briscola rigirata non va considerata. Rimangono dunque 36-2k carte coperte, di queste (chiamando z=x+y) 9-z sono di briscola e 36-2k-(9-z) non lo sono.
La probabilità che cerchi risulta come P(almeno una briscola)=1-P(nessuna briscola)=$1-(((36-2k-(9-z)),(3)))/(((36-2k),(3)))$,
insomma mi pare corretto che le 36-2k carte coperte sono come palline in una urna di cui 9-z rosse (le briscole) e le altre bianche (non briscola). Tu ora ne strai tre in blocco che sono le carte che ha lui in maniera che ogni terzina ha la stessa probabilità, questo rispecchia un modello ipergeometrico.
Il problema principale sta che questa probabilità vale abbastanza in generale ma non sempre nel senso che dovrai anche vedere un po' le carte che sono uscite, insomma nel programma ti dovrai armare di if, else e booleane varie per coprire certe casistiche
Io farei così.
Abbiamo 40 carte: di queste 3 sono scoperte del computer, 3 coprente del giocatore, 2k scoperte che sono state giocate, 1 scoperta che e' la briscola ed le restanti 40-3-3-1-2k=33-2k che sono nel mazzo coperte.
k varia tra 0 nel caso incui non e' stata giocata una mano fino a (fatti i conti dove) in maniera che siano rimaste la briscola scoperta ed una carta coperta (prima della pescata). Una volta finite le carte da pescare e i due giocatori sono rimasti con le 3 carte ciascuno se c'è memoria delle carte uscite tutti e due sanno le carte dell'altro.
Fatto questo introduco le due variabili x ed y che dicono il numero di briscole in mano al computer (x) e quelle uscite (y).
Dunque 2k carte di cui y di briscola sono uscite, 3 carte del computer di cui x briscole sono uscite, e la briscola rigirata non va considerata. Rimangono dunque 36-2k carte coperte, di queste (chiamando z=x+y) 9-z sono di briscola e 36-2k-(9-z) non lo sono.
La probabilità che cerchi risulta come P(almeno una briscola)=1-P(nessuna briscola)=$1-(((36-2k-(9-z)),(3)))/(((36-2k),(3)))$,
insomma mi pare corretto che le 36-2k carte coperte sono come palline in una urna di cui 9-z rosse (le briscole) e le altre bianche (non briscola). Tu ora ne strai tre in blocco che sono le carte che ha lui in maniera che ogni terzina ha la stessa probabilità, questo rispecchia un modello ipergeometrico.
Il problema principale sta che questa probabilità vale abbastanza in generale ma non sempre nel senso che dovrai anche vedere un po' le carte che sono uscite, insomma nel programma ti dovrai armare di if, else e booleane varie per coprire certe casistiche
Grazie DajeForte, in effetti con qualche reminescenza delle superiori ero riuscito a calcolarmi la probabilità di presenza briscole in mano al computer. Non avevo fatto 1-p(0brisc), ma semplicemente sommato la p(1 briscola)+p(2brisc.)+p(3brisc.). Sommandoci la p(0brisc) ottenevo 1 quindi ero confidente che i conti erano OK.
C'è memoria delle carte uscite tramite una matrice[4][10] di bool settati true se la carta è uscita o è in mano al Player, membro di ciascuna struttura Player.
Ora sto programmando le funzioni che contano i bool false, e le funzioni di comparazione.
La programmazione dell'AI per il player non è molto agevole, emulare il cervello umano non è banale.
Inoltre, c'è differenza tra le routine per giocare la carta per primi e rispondere alla carta giocata.
Nel primo caso cerco di far calcolare al Player la probilità che l'avversario abbia la balza (o briscola), e pesarla con il valore in punti della carta. Es.: con un re in mano e tre ad asso ancora "su", calcolo la prob. che nelle carte dell'avversario possa esserci almeno il tre o l'asso, e peso questa probabilità con il valore in punti del tre o dell'asso, per decidere quanto è conveniente giocare quella carta.
Se riesco a termire il programma renderò il sorgente di dominio pubblico.
C'è memoria delle carte uscite tramite una matrice[4][10] di bool settati true se la carta è uscita o è in mano al Player, membro di ciascuna struttura Player.
Ora sto programmando le funzioni che contano i bool false, e le funzioni di comparazione.
La programmazione dell'AI per il player non è molto agevole, emulare il cervello umano non è banale.
Inoltre, c'è differenza tra le routine per giocare la carta per primi e rispondere alla carta giocata.
Nel primo caso cerco di far calcolare al Player la probilità che l'avversario abbia la balza (o briscola), e pesarla con il valore in punti della carta. Es.: con un re in mano e tre ad asso ancora "su", calcolo la prob. che nelle carte dell'avversario possa esserci almeno il tre o l'asso, e peso questa probabilità con il valore in punti del tre o dell'asso, per decidere quanto è conveniente giocare quella carta.
Se riesco a termire il programma renderò il sorgente di dominio pubblico.