Kesällä 2018 pidetään jälleen ohjelmointikilpailu.
Tässä tekoälykilpailussa pelataan Sika-korttipeliä kolmella pelaajalla. Pelissä pitää lyödä vuorollaan yleensä kaksi korttia, ensiksi samaa maata kuin edellinen ja sitten mikä tahansa muu kortti. Jos ei ole sopivaa korttia, se täytyy nostaa pakasta tai pöydästä. Se, jolle jää viimeisenä kortteja käteen, on sika ja häviää pelin.
Tarkemmat säännöt ovat kilpailusivulla, ja peliä (ja omaa tekoälyään) voi kokeilla testaussivulla. Mukana on perinteiseen tapaan esimerkkiohjelma muutamalla yleisimmällä ohjelmointikielellä.
Tervetuloa kilpailuun!
Hienosti lähti java-esimerkkiohjelma toimimaan, mutta käännös piti ensin siirtää samaan kansioon proxyn kanssa (KilpailuProxy-2018-01-13).
Vaikuttaa hyvin toimivalta paketilta!
Hauskaa että on taas uusi kisa!
Pieni tarkennus pelin voittamisen suhteen:
Voittaako pelin välittömästi, jos omat käsi on tyhjä, ja umpipakka tyhjenee toisen pelaajan vuorolla?
Entä jos kaikilla pelaajilla on käsi tyhjä, ja vuorossa oleva pelaaja nostaa umpipakan viimeisen kortin pelaten sen välittömästi. Voittavatko silloin kaikki kolme pelaajaa, vai häviääkö vuorossa oleva pelaaja?
Sisuaski kirjoitti:
Voittaako pelin välittömästi, jos omat käsi on tyhjä, ja umpipakka tyhjenee toisen pelaajan vuorolla?
Kyllä voittaa. Täsmennän sääntöihin: ”Jos pelaajalla ei ole yhtään korttia ja umpipakka on loppunut ennen hänen vuoroaan, hän voittaa. Tyhjään käteen ei siis tarvitse nostaa kortteja avopakasta.”
Sisuaski kirjoitti:
Entä jos kaikilla pelaajilla on käsi tyhjä, ja vuorossa oleva pelaaja nostaa umpipakan viimeisen kortin pelaten sen välittömästi. Voittavatko silloin kaikki kolme pelaajaa, vai häviääkö vuorossa oleva pelaaja?
Kaikki voittavat. Täsmennän sääntöihin: ”Pelin häviää se, jolla on viimeisenä kortteja kädessään vuoron vaihtuessa.”
Kilpailu kuulostaa inspiroivalta, mutta oma osallistuminen taitaa tyssätä ei keinoälyn vaan todellisen älyn puutteeseen, siinä määrin paljon on mitä en tuosta ymmärtänyt.
Esimerkiksi, mistä tiedetään, montako korttia umpipakasta tulee nostaa jo ennen kuin ne on nostettu? Ohjelmalle kun kerrotaan ensin nostettavien korttien määrä ja sitten vasta kortit?
Toiseksi, mistä nuo tiedot syötteeseen tulevat? Eli esimerkkiohjelma lukee komentorivisyötettä, mutta mistä tiedot komentoriville tulevat? "Kuka" arpoo umpipakan kortit ja syöttää niitä sitten komentoriville?
jkorh kirjoitti:
Esimerkiksi, mistä tiedetään, montako korttia umpipakasta tulee nostaa jo ennen kuin ne on nostettu?
Esimerkiksi voit itse toimia tekoälyn avustajana oikeilla pelikorteilla: Tekoälyn vuorolla nostat pakasta kortteja, kunnes tekoälyllä on sopivat kortit lyötäväksi, ja syötät sitten tekoälylle komentorivillä korttien määrän ja nostetut kortit. Tekoäly tulostaa omat valintansa, ja siirrät sitten tekoälyn käsikorteista kyseiset kortit avopakkaan. Muiden pelaajien vuorolla syötät tekoälylle tiedon, montako korttia pelaaja nosti ja mitä kortteja löi.
jkorh kirjoitti:
Toiseksi, mistä nuo tiedot syötteeseen tulevat?
Kilpailua varten on tehty testaussivu, joka arpoo korttipakan ja hallinnoi peliä. Testaussivu tietää kaikkien kortit ja myös umpipakan kortit, joten se pystyy myös laskemaan, montako korttia pelaajan pitää nostaa saadakseen sopivat kortit. Voit testata sivua ihmispelaajilla, niin näet, miten se toimii.
Testaussivulla mainitaan myös välitysohjelma (KilpailuProxy), jota tarvitaan tekoälyn ajamiseen. Testaussivu avaa WebSocket-yhteyden välitysohjelmaan, joka taas käynnistää tekoälyn, ja syöte ja tuloste siirtyvätkin WebSocketin kautta testaussivun ja tekoälyn välillä. Välitysohjelma siis syöttää tekoälyn komentoriville sen, mitä testaussivu on lähettänyt WebSocketilla, ja palauttaa testaussivulle WebSocketilla sen, mitä tekoäly tulostaa komentoriville.
Testaussivun ja välitysohjelman teknisen toteutuksen ymmärtäminen ei ole mielestäni olennaista. Ohjeita noudattamalla ja esimerkkiohjelmia kopioimalla saa helposti tekoälyn toimimaan, ja sitten voi keskittyä itse asiaan eli tekoälyn strategiaan.
Voisikohan saada jälleen hiukan kehittyneemmän vastustajan testipenkkiin? Esimerkkiohjelmasta ei ole vastusta, kun se lyö aina ensimmäisen kädessä olevan kortin.
Vielä tuli tällainen kummallinen juttu, että oma ohjelma ei toimikaan niin kuin sen pitäisi! Onko mitään mahdollisuuksia saada ohjelmasta ulos esim. tiettyjä parametrien arvoja ajon aikana? Helpottaisi selvittelyä, että mikä kohta menee pieleen ...
TapaniS kirjoitti:
Onko mitään mahdollisuuksia saada ohjelmasta ulos esim. tiettyjä parametrien arvoja ajon aikana? Helpottaisi selvittelyä, että mikä kohta menee pieleen ...
No eikös se ole itse tekemäsi ohjelma omalla tietokoneellasi, joten erilaisia tapoja tuohon on varmasti useita, esimerkiksi kirjoittaminen tiedostoon, kirjoittaminen virhevirtaan (en tiedä onko ok), lähettäminen vaikka TCP-yhteydellä, nimetyillä putkilla yms.
Jep, no kiitos vinkistä! Yritän tuota tiedostoon kirjoittamista, mutta en ole varma, toimiiko se. Plokkis-pelissä ei tainnut onnistua sekään... Merkit sekosivat testiohjelman pyörteissä tms.
Ai niin, kyseessä siis Java!
TapaniS kirjoitti:
Voisikohan saada jälleen hiukan kehittyneemmän vastustajan testipenkkiin?
Varmasti voisi, jos joku koodaisi sellaisen. Itselläni ei ainakaan ole kovin vahvaa käsitystä, millaisella tekoälyllä tähän kisaan lähtisi.
TapaniS kirjoitti:
Onko mitään mahdollisuuksia saada ohjelmasta ulos esim. tiettyjä parametrien arvoja ajon aikana?
Virhevirtaan tulostettu tieto näkyy KilpailuProxyn ikkunassa. Virhevirta on siis stderr (C), std::cerr (C++), System.err (Java), System.Console.Error (C#) tms.
Voit myös kirjoittaa tiedostoon, ei tässä pitäisi olla mitään ongelmaa. Muista vain, että jos pelissä on useampi oma tekoälysi, niiden kannattaa kirjoittaa eri tiedostoihin.
Kaikki debug-tulostus (ja samalla myös arvojen muotoilu tulostusta varten) kannattaa poistaa ohjelmasta ennen lähetystä, koska se voi yllättävästi hidastaa ohjelmaa.
Tiedostoon kirjoittaminen onnistuu! Ja heti alkoi ongelma avautumaan ... Vielä pientä hiomista, niin TaScard1 saadaan vaikka harjoitteluvastukseksi. Tässä menee vaan yllättävän paljon aikaa ja viikonloppukin menee tuolla shakin SM-kisoissa :)
No joo ... oli ihan tyhmä moka, kun lueskelin, että pelaajan numero on 1, 2 tai 3 ja sitten kuvittelin, että nuo muuttujien indeksit menisivät samalla tavalla. Mutta esimerkkiohjelmassa ne ovat siis 1, 2 ja 0.
No nyt sain eka version TaScard-ohjelmasta jakoon. Tämä ei vielä ole "voittaja", mutta se pelaa kuitenkin aina sitä maata, jota omassa kädessä on eniten. Paitsi jos seuraavalla pelaajalla on vähän kortteja, niin sitten pelataan kortti, jota seuraavalla pelaajalla ei ole.
Tämä ei siis ole vielä virallinen kisaversio.
Mielenkiintoinen kisa, ja myös melko haastava. Vaikea keksiä, miten tätä peliä pitäisi lähestyä, kun oma intuitio ei ainakaan vielä ole keksinyt miten pitäisi edes itse pelaisi kovin hyvin tuota peliä.
Riittävän mielenkiintoinen siihen, että tuli palattua vapaa-ajan ohjelmointiharrastuksen pariin. Puhdas ohjelmointi-Linux-ympäristö tuli eilen tapeltua läppärin 128 GB SSD-levylle Windowsin rinnalle. (Ei muuten mennyt ykkösellä sisään, Windows rikkoi totaalisesti Linux-osion ”korjatessaan levyn virheitä” (koska tila piti varastaa Windowsin osiolta. Luulin vain GRUB2 hajonneen, mutta...)
Oma ensimmäinen – melko yksinkertainen – idea tuntuu myös näin seuraavana aamuna ajettaessa voittavan esimerkkitekoälyn useammin kuin pelkällä tuurilla. Tämä toki ei vielä kerro suuresta älyn määrästä.
PS. Eihän kaikki kolme (paino sanalla kolme) pelaajaa mitenkään voi päätyä kaikki voittamaan? Maita on neljä, ja kortteja 13 per maa... onko tuossa missään kohtaa sellaista tilannetta, jossa siitä viimeisen maan ylimääräisestä kortista päästäisiin eroon?
L2-K2 kirjoitti:
Eihän kaikki kolme (paino sanalla kolme) pelaajaa mitenkään voi päätyä kaikki voittamaan?
Tosiaan, yhteisvoitto ei ole mahdollinen. Jokaista maata on pariton määrä, mutta avopakassa ainoa pariton kortti on päällimmäinen kortti (ennen avopakasta nostamista). Umpipakan loppuessa siis ainakin kolme paritonta korttia on jonkun kädessä riippumatta pelaajien määrästä.
Tässä on muutama helppo idea vapaasti toteutettavaksi, jos oma vielä puuttuu:
Pari ohjelmaa on vasta tullut, mutta yleensäkin ilmoittautumiset tulevat lopussa. Olen lomalla viikon, joten vastaan kisaviesteihin seuraavan kerran 2.7.
Tuolta löytyy esim2, joka lyö maata, jota on kädessä eniten:
Esim2
R1xa kirjoitti:
Tuolta löytyy esim2, joka lyö maata, jota on kädessä eniten:
Esim2
Mainio toteutus testaukseen. Tuolta ei taida lähdekoodia saada mitenkään esiin.
Ilmoittauduin (TaScard2!) vahingossa kisaan, kun en huomannut, että ilmoittautumisia ei oteta vastaan ajalla 23.6.–1.7.2018. No ohjelmaan on tulossa kuitenkin huomattavia parannuksia, niin viikon päästä uusi yritys ...
Paina selaimessa F12, niin näet javascript koodin ja voit myös debugata sitä. Sivun voi tallentaa omalle koneelle ja muokata miten haluaa. Sitten vain avaa sen selaimeen.
Metabolix kirjoitti:
Ohjeita noudattamalla ja esimerkkiohjelmia kopioimalla saa helposti tekoälyn toimimaan
Mitä esimerkkiohjelmia?
En ymmärrä kilpailuproxyn ohjeista ilmeisesti yhtään mitään. Ohjeen lopussa lukee "Tässä voit itse testata yhteyttä ohjelmaasi", siellä on kenttä nimeltä Viesti. Pitääkö siihen kirjoittaa jotakin? No, joka tapauksessa, kun napsautan "Yhdistä!"-painiketta, saan ilmoituksen "Virhe yhteydessä. Tarkasta asetukset.", eikä minulla ole hajuakaan, mistä asetuksista on kysymys.
Strategia ehkä se helpompi osuus minulle kuin tämä käytännön tekniikka?
Sika - kilpailun sivulta, otsikon 'Ohjelman toiminta' alta löytyy tekstin seasta esimerkkejä -linkki.
Nonniin, silmä käteen ja löytyihän ne sieltä (kiitoksia R1xalle), ja, mikä tärkeintä, KilpailuProxystakin tajusin että sen pitää siis olla käynnissä. Ehkä tästä jotakin tulee.
Sitten kun vielä tietäisi, että onko itse vaan todella surkea pelaamaan tuota peliä, vai onko oma melko yksinkertainen tekoälyni kohtalaisen hyvä pelaamaan. Itse pystyn korkeintaan pakottamaan tasapeliksi omaa älyäni vastaan, paitsi jos käy tuuri. Ja, tämä siis vaikka katsoisin tekoälyn kortteja.
No, ei kai tässä auta muu kuin kokeilla ja toivoa. Toki, voihan se myös olla jotain siltä ja väliltä. Tai, sitten voittaminen on vaan todella vaikeaa tässä korttipelissä.
"Jos kortti jää lyömättä, sen tilalla tulostetaan viiva (-)."
Tarkoittaako tuo passiivimuoto, että myös tekoälyn tulee tulostaa viiva, kun se ei vuorollaan lyö mitään korttia?
öppis kirjoitti:
En ymmärrä kilpailuproxyn ohjeista ilmeisesti yhtään mitään.
Koetin selventää KilpailuProxyn ohjesivua. Saa ehdottaa parannuksia.
öppis kirjoitti:
Tarkoittaako tuo passiivimuoto, että myös tekoälyn tulee tulostaa viiva, kun se ei vuorollaan lyö mitään korttia?
Tekoäly tulostaa vain lyödyt kortit. Korjasin lainaamaasi kohtaan, että puuttuvan kortin tilalla syötetään viiva.
R1xa kirjoitti:
Tuolta löytyy esim2, joka lyö maata, jota on kädessä eniten: – –
Ihailtavaa omatoimisuutta JS-koodin kanssa. :)
L2-K2 kirjoitti:
(koneen nopeudesta)
Koneen nopeudesta saa jonkinlaisen vertailukelpoisen käsityksen CPU Benchmark -sivulta.
Jos tekoäly huomaa voittavansa tai huomaa häviävänsä, saako se sammua heti, vai pitääkö sen jäädä odottelemaan jotakin (mitä?) ennen sammumistaan? Esimerkiksi jos pelaajia on jäljellä 2, ja tekoäly saa vastustajan vuoron aluksi syötteen -2, niin silloinhan se tietää hävinneensä.
öppis kirjoitti:
(02.07.2018 14:05:00): Jos tekoäly huomaa voittavansa tai huomaa...
Itse ainakin toimin kuten esimerkkitekoäly, eli jään odottamaan tuota "-1" viestiä itselleni. Sehän tulee heti sen oman viimeisen kortin pelaamisen jälkeen, jos voittaa.
PS. Tosin, esimerkkitekoälykään ei suoraan sammu tuohon "-1" viestiin, paitsi jos se tulee tuossa oikeassa kohtaa peliä korttimääränä. (Ainakin testisivu lähettää viestin "-1" heti napista "Lopeta", eikä vasta tuossa kohtaa peliä. Tekoäly lukee sen pahimmillaan vastustajan pelaamaksi kortiksi ja jää pyörimään taustalle, kunnes se tapetaan. Tämän ei tosin pitäisi tapahtua varmaankaan varsinaisissa kisapeleissä?)
öppis kirjoitti:
Jos tekoäly huomaa voittavansa tai huomaa häviävänsä, saako se sammua heti
Saa sammua heti. Muista kuitenkin sammutus myös luvusta -1 (ohjeiden ja esimerkin mukaan): et voi muuten tietää, että olet jo voittanut, jos esimerkiksi vastustaja kaatuu.
L2-K2 kirjoitti:
Ainakin testisivu lähettää viestin "-1" heti napista "Lopeta"
Nyt testisivu lähettää myös Lopeta-painikkeesta ensin puuttuvat viivat, jotta lopetusviesti (-1) tulee oikeassa kohdassa. Kisassa pelit eivät tietenkään lopu kesken vaan ainoastaan sääntöjen mukaiseen voittoon tai häviöön.
Luulin jo ymmärtäneeni säännöt, mutta en sittenkään. Pelin kulun ja ohjelman toimintakuvauksen välillä näyttää olevan jotain ristiriitaa:
Pelin kulku kirjoitti:
Jos pelaaja saa lyötyä ensimmäisen kortin, hän saa seuraavaksi lyödä minkä tahansa muun kortin kädestään. Jos pelaajalla ei ole enää kortteja, hän nostaa kortin umpipakasta ja lyö sen. Jos umpipakka loppuu ja pelaajalla ei ole enää kortteja, hän voittaa.
0hjelman toiminta kirjoitti:
Pelaajan omalla vuorolla ohjelmalle syötetään nostettavien korttien kokonaismäärä ja sen jälkeen umpipakasta nostettavat kortit. Korttien määrässä huomioidaan molemmat lyötävät kortit.
Tämän jälkeen ohjelman pitää tulostaa lyömänsä kortit omille riveilleen. (Jos pelaaja nosti kortteja avopakasta, pelaaja ei saa lyödä kortteja. Jos avopakka on tyhjä tai jos pelaajalla on kädessään enää yksi kortti, pelaaja lyö vain yhden kortin. Muuten pelaaja lyö kaksi korttia.)
En nyt ihan ymmärrä tuota Ohjelman toiminta -kohdan lausetta "jos pelaajalla on kädessään enää yksi kortti, pelaaja lyö vain yhden kortin". Eikö olekaan niin, että jos umpipakassa on jäljellä kortteja, niistä on nostettava yksi ja lyötävä se?
Jos oletetaan, että asiat menevät niin kuin Pelin kulku -kohdassa on sanottu, niin milloin ohjelma saa tietää, mikä tämä yksi umpipakasta nostettava kortti on? Normaalisti heti vuoronsa alussako?
Eli jos avopakan päällimmäinen kortti on risti-9, umpipakan päällimmäinen risti-8 ja minulla kädessä risti-5 (eikä muita kortteja), ilmoittaako ohjelma vuoroni alussa
1
risti-8
Jos, niin vielä jatkokysymys: katsotaanko, että ohjelmani toimii virheellisesti, jos se lyö nyt kortit järjestyksessä
risti-8
risti-5
Oikeassa pelissähän (=se mikä kuvataan kohdassa Pelin kulku) ei noin voisi tehdä, sillä kädestä on pitänyt lyödä ensin se ainoa kortti joka siellä on, ja sitten vasta nostaa umpipakasta.
öppis kirjoitti:
Eikö olekaan niin, että jos umpipakassa on jäljellä kortteja, niistä on nostettava yksi ja lyötävä se? – – Milloin ohjelma saa tietää, mikä tämä yksi umpipakasta nostettava kortti on? Normaalisti heti vuoronsa alussako?
Kuten säännöissä lukee, ohjelma nostaa jo vuoron alussa umpipakasta tarpeeksi kortteja, jotta pystyy lyömään kummatkin kortit. ”Pelaajan omalla vuorolla ohjelmalle syötetään nostettavien korttien kokonaismäärä ja sen jälkeen umpipakasta nostettavat kortit. Korttien määrässä huomioidaan molemmat lyötävät kortit.”
öppis kirjoitti:
Eli jos avopakan päällimmäinen kortti on risti-9, umpipakan päällimmäinen risti-8 ja minulla kädessä risti-5 (eikä muita kortteja), ilmoittaako ohjelma vuoroni alussa
1 risti-8
Kyllä, juuri näin.
Jos korttien jakamisjärjestys ahdistaa sinua kovasti, voit jättää omalla vuorolla korttien määrän huomioimatta (pl. erityiset viestit -1 ja -2) ja lukea umpipakan kortteja täsmälleen ylempänä Pelin kulku -kohdassa kuvatulla tavalla, koska niitä syötetään ohjelmalle tasan säännöissä tarvittava määrä. Syöttöjärjestyksen tarkoitus on vain helpottaa kirjanpitoa ja laskentaa, koska kisan ideana on ohjelmoida tekoäly eikä juuttua pelkän pelilogiikan ohjelmointiin.
öppis kirjoitti:
Jos, niin vielä jatkokysymys: katsotaanko, että ohjelmani toimii virheellisesti, jos se lyö nyt kortit järjestyksessä
risti-8 risti-5
Kilpailussa näin on tosiaan mahdollista tehdä. Tällä ei ole merkitystä lopputuloksen kannalta, koska kortit ovat samaa maata (eivät eroa merkitykseltään avopakassa) ja pelaajalle ei jää lyönnin jälkeen yhtään korttia.
Ilmoittautuminen on päättynyt!
Mukana on 10 ohjelmaa, aakkosjärjestyksessä: esim, Hassu, Maschinen, most, munkki, Pohja, potsi, Ransu, TaScard2, thorp. Mikäli lähettämäsi ohjelma puuttuu tältä listalta, otathan pikaisesti yhteyttä.
Tuloksia on luvassa ensi viikon kuluessa. Tekoälyt ovat melko nopeita, ensimmäisten testien perusteella arvelen myös järjestyksen olevan melko selvä, mutta pelataan nyt ainakin muutama kierros varmuuden vuoksi.
Tulokset on julkaistu!
17280 ottelua on pelattu, ja tulokset on julkaistu. Kilpailun voitti L2-K2 tekoälyllään most. Onneksi olkoon!
Aihe oli selvästi hankala. Koetan keksiä seuraavaan kisaan jotain helpompaa.
Oli kyllä oikein mukava kilpailu. Vähän ikävästi itsellä ei ollut paljoa aikaa kuin vasta kilpailuajan loppupuolella pari päivää, joten en ehtinyt tuota oppimisälyäni opettamaan kovinkaan pitkään.
Ehkäpä seuraavaan kisaan voisi tehdä jotain samankaltaista ja opettaa bottia vähän pidempään, jos kilpailu on sopiva sellaiseen. :P
Anaatti kirjoitti:
Oli kyllä oikein mukava kilpailu.
Jep. Tämä. Oikein mukava kilpailu, mutta hieman ehkä haastava lähestyttävä.
Hieman yllätyin, että tekoälyni päätyi lopulta voittamaan noin ison osan peleistä. Odotin itse hieman alempaa voittoprosenttia.
Ehkä niistä kaikista kouluaikaisista välituntikorttipeleistä oli jotain iloa, tiesi että kannattaa piilotella tietoa omista korteistaan mahdollisimman pitkään, jotta kukaan muu ei tiedä onko sinulla nyt se pata-kakkonen, hertta-ässä vai ei kumpaakaan (mikäköhän sen jokavälituntisen yksinkertaisen pelin nimi oli, jossa kakkonen oli valttia, ja muuten isompi kortti parempi kuin pienempi). Lisäksi toki samalla yrittää hyödyntää tieto siitä mitä kortteja vastustajalla ei edellisellä kierroksella kädessään ollut (<vinkki>nosto ei koskaan jätä käteen sitä sillä kertaa puuttuvaa maata</vinkki>). Nämä oli ensimmäiset asiat mitkä toteutin, siis käännä esimerkkibotin käden peluutusjärjestys peilikuvaksi, uusin kortti pelataan ensin eikä vanhin, ja ala laskea kortteja ihan vaikka vaan huvin vuoksi.
Satuitko Metabolix tallentamaan tietoa pelien tyypillisestä kestosta siirtoina? (Tai, ylipäänsä vaikka vaan sen raakadatan peleistä.) Olisi mielenkiintoista tietää kuinka iso osa peleistä päättyi lähes heti umpipakan loputtua. Se kun oli pääasiallinen syy, miksi toteutin lopulta tuon MC-algoritmin. Nyrkkisäännöillä pelaavan aikaisemman version "most":ista saattoi siinä kohtaa ihmispelaaja harhauttaa* ja voittaa**.
* Koska sen kädestä tiesi oleellisesti kaiken siihen mennessä.
** Ajoittamalla pakan loppumisen haluttuun kohtaan, joka ei toki aina onnistu. Ainakin omissa kokeiluissa tuo MC tuntui voittavan usein juuri tässä kohtaa. Siis, tärkeintä oli, että joko voitti ensimmäisenä tai ei ainakaan antanut sen seurakseen jäljelle jääneen pelaajan tehdä täysin vapaita siirtoa (jos joku muu nyt vaan väkisinkin oli voittamassa). Nostaessa kun ei voinut enää pelata, joten toinen pelaaja sai sitten pahimmillaan rankaista oikein urakalla.
MC tuntui toteuttavan juuri tuon kohda peliä hyvin, se näki määritelmällisesti aina kaikki nuo omat harhautusyritykset (ja löysi ne itselleen käytettäväksi). Ja, koska se ei ainakaan omaa nyrkkisääntöbottia vastaan mitenkään erityisesti voittanut puhtaassa avopakkavaiheessa, niin oletan, että voitoista ison osan pitäisi olla tullut tuossa kohtaa.
Omassa reilun sadan pelin otoksessa vain ihan yksittäisiä pelejä voitettiin pitkään jatkuneen avopakkavaiheen jälkeen (ainakaan kaksinpelinä, siis jonkun muun jo päästyä korteista eroon), mikä vastasi hyvin tuota arvioimani pistemäärän odotusarvoa (joka oli vain kahden pelaajan ollessa jäljellä selvästi alle 10 % luokkassa). Alkupelissä odotusarvo oli noin 50 %, mikä oli ainakin melko lähellä tuota turnauksen toteutunutta 54 % keskimääräistä pistemäärää per peli. Sitten se nousi (tai huonolla tuurilla laski) siitä vähitelleen siitä pakan huvetessa, kunnes peli joko voitetiin tai jäätiin tappamaan aikaa jommankumman vastustajan kanssa kohti 333 kierroksen rajan myötä koittavaa tappiota.
Anaatti kirjoitti:
Ehkäpä seuraavaan kisaan voisi tehdä jotain samankaltaista ja opettaa bottia vähän pidempään, jos kilpailu on sopiva sellaiseen. :P
Pieni täsmentävä kysymys Ananaatille: vaatiiko tuo oppiva tekoälysi siis, että se on nähnyt täsmälleen saman avopakan järjestyksen aikaisemmin (ja samat määrät käsikortteja, sisältäen saman määrän tuntemattomia vastustajien kortteja)? Testasitko kuinka usein tuo pystyi käyttämään oppimaansa tietoa (1) ylipäänsä, (2) avopakan sisältäessä paljon kortteja, eli silloin kuin pitäisi pelata se oma voittava siirto?
L2-K2 kirjoitti:
Pieni täsmentävä kysymys Ananaatille: vaatiiko tuo oppiva tekoälysi siis, että se on nähnyt täsmälleen saman avopakan järjestyksen aikaisemmin (ja samat määrät käsikortteja, sisältäen saman määrän tuntemattomia vastustajien kortteja)? Testasitko kuinka usein tuo pystyi käyttämään oppimaansa tietoa (1) ylipäänsä, (2) avopakan sisältäessä paljon kortteja, eli silloin kuin pitäisi pelata se oma voittava siirto?
Tuo on hyvä kysymys ja kerron samalla vähän tuon botin historiasta.
Aluksi tein tuon botin niin, että tilanne määrittyi sen mukaan kuinka monta kutakin maata (tai tuntematonta) on yhteensä itsellä kädessä, avopakassa, ja muilla pelaajilla yhdessä. Ongelmana tässä oli se, että avopakan järjestys on hyvin merkittävä eikä botti huomioinut tätä. Sitten otin mukaan avopakan X päälimmäistä korttia ja botti alkoi voittamaan jo paremmin, mutta ongelmaksi muodostui erilaisten tilanteiden suunnaton määrä, jolloin botti ei juurikaan voinut käyttää oppimaansa dataa, koska pelitilanteet olivat yleensä uusia.
Aloin sitten aika agressiivisesti rajoittamaan tuota pelitilanteen määritelmää ja lopullisessa versiossa pelitilanteeseen sisältyy enintään avopakan 3 päälimmäistä korttia ja lukumäärä kustakin maasta itsellä ja muilla pelaajilla käyttäen ainoastaan vaihtoehtoja 0, 1 tai 2+ korttia. Eli jos on vaikka 3 korttia tai enemmän, niin silti merkataan 2.
Jos nyt oikein laskin niin erilaisia tilanteita olisi silloin 3^9*(4^3+4^2+4+1)=1673055 ~1.7mil eli ei nyt aivan liikaa. Toki botin lopullinen versio muistaa vain 104914 eri tilannetta (6.3% kaikista). Testasin myös kuinka usein botti pystyi käyttämään oppimaansa tietoa kaikenkaikkiaan. Lopullinen versio esimiä, itseään ja satunnaisbotteja vastaan oli nähnyt kunkin pelitilanteen aiemmin aika tarkasti 99% ajasta ja loput 1% ajasta arpoi siirron. Avopakan koko ei juurikaan vaikuta tähän, koska kolmea korttia suuremmalla avopakalla ei ole mitään vaikutusta.
Sanon vielä loppuun, että sen kyllä näki kuinka tuon botin voittoprosentti kasvoi, mitä enemmän sitä opetti, joten siinä mielessä ihan lupaava idea. Aluksi hyvin pienellä opettamisella botti hävisi kahdelle esimille noin 65% ajasta, kun taas lopullinen versio hävisi kahdelle esimille vain noin 36% ajasta.
L2-K2 kirjoitti:
Satuitko Metabolix tallentamaan tietoa pelien tyypillisestä kestosta siirtoina? (Tai, ylipäänsä vaikka vaan sen raakadatan peleistä.) Olisi mielenkiintoista tietää kuinka iso osa peleistä päättyi lähes heti umpipakan loputtua.
Tallensin kaikki ottelut testausohjelman antamassa formaatissa, tästä voi ladata (8,4 Mt, purettuna 150 Mt) ja analysoida. Jälkikäteen ajatellen tallennusmuoto ei ole optimaalinen pelin kulun hahmottamiseen, mutta replay-taulukosta löytyvät siis erikseen kunkin pelaajan lyömät kortit, ja loput pelilogiikasta pitää vain koodata itse.
Peleistä 870 (eli 5 %) päättyi, ennen kuin mitään avopakasta nostettua korttia oli pelattu uudestaan, ja 5578 (eli 32 %) päättyi, ennen kuin 52 avopakasta nostettua korttia oli pelattu uudestaan.
5420 peliä (eli 31 % kaikista tai 50 % alle 333 kierroksen peleistä) päättyi viimeistään 25. kierroksella, ja 6487 peliä (eli 38 %) päättyi vasta 333 kierroksen rajaan.
Laitoin tulossivulle kuvaajan pelien vuoromääristä. Lyhin peli oli viiden kierroksen mittainen. Parhaimmillaan paras pelaaja on saattanut lopettaa jo toisen vuoronsa jälkeen.
Anaatti kirjoitti:
Aluksi hyvin pienellä opettamisella botti hävisi kahdelle esimille noin 65% ajasta, kun taas lopullinen versio hävisi kahdelle esimille vain noin 36% ajasta.
Kiinnostavaa. Itse koetin tehdä neuroverkolla oppivan tekoälyn. Varmuudeksi tarkastin, että neuroverkkoluokka pystyi oppimaan esim. Monty Hallin kolmen oven ongelman oikein, eli homman olisi pitänyt toimia. Silti kovasta opettamisesta huolimatta neuroverkko ei oppinut Sikaa ja jäi tuonne mainitsemallesi aloitustasolle, joten en viitsinyt laittaa sitä kisaan tuhlaamaan aikaa. Koetin useampaa erilaista syötemäärää ja välikerroksen solujen määrää, eikä tulos siitä muuttunut. Täytyy jatkossa perehtyä lisää neuroverkon opettamiseen.
Hyvin toteutettu kisa tämäkin! Aika usein on kisoja pidetty vuodenvaihteessa, pitääkö odotella sinne asti seuraavaa koitosta?
Katsotaan, mitä syksy tuo tuollessaan.
Joo, yksi idea olisi pelata sanapeliä, jossa hyväksytyt sanat olisi listattu erillisellä listalla. Scrabble, Alfapet, Upwords tms. pohjalta voisi rakennella sitten kivan kisan!
Aihe on jo aika vanha, joten et voi enää vastata siihen.