Tällä sivulla
Videopokerin analyysimenetelmäni
Yksi kysymys, jota minulta kysytään aika ajoin, on se, miten sain videopokeriohjelmani arvioimaan voittotaulukon alle minuutissa. Tämä sivu yrittää vastata tähän kysymykseen.
Alkuperäinen ohjelmani käytti raa'an voiman menetelmää kaikkien 2 598 960 aloituskäden läpikäymiseen ja sitten pelasi kaikki 32 mahdollista hylkäystapaa, mukaan lukien kaikkien 1 533 939 korvaavan kortin läpikäyminen kaikkien viiden kortin hylkäämisen yhteydessä. Tämä tapahtui noin vuonna 1998. Tietokoneellani päättelin tuolloin, että ohjelman suorittaminen kestäisi yli vuoden. Nykyään tällainen ohjelma kestäisi vain noin kuukauden. Kahdella oikopolulla voit kuitenkin lyhentää aikaa noin kuukaudesta noin kolmeen sekuntiin. Seuraavassa on ohjeet.
Voit lyhentää pelin kestoa muutamaan päivään välttämällä samankaltaisten käsien analysoinnin. Esimerkiksi jos aloituskäden tulisi olla neljä ässää ja kuningas, kuninkaan maalla ei olisi merkitystä. Aikaa säästyisi, jos kuninkaalle määritettäisiin mielivaltainen maa ja tulos kerrottaisiin neljällä. Samaa logiikkaa käyttäen erilaisten aloituskäsien määrää voidaan vähentää 2 598 960:stä 134 459:ään. Seuraavat taulukot näyttävät, miten maat ja niihin liittyvät painotukset voidaan järjestää jokaiselle käsiluokalle arvojärjestyksen mukaan.
Viisi SingletoniaKäy läpi kaikki combin(13,5)=1 287 mahdollista tapaa valita 5 eri arvoa 13:sta. Aseta jokaiselle arvoyhdistelmälle maat (numeroitu 1-4) ja painotukset seuraavasti. Esimerkiksi ensimmäisellä rivillä asetetaan jokaiselle yksittäiselle arvolle maa 1. Mahdollisia maata on neljä, joten neljän kerran sijaan tee se kerran ja kerro tulokset painotuksella 4.
Viisi ainutlaatuista tasoa
Laula. 1 | Laula. 2 | Laula. 3 | Laula. 4 | Laulaa.5 | Paino|
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 4 |
2 | 1 | 1 | 1 | 1 | 12 |
1 | 2 | 1 | 1 | 1 | 12 |
1 | 1 | 2 | 1 | 1 | 12 |
1 | 1 | 1 | 2 | 1 | 12 |
1 | 1 | 1 | 1 | 2 | 12 |
2 | 2 | 1 | 1 | 1 | 12 |
2 | 1 | 2 | 1 | 1 | 12 |
2 | 1 | 1 | 2 | 1 | 12 |
2 | 1 | 1 | 1 | 2 | 12 |
1 | 2 | 2 | 1 | 1 | 12 |
1 | 2 | 1 | 2 | 1 | 12 |
1 | 2 | 1 | 1 | 2 | 12 |
1 | 1 | 2 | 2 | 1 | 12 |
1 | 1 | 2 | 1 | 2 | 12 |
1 | 1 | 1 | 2 | 2 | 12 |
2 | 3 | 1 | 1 | 1 | 24 |
2 | 1 | 3 | 1 | 1 | 24 |
2 | 1 | 1 | 3 | 1 | 24 |
2 | 1 | 1 | 1 | 3 | 24 |
1 | 2 | 3 | 1 | 1 | 24 |
1 | 2 | 1 | 3 | 1 | 24 |
1 | 2 | 1 | 1 | 3 | 24 |
1 | 1 | 2 | 3 | 1 | 24 |
1 | 1 | 2 | 1 | 3 | 24 |
1 | 1 | 1 | 2 | 3 | 24 |
1 | 1 | 2 | 2 | 3 | 24 |
1 | 2 | 1 | 2 | 3 | 24 |
1 | 2 | 2 | 1 | 3 | 24 |
1 | 1 | 2 | 3 | 2 | 24 |
1 | 2 | 1 | 3 | 2 | 24 |
1 | 2 | 2 | 3 | 1 | 24 |
1 | 1 | 3 | 2 | 2 | 24 |
1 | 2 | 3 | 1 | 2 | 24 |
1 | 2 | 3 | 2 | 1 | 24 |
1 | 3 | 1 | 2 | 2 | 24 |
1 | 3 | 2 | 1 | 2 | 24 |
1 | 3 | 2 | 2 | 1 | 24 |
3 | 1 | 1 | 2 | 2 | 24 |
3 | 1 | 2 | 1 | 2 | 24 |
3 | 1 | 2 | 2 | 1 | 24 |
4 | 4 | 1 | 2 | 3 | 24 |
4 | 1 | 4 | 2 | 3 | 24 |
4 | 2 | 3 | 4 | 1 | 24 |
4 | 1 | 2 | 3 | 4 | 24 |
1 | 4 | 4 | 2 | 3 | 24 |
1 | 4 | 2 | 4 | 3 | 24 |
1 | 4 | 2 | 3 | 4 | 24 |
2 | 3 | 4 | 4 | 1 | 24 |
2 | 3 | 4 | 1 | 4 | 24 |
1 | 2 | 3 | 4 | 4 | 24 |
Pari
Käy läpi kaikki 13×combin(12,3)=2 860 mahdollista tapaa valita parin arvo ja kolme arvoa jäljellä olevista 12:sta kolmelle yksittäiselle kortille. Aseta jokaiselle arvoyhdistelmälle maat (numeroitu 1-4) ja painotukset seuraavasti. Esimerkiksi ensimmäisellä rivillä parin maat asetetaan arvoiksi 1 ja 2, ja kaikkien yksittäisten korttien maat arvoksi 1. Parin maat voi valita combin(4,2)=6 tavalla ja yksittäisille korteille on kaksi tapaa valita maa, joka on yhtä suuri kuin toinen parin maista, jolloin painotus on 6×2=12.
Pari
Pari 1 | Pari 2 | Laula. 1 | Laula. 2 | Laula. 3 | Paino |
---|---|---|---|---|---|
1 | 2 | 1 | 1 | 1 | 12 |
1 | 2 | 1 | 1 | 2 | 12 |
1 | 2 | 1 | 2 | 1 | 12 |
1 | 2 | 2 | 1 | 1 | 12 |
1 | 2 | 1 | 1 | 3 | 24 |
1 | 2 | 1 | 3 | 1 | 24 |
1 | 2 | 3 | 1 | 1 | 24 |
1 | 2 | 1 | 3 | 3 | 24 |
1 | 2 | 3 | 1 | 3 | 24 |
1 | 2 | 3 | 3 | 1 | 24 |
1 | 2 | 3 | 3 | 3 | 12 |
1 | 2 | 1 | 2 | 3 | 24 |
1 | 2 | 1 | 3 | 2 | 24 |
1 | 2 | 3 | 1 | 2 | 24 |
1 | 2 | 3 | 4 | 4 | 12 |
1 | 2 | 4 | 3 | 4 | 12 |
1 | 2 | 4 | 4 | 3 | 12 |
1 | 2 | 1 | 3 | 4 | 24 |
1 | 2 | 3 | 1 | 4 | 24 |
1 | 2 | 3 | 4 | 1 | 24 |
Kaksi paria
Käy läpi kaikki combin(13,2)×11=858 mahdollista tapaa valita kaksi arvoa 13:sta kahdelle parille ja yksi arvo jäljellä olevista 11:stä yksittäiselle kortille. Aseta jokaiselle arvoyhdistelmälle maat (numeroitu 1-4) ja painotukset seuraavasti. Esimerkiksi ensimmäinen rivi asettaa ensimmäisen parin maat arvoiksi 1 ja 2, toisen parin maat arvoiksi 3 ja 4 ja yksittäisen kortin maan arvoksi 1. Ensimmäisen parin maat voi valita combin(4,2)=6 tavalla. Toisella parilla on kaksi muuta maata, joten niiden valitsemiseen on vain yksi 1. Yksittäisellä kortilla voi olla kumpi tahansa maa ensimmäisestä parista, joten vaihtoehtoja on kaksi. Näin ollen painotus ensimmäisellä rivillä on 6×1×2=12.
Kaksi paria
Pari 1 Kortti 1 | Pari 1 Kortti 2 | Pari 2 Kortti 1 | Pari 2 Kortti 2 | Laula. 1 | Paino |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 1 | 12 |
1 | 2 | 3 | 4 | 3 | 12 |
1 | 2 | 1 | 3 | 1 | 24 |
1 | 2 | 1 | 3 | 2 | 24 |
1 | 2 | 1 | 3 | 3 | 24 |
1 | 2 | 1 | 3 | 4 | 24 |
1 | 2 | 1 | 2 | 1 | 12 |
1 | 2 | 1 | 2 | 3 | 12 |
Kolmoset
Käy läpi kaikki 13×combin(12,2)=858 mahdollista tapaa valita yksi arvo 13:sta kolmosille ja 66 tapaa valita kaksi maata muista 12 arvosta. Aseta jokaiselle arvoyhdistelmälle maat (numeroitu 1-4) ja painotukset seuraavasti. Esimerkiksi ensimmäinen rivi asettaa kolmosten maat arvoiksi 1, 2 ja 3, ja kahden yksittäisen maan maat arvoiksi kaksi kolmosten kolmesta maasta. Kolmosille on combin(4,3)=4 tapaa valita 3 maata neljästä, ensimmäiselle yksittäiselle maalle on 3 tapaa ja toiselle yksittäiselle maalle on 2 tapaa. Näin ollen ensimmäisen rivin painotus on 4×3×2=24.
Kolmoset
3 lajia Kortti 1 | 3 lajia Kortti 2 | 3 lajia Kortti 3 | Laula. 1 | Laula. 2 | Paino |
---|---|---|---|---|---|
1 | 2 | 3 | 1 | 2 | 24 |
1 | 2 | 3 | 1 | 4 | 12 |
1 | 2 | 3 | 4 | 1 | 12 |
1 | 2 | 3 | 1 | 1 | 12 |
1 | 2 | 3 | 4 | 4 | 4 |
Täyskäsi
Käy läpi kaikki 13 × 12 = 156 mahdollista tapaa valita yksi arvo 13:sta kolmosille ja 12 tapaa valita parille arvo. Aseta jokaiselle arvoyhdistelmälle maat (numeroitu 1–4) ja painotukset seuraavasti. Esimerkiksi ensimmäisellä rivillä parin maat asetetaan arvoiksi 1 ja 2, ja kolmosten maat arvoiksi 1, 2 ja 3. Parin maat voi valita combin(4,2) = 6 tavalla. Kolmoset käyttävät molempia parin maata ja yhtä kahdesta muusta. Näin ollen ensimmäisen rivin painotus on 6 × 2 × 2 = 12.
Täyskäsi
Pari Kortti 1 | Pari Kortti 2 | 3 lajia Kortti 1 | 3 lajia Kortti 2 | 3 lajia Kortti 3 | Paino |
---|---|---|---|---|---|
1 | 2 | 1 | 2 | 3 | 12 |
1 | 4 | 1 | 2 | 3 | 12 |
Neloset
Käy läpi kaikki 13 × 12 = 156 mahdollista tapaa valita yksi maa 13:sta nelosille ja 12 tapaa valita yksittäinen maa. Aseta jokaiselle arvoyhdistelmälle maat (numeroitu 1–4) ja painotukset seuraavasti. Esimerkiksi ensimmäisellä rivillä nelosten maat asetetaan arvoiksi 1, 2, 3 ja 4, ja yksittäisen kortin maat arvoksi 1. Kolmosille on vain yksi tapa valita 4 maata 4:stä, ja yksittäiselle kortin maat on 4 tapaa valita 4:stä. Näin ollen ensimmäisen rivin painotus on 1 × 4 × 2 = 4.
Neloset
4 lajia Kortti 1 | 4 lajia Kortti 2 | 4 lajia Kortti 3 | 4 lajia Kortti 4 | Laula. 1 | Paino |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 1 | 4 |
Yllä oleva vaihe lyhentää laskenta-aikaa 95 %, mutta 1 533 939 mahdollisen vaihtokorttiyhdistelmän läpikäyminen vie silti useita tunteja. Kolmen sekunnin ohjelman salaisuus on, että sitä ei käytetä silmukassa nostovaiheessa. Näin se tehdään:
- Alusta seuraavat taulukot:
- Taulukko 1: koko 2 598 960
- Taulukko 2: koko 270 725 x 16
- Taulukko 3: koko 22100 x 16
- Taulukko 4: koko 1326 x 16
- Taulukko 5: koko 52 x 16
- Taulukko 6: koko 16
- Käy läpi kaikki 2 598 960 viiden kortin yhdistelmää 52:sta. ÄLÄ käytä tässä vaiheessa 134 459 käden oikopolkua. Tee seuraavat toimet jokaiselle jaetulle kädelle:
- Pisteytä se sen pokeriarvon mukaan.
- Kirjoita pisteet taulukkoon 0. Kirjoita ensimmäinen käsi taulukon elementtiin 0 ja kasvata arvoa yhdellä jokaista kättä kohden.
- Jokaisella viidellä tavalla valita neljä viidestä kortista, muunna neljä korttia indeksiluvuksi väliltä 0 - 270 724 (selitän miten se tehdään myöhemmin) ja kasvata taulukon 1 elementtiä [indeksinumero][käden pistemäärä] yhdellä.
- Jokaisella kymmenellä tavalla valita 3 viidestä kortista, muunna kolme korttia indeksiluvuksi 0 - 22 099 ja kasvata taulukon 2 elementin [indeksinumero][käden pistemäärä] arvoa yhdellä.
- Jokaisella kymmenellä tavalla valita kaksi viidestä jaettavasta kortista, muunna kaksi korttia indeksiluvuksi 0 - 1 325 ja kasvata taulukon 3 elementtiä [indeksinumero][käden pistemäärä] yhdellä.
- Jokaisella viidellä tavalla valita yksi viidestä kortista, muunna kortti indeksiluvuksi 0-51 ja kasvata taulukon 4 elementtiä [indeksinumero][käden pistemäärä] yhdellä.
- Kasvattaa taulukon 5 elementin [käden pistemäärää] yhdellä.
- Seuraavaksi käydään läpi yllä selitetyt 134 459 käsiluokkaa.
- Voit määrittää kaikkien viiden kortin pitämisen arvon muuntamalla viisi korttia indeksiluvuksi ja etsimällä pokerin arvon lin array0:sta.
- Saadaksesi selville minkä tahansa neljän kortin arvoa, muunna neljä korttia indeksiluvuksi ja etsi mahdolliset tulokset nostossa vastaavasta taulukon 1 alkiosta. Tämä kuitenkin sisältää myös jaossa hylätyn kortin saamisen. Joten sinun tulee vähentää yksi taulukon alkiosta, joka liittyy kaikkien viiden kortin arvoon. Esimerkiksi, jos sinulla on J♣, Q♣, K♣, A♣ ja hylkäät 2♥, on yksi tapa saada kuningas, kahdeksan tapaa saada väri, kolme tapaa saada suora, 12 tapaa saada jätkäpari tai parempi ja 23 tapaa saada häviävä käsi. Taulukko 1 kuitenkin sanoo, että on 24 tapaa saada häviävä käsi, mukaan lukien 2♥ nostossa. Joten sinun on vähennettävä kaikkien korttien pitäminen viidestä mahdollisesta tuloksesta.
- Varmista, että ymmärrät yllä olevan vaiheen logiikan, koska viemme sen tässä vaiheessa seuraavalle tasolle. Kymmenen tapaa pitää mitä tahansa kolmea korttia varten etsit mahdolliset tulokset taulukosta 2. Vähennä sitten mahdolliset tulokset taulukosta 1 kolmelle pitämällesi kortille ja jokaiselle hylkäämällesi kortille. Esimerkiksi arvon 2♣ 2♥ 2♠ säilyttämiselle ja 4♥ ja J♠ hylkäämiselle laskemiseksi aloita taulukon 2 arvoilla 2♣ 2♥ 2&pada ja vähennä sitten arvot 2♣ 2♥ 2♠ 4♥ ja 2♣ 2♥ 2♠ J♠. Tämä kuitenkin kaksinkertaistaa kaikkien viiden kortin pitämisen. Joten sinun on lisättävä takaisin se, minkä saat pitämällä kaikki viisi korttia.
- Samalla logiikalla, kahden minkä tahansa kortin pitämiseen aloitetaan taulukon 3 arvoista, vähennetään sopivat korttisarjat taulukosta 2, lisätään takaisin sopivat korttisarjat taulukosta 1 ja vähennetään takaisin taulukosta 0 alkiot, jotka sisältävät kaiken.
- Yhden kortin pitämistä varten aloita taulukon 4 arvoilla, vähennä sopivat arvot taulukosta 3, lisää takaisin sopivat arvot taulukosta 2, vähennä takaisin sopivat arvot taulukosta 1 ja lisää takaisin sopiva arvo taulukosta 0.
- Kaiken hylkäämiseksi aloita taulukon 5 arvoista, vähennä sitten sopivat arvot taulukosta 4, lisää takaisin sopivat arvot taulukosta 3, vähennä takaisin sopivat arvot taulukosta 2, lisää takaisin sopivat arvot taulukosta 1 ja vähennä sopiva arvo taulukosta 0.
- Sinulla pitäisi nyt olla kaikkien 32 pelitavan mahdollisten lopputulosten yhdistelmien lukumäärä. Määritä kunkin odotusarvo. Lisää pelin kaikkien mahdollisten lopputulosten taulukkoon sen pelin osalta, jonka odotusarvo on suurin. Muista kertoa luku jakokäden painotuksella.
- Kun olet käynyt läpi kaikki 134 459 aloituskäden tyyppiä, sinulla pitäisi olla tiedossasi, kuinka monella tavalla voit saada kunkin käden vetoon. Käytä tätä taulukkoa pelin kokonaistuoton määrittämiseen.
Seuraavassa on neljä aliohjelmaa 2–5 kortin (numeroitu 0–51) kääntämiseen ja indeksiarvon palauttamiseen.
int Käsi-Indeksi2(int c1, int c2){ int r; r=combin_array[52][2]-combin_array[52-c1][2]; r+=combin_array[51-c1][1]-combin_array[52-c2][1]; return r;}int Käsi-Indeksi3(int c1, int c2, int c3){ int r; r=combin_array[52][3]-combin_array[52-c1][3]; r+=combin_array[51-c1][2]-combin_array[52-c2][2]; r+=combin_array[51-c2][1]-combin_array[52-c3][1]; return r;}int Käsi-Indeksi4(int c1, int c2, int c3, int c4){ int r; r=combin_array[52][4]-combin_array[52-c1][4]; r+=combin_array[51-c1][3]-combin_array[52-c2][3]; r+=combin_array[51-c2][2]-combin_array[52-c3][2]; r+=combin_array[51-c3][1]-combin_array[52-c4][1]; return r;}int KäsiIndeksi5(int KorttiIndeksi[]){ int r; r=combin_array[52][5]-combin_array[52-KorttiIndeksi[0]][5]; r+=combin_array[51-KorttiIndeksi[0]][4]-combin_array[52-KorttiIndeksi[1]][4]; r+=combin_array[51-Korttiindeksi[1]][3]-combin_array[52-Korttiindeksi[2]][3]; r+=combin_array[51-Korttiindeksi[2]][2]-combin_array[52-Korttiindeksi[3]][2]; r+=combin_array[51-Korttiindeksi[3]][1]-combin_array[52-Korttiindeksi[4]][1]; return r;}
Linkit
Tämä sivusto selittää, kuinka kirjoittaja nopeutti videopokeri-analysaattoriaan vuodesta seitsemään sekuntiin.
VP Geniusilla on erinomainen sivu videopokerin ohjelmoinnista.