Tämän kesän ohjelmointikilpailussa tekoälyt pelaavat perinteistä kivi, sakset, paperi -peliä.
Jokainen ohjelma pelaa vuorollaan kutakin muuta vastaan 1000 pelikierrosta, joiden aikana tekoälyllä on mahdollisuus analysoida vastustajan taktiikkaa ja yrittää haalia mahdollisimman monta voittoa. Joka kierroksella voittaja vie yhden pisteen häviäjältä, ellei kierros ole tasapeli.
Kilpailu on nyt alkanut ja päättyy kuukauden kuluttua, heinäkuun 13. päivänä kello 13.37. Aiemminkin saa ja kannattaa ilmoittautua: tekoälyt pelaavat välikierroksen 28.6. tai pian sen jälkeen.
Kilpailusta voi kysellä ja keskustella tässä aiheessa. Tervetuloa mukaan!
Aion osallistua! :D
Loistavasti on ajankohdalla mietitty inttiin lähtijöitä. 13.7 klo 16 pitäis olla säkylässä.
Kuulostaa ihan mielenkiintoiselta. Voisi tällä kertaa koittaa osallistua itsekin. Katsoo nyt minkälaisia ideoita sitä keksii. Tuo välikierros kuulostaa myös hyvältä idealta.
Ollaanko jonkinmoista tekoälyjä peluuttavaa ohjelmaa julkaisemassa, jotta voisi sillä sitten itse testailla mahdollisia luomuksiaan?
Ei tässä kesän temmellyksen keskellä paljoa ole aikaa mutta voihan sitä kokeilla, kun taktiikkakin on jo valmiina!
Ei ole ainakaan tehtävä haastavuudellaan pilattu.
Päärynämies kirjoitti:
Ollaanko jonkinmoista tekoälyjä peluuttavaa ohjelmaa julkaisemassa, jotta voisi sillä sitten itse testailla mahdollisia luomuksiaan?
Minusta erityiselle testausohjelmalle ei ole mitään tarvetta, koska tekoäly kuitenkin lukee syötettä normaalin komentoriviohjelman tavoin ja jokainen voi siis helposti testata sitä itsekin, kunhan tulostaa siirrot tiedoston lisäksi ruudulle. Myös esimerkkiohjelmissa on tehty näin, ja tästä ylimääräisestä tulostuksesta ei sakoteta, vaikka se jäisi lopulliseenkin ohjelmaan.
Olin itseasiassa suunnitellutkin tekeväni kivi, sakset, paperi-tekoälyn, mutta en jaksanut syventyä siihen sen enempää. Nyt kun oikein kilpailu on pykätty pystyyn, niin saattaisin jotain väsätäkkin. Ainakin on koko kesäloma täysin vapaata aikaa.
Ohjeet kirjoitti:
Joka tulostuksen jälkeen ohjelman pitää joko sulkea tiedosto tai varmistaa datan välittyminen flush-funktiolla tai vastaavalla.
Mitäs tämä tarkoittaa? Varmaan riittää, kun käyttää esimerkki-paketin funktioita? :D
petrinm kirjoitti:
Ei ole ainakaan tehtävä haastavuudellaan pilattu.
No eikös tämä ole hyvän kilpailun merkki. Osallistuminen ei ole haastavaa, pärjääminen on.
grandi kirjoitti:
Ohjeet kirjoitti:
Joka tulostuksen jälkeen ohjelman pitää joko sulkea tiedosto tai varmistaa datan välittyminen flush-funktiolla tai vastaavalla.
Mitäs tämä tarkoittaa?
Juuri sitä, mitä siinä sanotaankin. Aloittelijalle ymmärrettävämpi vaihtoehto on tuo ensimmäinen eli tiedoston sulkeminen, se pitäisi varmasti osata, jos tiedostot ovat alkuunkaan tuttuja. Flush-funktiota ei edes ole kaikissa kielissä, tai sen käyttö saattaa vaatia ylimääräisiä kikkailuja.
grandi kirjoitti:
Varmaan riittää, kun käyttää esimerkki-paketin funktioita? :D
Sitä varten ne ovatkin. Kaikki esimerkkiohjelmat on testattu.
perinm kirjoitti:
Ei ole ainakaan tehtävä haastavuudellaan pilattu.
Tarkoitus onkin saada paljon osallistujia. Lopullinen pistejakauma riippuu siitä, montako yksinkertaista tekoälyä (kuten esimerkkiohjelmat) kilpailuun osallistuu, ja siitä, miten hyviä parhaat älyt ovat arvaamaan.
Pitäisikö lisätä sääntö joka kieltää vastustajan siirtojen lukemisen tiedostosta. Kannattaa ottaa huomioon, että C++-esimerkkisi tiedoston avaus funktio tyhjentää tiedoston, joten jos C++-ohjelma ei aloita peliä, ensimmäinen siirto pyyhkiytyy pois tiedostosta. Ovatko sisään tulevat kirjaimet varmasti isolla? Entä pitääkö ohjelman tulostaa isolla? Sakotetaanko siitä, että ohjelma ei sammukaan, kun vastustaja tekee virheen tai peli loppuu?
Sami345 kirjoitti:
Pitäisikö lisätä sääntö joka kieltää vastustajan siirtojen lukemisen tiedostosta.
Vastustajan siirtoja ei ole saatavilla missään tiedostossa, josta tekoäly voisi niitä lukea.
Sami345 kirjoitti:
Kannattaa ottaa huomioon, että C++-esimerkkisi tiedoston avaus funktio tyhjentää tiedoston, joten jos C++-ohjelma ei aloita peliä, ensimmäinen siirto pyyhkiytyy pois tiedostosta.
Tiedostoon ksp.out kirjoitetaan vain yksi siirto. Kun tekoälyt A ja B pelaavat vastakkain, ottelu etenee suunnilleen seuraavasti:
1. Kilpailun järjestävä ohjelma tyhjentää tiedoston ksp.out.
2. Kilpailun järjestävä ohjelma ilmoittaa tekoäly A:lle tekoäly B:n siirron viime kierroksella.
3. Tekoäly A kirjoittaa tämän kierroksen siirtonsa tiedostoon ksp.out.
4. Kilpailun järjestävä ohjelma lukee tekoälyn A tämän kierroksen siirron tiedostosta ksp.out.
5. Kilpailun järjestävä ohjelma tyhjentää tiedoston ksp.out.
6. Kilpailun järjestävä ohjelma ilmoittaa tekoäly B:lle tekoäly A:n siirron viime kierroksella.
7. Tekoäly B kirjoittaa tämän kierroksen siirtonsa tiedostoon ksp.out.
8. Kilpailun järjestävä ohjelma lukee tekoälyn B tämän kierroksen siirron tiedostosta ksp.out.
9. Kilpailun järjestävä ohjelma päivittää pistetilanteen tämän kierroksen siirtojen perusteella.
10. Uusi kierros alkaa kohdasta 1.
Sami345 kirjoitti:
Ovatko sisään tulevat kirjaimet varmasti isolla? Entä pitääkö ohjelman tulostaa isolla?
Kumpaankin kysymykseen vastaus on "kyllä".
Sami345 kirjoitti:
Sakotetaanko siitä, että ohjelma ei sammukaan, kun vastustaja tekee virheen tai peli loppuu?
Järkevintä on toteuttaa tekoäly niin, että se sulkeutuu näissä tilanteissa.
Säännöissä mainitaan:
https://www.ohjelmointiputka.net/kilpa.php?
Aikarajan ylittämisestä tai muusta virheestä seuraa automaattisesti häviö lopuilla pelikierroksilla. Jos kuitenkin molemmat tekoälyt tekevät virheen samalla kierroksella, loput pisteet jätetään jakamatta. Myös virhetilanteessa kummallekin ohjelmalle syötetään kirjain L ja peli päättyy.
Satunnaisuudesta vielä sen verran, että saako pseudo-satunnaisuus perustua aikaan? Luulen että ei, koska standardikirjaston satunnaisuuskin perustuu aikaan. Voiko tekoäly käyttää prosessoria vastustajan ajalla?
Ihan mielenkiintoinen kilpailu kyllä, mutta luulen että turhan moni ohjelma arpoo enemmän tai vähemmän vastauksensa.
ZcMander kirjoitti:
Satunnaisuudesta vielä sen verran, että saako pseudo-satunnaisuus perustua aikaan? Luulen että ei, koska standardikirjaston satunnaisuuskin perustuu aikaan.
Säännöissä ilmasitaan minusta ihan selvästi, että tuloksen tulee olla jokaisella ajokerralla samanlainen. Aikaan perustuva satunnaisuus on ulkona kuvioista.
ZcMander kirjoitti:
Ihan mielenkiintoinen kilpailu kyllä, mutta luulen että turhan moni ohjelma arpoo enemmän tai vähemmän vastauksensa.
Silloin turhan moni hylätään...
ZcMander kirjoitti:
Satunnaisuudesta vielä sen verran, että saako pseudo-satunnaisuus perustua aikaan?
Ei saa niin, että aika vaikuttaisi tekoälyn toimintaan:
https://www.ohjelmointiputka.net/kilpa.php?
Kun siis kaksi älyä laitetaan ottelemaan keskenään, ottelun on joka kerta kuljettava täsmälleen samalla tavalla riippumatta kellonajasta, tietokoneesta tai säätilasta!
ZcMander kirjoitti:
Luulen että ei, koska standardikirjaston satunnaisuuskin perustuu aikaan.
Yleensä ohjelmoija voi valita siemenluvun kellonajan mukaan, mutta tämä ei ole mitenkään pakollista.
ZcMander kirjoitti:
Voiko tekoäly käyttää prosessoria vastustajan ajalla?
Tämä ei ole sallittua.
Antti Laaksonen kirjoitti:
ZcMander kirjoitti:
Voiko tekoäly käyttää prosessoria vastustajan ajalla?
Tämä ei ole sallittua.
Siinä tapauksessa kyseinen rajoitus olisi periaatteessa hyvä lisätä sääntöihin, sillä prosessorin käyttö vastustajaa odotellessa (sikäli kun vastustajan ajalla toimiminen viittaa tähän) on mahdollista toteuttaa yhdessä säikeessä asynkronisten IO-operaatioiden avulla.
Toisaalta taas en ymmärrä, mitä väliä on sillä, millä ajalla prosessoria käytetään, jos kaikki käytetty prosessoriaika kuitenkin lasketaan.
Odotetaan vielä Metabolixin (kilpailun järjestäjän) vahvistusta asiaan. Tämä ei kuitenkaan liene kynnyskysymys tekoälyn toteutuksessa, koska kaiken saman laskennan voi tehdä jo ennen vastustajan siirron odotusta.
Kuulostaisi aika hurjalta vaatimukselta, että tekoäly ei saisi käyttää prosessoria lainkaan vastustajan vuorolla.
Toki varmaan monissa kielissä on mahdollista kutsua sleep(1000000) käyttöjärjestelmältä, jolloin suoritus palaa ohjelmaan vasta kun 1000 sekuntia kuluu tai käyttäjältä tulee syötettä. Mutta joissain tarjolla olevissa kielissä saattaa olla ettei tuo toimi ja syötteen odottaminen tehdään kielen muodostamassa loopissa jossa kutsutaan lyhyempiä sleeppejä. Tällöin ohjelma kuluttaisi syötettä odottaessa väkisinkin hieman prosessoria.
Olen samalla kannalla os:n kanssa, että moinen rajoitus olisi lähtökohtaisestikin järjetön. Ja jos joku keksii edes perusteen ko. säännölle, niin olisi silti mielestäni kohtuutonta vaatia, että käyttäjän tulisi selvittää miten Metabolixin käyttämät kääntäjät tulee asioita toteuttamaan. Olisi kiva tehdä peli Javalla ja hävitä sen takia kun Javan roskienkeruu iskee vastustajan vuoron aikana :D
Olette oikeassa, kirjoitin vastauksen ajattelematta asiaa riittävästi.
Pitääpi osallistua, toss tulikin jo pari toteutustapaa mieleen...
Edit: Voiko tekoälyn tehdä jonkin kaverin kanssa? Pistää vaan sen nimen sitten mukaan...
Jos ohjelma lukee tiedostosta sattumanvaraisesti generoituja valintoja, ohjelman valinnat eivät muutu eri suorituskerroilla ja olisi ilmeisesti sääntöjen mukainen. Vastustaja ei kuitenkaan pysty mitenkään päättelemään ohjelman seuraavaa siirtoa, koska valinnoilla ei olisi mitään loogista suhdetta toisiinsa. En käsitä miksi tälläistä ei ole kielletty, koska on sama muuttuvatko valinnat suorituskerrasta toiseen, kunhan ne vain ovat satunnaisia.
Voi tosin olla, että ymmärsin täysin väärin.
Hyvä kilpailuidea, kiitokset järjestämisestä.
grandi kirjoitti:
En käsitä miksi tälläistä ei ole kielletty
Koska tuollaisella pelitavalla tuskin sijoittuu kärkeen.
grandi kirjoitti:
En käsitä miksi tälläistä ei ole kielletty,
Miksi satunnaisuus pitäisi kieltää?
Täysin satunnainen tekoäly (aina 1/3 todennäköisyys joka vaihtoehdolle) on kieltämättä vähän tylsä, mutta myös päättelevä tekoäly voi käyttää satunnaisuutta apuna. Se voisi esimerkiksi painottaa eri vaihtoehtoja eri tavalla historian perusteella, mutta kuitenkin lopulta arpoa valintansa.
grandi kirjoitti:
koska on sama muuttuvatko valinnat suorituskerrasta toiseen, kunhan ne vain ovat satunnaisia.
Jos kaksi suunnilleen yhtä hyvää ei-determinististä tekoälyä ottelevat keskenään, voittaja voi vaihdella eri ajokerroilla. Mutta kun molemmat ovat deterministisiä, kuka tahansa voi ajaa ohjelmat itse omalla koneellaan ja saada saman tuloksen, joten siitä on turha kiistellä. ("Jos olisit käynnistänyt ohjelmani 42ms myöhemmin, se olisi voittanut!11!!!")
Ohjelman toteutus niin että se toimii samalla tavalla joka ajokerralla ei ole juurikaan vaikeampaa kuin ilman tätä vaatimusta, joten minusta se on ihan hyvä sääntö.
Toivottavasti tällä kerralla saan jonkinlaisen tekoälyn aikaiseksi, vaikkei kps ihan lempipeleihini kuulukaan.
Mjaah.. ainakin vertailukohdaks vois pistää täyssatunnaisen valinnan tekevän botin?
moptim kirjoitti:
Mjaah.. ainakin vertailukohdaks vois pistää täyssatunnaisen valinnan tekevän botin?
Sellaista vastaan ei voi saada keskimäärin parempaa tai huonompaa tulosta kuin 50%, joten mielenkiintoa se ei juurikaan lisäisi. Luultavasti joku kuitenkin sellaisella osallistuu, onhan se tietyssä mielessä täydellinen strategia.
funktio kirjoitti:
Luultavasti joku kuitenkin sellaisella osallistuu, onhan se tietyssä mielessä täydellinen strategia.
Jep. Teki sitten miten hyvän tekoälyn tahansa, mahdollisuudet tuollaista vastaan olisi aina samat. Mielestäni ei oikein kuulu kilpailun henkeen, mutta anti olla :P
Tuossa Java-esimerkkiä testatessani huomasin siinä erään ongelman. Kun tiedoston tyhjentää silloin kun ohjelma on odottamassa syötettä (eli normaaliaikaan), niin seuraavalla kirjoituskerralla ohjelma kirjoittaa kolme nullia tiedoston alkuun ja vasta tämän jälkeen valitun siirron.
Muuta ratkaisua en itse tähän ainakaan keksinyt, kuin tiedoston uudelleenavaamisen jokaisella kirjoituskerralla.
Tietenkin jos peluuttajaohjelma osaa huomioida tämän, niin ongelmaa ei ole, mutta ajattelin ilmoittaa tästä nyt kuitenkin.
Jos et halua avata uudestaan, niin kokeile seekata tiedoston alkuun...
Askarruttaa tuo luuppi jolla vastustajan siirrot luetaan. Pascal esimerkki lukee näin:
function lue: Char; var m: Char; begin ReadLn(m); lue := m; end;
Ja tuo laitettu vaan 1000 kertaa for-silmukkaan... Mitä jos vastustajan vastaamisessa kestää pitempään kuin mitä toisella tekoälyllä? Ei Readln() käsittääkseni jää odottamaan että uusi rivi ilmestyy tiedostoon.
Edit: Ups, eihän tuo lue edes tiedostoa... Ideana on siis että pääohjelma kirjottaa sen tiedostosta konsoliin ja "painaa enteriä"?
funktio kirjoitti:
moptim kirjoitti:
Mjaah.. ainakin vertailukohdaks vois pistää täyssatunnaisen valinnan tekevän botin?
Sellaista vastaan ei voi saada keskimäärin parempaa tai huonompaa tulosta kuin 50%, joten mielenkiintoa se ei juurikaan lisäisi. Luultavasti joku kuitenkin sellaisella osallistuu, onhan se tietyssä mielessä täydellinen strategia.
Mulla on semmonen vahva tunne, että jos vastustaja tekee ksp-valintansa satunnaisesti, vaikka ottamalla siemenen tosta kierrosluvusta tms, niin eikös se todennäköisyys noille kolmelle vaihtoehdolle muutu joka kierroksella? Siis siten että pystyisin arvaamaan vastustajan seuraavan valinnan.
Arpominen on mustakin tosi huono taktiikka, mutta eiköhän joku semmosellakin osallistu.
Nonni äly palautettu.
pipo kirjoitti:
Mulla on semmonen vahva tunne, että jos vastustaja tekee ksp-valintansa satunnaisesti, vaikka ottamalla siemenen tosta kierrosluvusta tms, niin eikös se todennäköisyys noille kolmelle vaihtoehdolle muutu joka kierroksella? Siis siten että pystyisin arvaamaan vastustajan seuraavan valinnan.
No jos käytetyt (pseudo)satunnaisluvut ja ohjelman toiminta ovat yleisessä tiedossa ennen kisaa, niin joka kierroksella tehty valinta tehdään todennäköisyydellä 1 ja vastustaja voi voittaa joka pelin. Mutta tietenkään sitä ei kerrota etukäteen. Jos käytetty algoritmi on hyvä, ei valintoja voi päätellä etukäteen.
pipo kirjoitti:
Arpominen on mustakin tosi huono taktiikka
Huono ja huono, se on sentään ainoa strategia jota on mahdoton voittaa.
funktio kirjoitti:
No jos käytetyt (pseudo)satunnaisluvut ja ohjelman toiminta ovat yleisessä tiedossa ennen kisaa, niin joka kierroksella tehty valinta tehdään todennäköisyydellä 1 ja vastustaja voi voittaa joka pelin. Mutta tietenkään sitä ei kerrota etukäteen. Jos käytetty algoritmi on hyvä, ei valintoja voi päätellä etukäteen.
Mikä estäisi kovakoodaamasta sinne koodiinsa täydellisellä satunnaislukugeneraattorilla (todennäköisyys jokaiselle alkiolle täsmälleen sama ja kaikki arvotut arvot ovat täysin toisistaan riippumattomia) arvottuja arvoja 1000 kappaletta, jolloin edellisistä arvoista ei pystyisi millään päättelemään tulevia arvoja.
Sami kirjoitti:
Mikä estäisi kovakoodaamasta sinne koodiinsa täydellisellä satunnaislukugeneraattorilla (todennäköisyys jokaiselle alkiolle täsmälleen sama ja kaikki arvotut arvot ovat täysin toisistaan riippumattomia) arvottuja arvoja 1000 kappaletta, jolloin edellisistä arvoista ei pystyisi millään päättelemään tulevia arvoja.
Ei mikään, taisin ymmärtää pipon pointin väärin. Sain kohdasta "ottamalla siemenen tosta kierrosluvusta" sen käsityksen, että vastustaja tietää tarkalleen, miten "satunnaiset" valinnat tehdään ja pystyy näin "arvaamaan" ne, ja yritin sanoa, että tietenkään sitä ei tiedetä.
Grez kirjoitti:
Jos et halua avata uudestaan, niin kokeile seekata tiedoston alkuun...
Näinhän se tosiaan menee, en ollut Javassa seekkaustoimintoa nähnyt tätä aikaisemmin vaan, mutta oppi nyt sitten senkin.
Kuitenkin pointtina oli myös tuoda yleiseen tietoon tuo ongelma siinä mielessä, jos joku suoraan testaamatta tuota koodia käyttää ja näin mahdollisesti tulisi sitten diskatuksi.
Mitä tapahtuu jos kumpikin tekee samalla kierroksella virheen?
Daeron kirjoitti:
Mitä tapahtuu jos kumpikin tekee samalla kierroksella virheen?
Tuolla kilpailusivullahan se kerrotaan:
Kilpailusivu kirjoitti:
Jos kuitenkin molemmat tekoälyt tekevät virheen samalla kierroksella, loput pisteet jätetään jakamatta.
funktio kirjoitti:
moptim kirjoitti:
Mjaah.. ainakin vertailukohdaks vois pistää täyssatunnaisen valinnan tekevän botin?
Sellaista vastaan ei voi saada keskimäärin parempaa tai huonompaa tulosta kuin 50%, joten mielenkiintoa se ei juurikaan lisäisi. Luultavasti joku kuitenkin sellaisella osallistuu, onhan se tietyssä mielessä täydellinen strategia.
Köh, siis että jos moptim pelaa satunnaisilla valinnoilla, ja minä pelaan aina kivellä, niin eihän mun voiton todennäköisyys ole lähelläkään 50 prosenttia, eikö niin.
Lisäksi jos moptim pelaa satunnaisesti, ja on viimeisten vaikka 50 kierroksen aikana arponut itselleen eniten papereita, niin eihän mun kannata valita seuraavaksi saksia vaan joku muu. Johtuen siis mun tunneperäisestä arvauksesta että tilastot tasoittuu kiven ja saksien suuntaan. Onhan hyvin todenäköistä että kaikkia vaihtoehtoja arvotaan suunnilleen saman verran ja samassa suhteessa koko ottelun ajan, vai?
Valinnathan voi kyllä arpoa etukäteen, ennen kilpailuun osallistumista. Ja niitä voi sörkkiä mielensä mukaan, mutta pointti siis tossa todennäköisyyslaskennassa.
Olennainen kysymyshän on, että saako yksi henkilö osallistua kilpailuun yli yhdellä tekoälyllä?
Ei kai toi kauhean olennainen kysymys ole? Mutta jokainen osallistuu yhdellä tekoälyllä tähän kuten kaikkiin muihinkin kilpailuihin.
pipo kirjoitti:
Köh, siis että jos moptim pelaa satunnaisilla valinnoilla, ja minä pelaan aina kivellä, niin eihän mun voiton todennäköisyys ole lähelläkään 50 prosenttia, eikö niin.
Kyllä jos toinen pelaa täysin satunnaisesti, niin täysin riippumatta vastustajan strategiasta kumpikin saa voitoista 50%. (Sitä suurempi varianssi, mitä vähemmän kierroksia)
pipo kirjoitti:
Johtuen siis mun tunneperäisestä arvauksesta että tilastot tasoittuu kiven ja saksien suuntaan.
Todennäköisyydet eivät millään tavalla "tasoitu". Vaikka olisi tullut 100 kiveä putkeen on yhtä todennäköistä että seuraavilla kierroksilla tulee kiviä, saksia tai papereita.
Grez kirjoitti:
Kyllä jos toinen pelaa täysin satunnaisesti, niin täysin riippumatta vastustajan strategiasta kumpikin saa voitoista 50%. (Sitä suurempi varianssi, mitä vähemmän kierroksia)
Onneksi tälläisellä ei pääse kuin keski sijoituksille kilpailussa. Koska päättelevistä tekoälyistä parempi vie pisteet niiden keskisissä kamppailuissa. Toki jos kaikki tekoälyt olisivat "arpovia", ei kukaan erottuisi joukosta.
Vielä lopuksi, mistä löytyy yleiset putkakilpailusäännöt, mm. siitä että saa osallistua vain yhdellä tekoälyllä?
Pelin päättymisajankohta ei liene satunnaisesti valittu.
Peli kestää 1000 kierrosta, eli ei ole satunnaisesti valittu.
Edit, vai tarkoitatko kellon aikaa tai vastaavaa?
Tässä seuraa tarkennuksia joihinkin esitetyihin kysymyksiin:
lainaus:
Sakotetaanko siitä, että ohjelma ei sammukaan, kun vastustaja tekee virheen tai peli loppuu?
Esimerkki: 3. kierroksella äly A tekee virheen ja äly B tulostaa merkin K. Sääntöjen mukaan tässä vaiheessa äly B on voittanut pelin, koska vastustaja teki virheen. Sitä ei siis varsinaisesti sakoteta, vaikka se tekisi seuraavalla kierroksella virheen, koska seuraavaa kierrosta ei enää pelata. (Tarkkaan ottaen äly tapetaan väkisin muutaman sekunnin kuluttua ottelun päättymisestä, jos se ei sulkeudu itse.) Kuten Antti sanoi, kannattaa kuitenkin sulkea äly itse — vaiva ei ole suuri.
lainaus:
Pelin päättymisajankohta ei liene satunnaisesti valittu.
Ei, peli kestää tasan 1000 kierrosta PAITSI jos ottelu keskeytetään virheen takia.
lainaus:
Voiko tekoäly käyttää prosessoria vastustajan ajalla?
Aikaa ei ole erityisesti jaettu eri älyjen aikoihin, vaan tarkistuksessa käytetään käyttöjärjestelmän kirjanpitoa siitä, kuinka kauan kukin ohjelma on käyttänyt prosessoria. Ohjelma voi siis laskea periaatteessa aivan milloin haluaa, mutta aikaraja on ehdoton. Silloin, kun ohjelma lukee syötettä normaaleilla funktioilla, käyttöjärjestelmä jättää sen automaattisesti odottamaan dataa.
lainaus:
Ideana on siis että pääohjelma kirjottaa sen tiedostosta konsoliin ja "painaa enteriä"?
Kyllä, ohjelma saa syötteen täsmälleen samalla tavalla kuin silloin, kun käyttäjä ajaa sen itse komentoriviltä. Ainakin Linuxissa tämä on erittäin helppo toteuttaa.
lainaus:
Kannattaa ottaa huomioon, että C++-esimerkkisi tiedoston avaus funktio tyhjentää tiedoston.
lainaus:
Tuossa Java-esimerkkiä testatessani huomasin siinä erään ongelman. – –
Ohjelman ei tarvitse kantaa huolta tällaisista asioista, eikä kilpailuohjelma missään vaiheessa varsinaisesti tyhjennä tiedostoa. Tiedoston saa ylikirjoittaa alusta asti, sitä saa jatkaa lopusta (append), tai sen voi pitää auki, kuten esimerkissä. Tässä tapauksessa lopputulos on loihdittu samaksi.
Asian tekninen tausta: Alunperin oli tarkoitus, että syötettä sekä luettaisiin että kirjoitettaisiin kuten komentoriviohjelmassa yleensä ja standardivirrat ohjattaisiin kilpailuohjelmalle putkien kautta. Testeissä kuitenkin ilmeni, että uudelleenohjatuissa virroissa tuloste ei tule kilpailuohjelmalle asti ilman flush-kutsua. Joissakin kielissä flush-funktio on hankalan kikkailun takana, joten oli yksinkertaisinta siirtää tulostus tiedostoon, jolloin tiedoston sulkeminen ajaa saman asian. Tulostetiedosto on kuitenkin oikeasti suunnitelman mukaan putki.
lainaus:
Vielä lopuksi, mistä löytyy yleiset putkakilpailusäännöt, mm. siitä että saa osallistua vain yhdellä tekoälyllä?
Yleisiä sääntöjä ei ole laadittu. En kuitenkaan usko, että moni jaksaa kirjoittaa useampaa (erilaista) älyä samaan kilpailuun. Voin peluuttaa ylimääräisiäkin älyjä, jos siinä on jotain järkeä (omaperäinen idea tms. kiinnostavaa), mutta varsinaiseen kilpailuun voi osallistua vain yhdellä tekoälyllä.
Jos jokin kysymys jäi vielä huomaamatta tai epäselväksi, saa kysyä lisää. Viestejä olikin tullut melkoisesti.
Lainaus kilpailuohjeista:
lainaus:
Kilpailun puolivälissä, 28.6. tai pian sen jälkeen, pelataan muutama ottelu niiden älyjen kesken, jotka on jo silloin lähetetty. Tulokset julkaistaan, ja osallistujat voivat vielä parannella tekoälyjään ennen lopullista kilpailua.
Eli tässä puolivälin mittelössä ilmeisesti julkistetaan ottelujen siirtosarjat ja pisteytys. Ei varmaankaan tekoälyjen koodeja? Näin oletan, varmistan vain.
Niin, tarkoitin siis kilpailun loppumiskellonaikaa. :P
Chiman kirjoitti:
Eli tässä puolivälin mittelössä ilmeisesti julkistetaan ottelujen siirtosarjat ja pisteytys. Ei varmaankaan tekoälyjen koodeja?
Juuri näin. Koodien julkaiseminen taitaisi viedä kilpailusta pohjan.
Onko monta älyä jo ilmottautunut? Tosin nyt on vasta 2. päivä niin ei luulis hirveän montaa olevan.
Johonkin voitaisiin listata jo-osallistuneiden tekoälyjen nimet, että tietää sitten mitä nimeä ei itse valitse.
PS. Voisko joku ylläpitäjä vaihtaa nimimerkkini ensimmäisen kirjaimen isoksi? Siis grandi -> Grandi.
EDIT: Kiitos :)
tuo grandin ehdotus on kyll ihan hyvä, ne nimet vois listata vaikka sinne kilpailu sivun alalaitaan.
Grandi kirjoitti:
Voisko joku ylläpitäjä vaihtaa nimimerkkini ensimmäisen kirjaimen isoksi?
Toiveesi on toteutunut.
Metabolix kirjoitti:
Chiman kirjoitti:
Eli tässä puolivälin mittelössä ilmeisesti julkistetaan ottelujen siirtosarjat ja pisteytys. Ei varmaankaan tekoälyjen koodeja?
Juuri näin. Koodien julkaiseminen taitaisi viedä kilpailusta pohjan.
Protip kaikille random älyn tekijöille: Kannattaa vaihtaa ohjelman seed-luku sen jälkeen kun puolivälin tulokset ja siirtosarjat on julkaistu.
Niin, julkaistaanko niiden älyjen nimiä, jotka on jo lähettetty kisaan?
Nyt kilpailusivulla on lista älyistä osallistumisohjeen lopussa.
Juup, pitääpä yrittää osallistua.
Opassivu kirjoitti:
Voittaja voi lunastaa seuraavassa Putkamiitissä kiven, sakset tai paperin. Palkinto arvotaan reilulla kivi, sakset, paperi -arvonnalla.
:)
Metabolix kirjoitti:
Chiman kirjoitti:
Eli tässä puolivälin mittelössä ilmeisesti julkistetaan ottelujen siirtosarjat ja pisteytys. Ei varmaankaan tekoälyjen koodeja?
Juuri näin. Koodien julkaiseminen taitaisi viedä kilpailusta pohjan.
Kannattaakohan siirtosarjojakaan julkaista? Niitä tutkimalla saattaisi saada turhan paljon selville.
funktio kirjoitti:
Kannattaakohan siirtosarjojakaan julkaista? Niitä tutkimalla saattaisi saada turhan paljon selville.
Kukaan ei pakota lähettämään tekoälyä vielä välivaiheeseen, kyseessä on kilpailijan oma päätös. Toisaalta jos ei lähetä tekoälyään, ei myöskään saa selville, miten juuri se pärjää muita vastaan. Sikäli olet kyllä oikeassa, että jos tekoälystä tulee lopultakin hyvin yksinkertainen, ei ehkä kannata lähettää sitä ennen kilpailun puoliväliä, etteivät toiset saa kehitettyä juuri sitä vastaan täydellistä algoritmia.
Tarkennan vielä varmuuden vuoksi, että välierän tuloksia ei lasketa lopullisiin pisteisiin. Välivaiheeseen voi siis huoletta lähettää tekoälyn, jonka tarkoituksena on vain testata muiden toimintatapoja tai johtaa kehitystä harhaan.
Miksi rajoitus, että ohjelman pitää toimia yhdessä säikeessä?
Oikea taikatemppu löytyikin aivan yllättäen, joten seuraa muutos sääntöihin: Ohjelma tulostaa vastauksensa tavallisilla tulostusfunktioilla. Ohjelma voi siis tulostaa komentorivillä ruudulle. Tiedostoja tai muita ylimääräisiä kikkoja ei tarvita. (Säännöissä aiemmin mainittu toimintatapa on yhä sallittu, jos joku välttämättä haluaa käyttää sitä.)
jalski kirjoitti:
Miksi rajoitus, että ohjelman pitää toimia yhdessä säikeessä?
Millaista hyötyä useasta säikeestä tässä tapauksessa olisi?
Yhdessä säikeessä ohjelma toimii paremmin deterministisesti, monisäikeisen ohjelman lopputulokseen voisivat vaikuttaa säikeiden suoritusten vaihtelevat ajoitukset. Yksisäikeisen ohjelman toimintaa on myös helpompi valvoa kilpailutilanteessa.
Eli ei tarvitse enään tiedostonkäsittelyä missään vaiheessa?
Koodi vähenee mukavasti, ku voi poistaa tiedostonkäsittelyn... :P
No juu on jo nyt vähän paranneltu älyä, pitää sitten lähettää toiselle kierrokselle uuden datan kanssa.
ps. Tuota on tosi hankala voittaa ainakaan itse :) Miks? No ei ainakaan ole 100% random.
Ajatuksissa olisi idea-asteella toteutus, mikä olisi ehkä luontevampi toteuttaa monisäikeisenä.
Tarkoitus olisi saada ohjelma pelaamaan eri tekoälyjä vastaan eri tavalla. Ohjelman seuraava siirto riippuisi edellisten siirtojen historiasta muutaman neuroverkon avulla. ensimmäinen neuroverkko palauttaisi tiedon, onko muistissa vastaavaa siirtokuviota, antaisi bittivirheen ja palauttaisi lähimmän vastaavuuden muistista. Oma säie opettaisi neuroverkkoa tarvittaessa (jos siirtokuviota ei löydy muistista). Toinen neuroverkko tallentaisi ja palauttaisi siirtokuviota mahdollisesti seuraavan siirron. Kolmas neuroverkko palauttaisi edellisen verkon avulla ennakoidun siirron peittoavan tuloksen.
jalski kirjoitti:
Ajatuksissa olisi idea-asteella toteutus, mikä olisi ehkä luontevampi toteuttaa monisäikeisenä.
Millä tavalla luontevampi? Minusta suunnitelmassasi on kolme peräkkäistä vaihetta, jotka ovat täysin riippuvaisia toisistaan. Näiden suorittaminen epäsynkronisesti rikkoisi deterministisyyttä koskevaa sääntöä. Ohjelmasta tulee myös varmasti lyhyempi ja tehokkaampi, kun siihen ei tarvitse sotkea lukituksia ja synkronointeja.
Kun tarkkaan mietit, niin kaikkien vaiheiden ei tarvitse olla peräkkäisiä:
Ensimmäisen neuroverkon tarkoitus olisi vain toimia muistina kilpailevan tekoälyn aiemmista peräkkäisistä siirroista. Verkkoon tallennetaan esim. vastapuolen tekemät kolmen peräkkäisen siirron sarjat bitti-vektoreina (olikohan Hoppfield-verkko?). Verkolle, kun syöttää vastapuolen kolme edellistä siirtoa palauttaa se joko alkuperäisen vektorin tai verkon muistissa sitä lähimpänä olevan sekä bittivirheen.
Säie, joka on vastuussa ensimmäisen verkon opettamisesta voi toimia taustalla, koska käyttäisin jokatapauksessa ensimmäisen verkon palauttamaa vektoria (verkon muistissa lähimpänä oleva vektori) toisen neuroverkon syötteenä.
Toisen neuroverkon (Hebbian-verkko?)tehtävänä olisi siis tallentaa ja palauttaa muistissa olevaa peräkkäistä siirtosarjaa "todennäköisesti" seuraava siirto.
Toista neuroverkkoa opettava säie pitäsi synkronoida muiden kanssa, jotta opetus tapahtuisi oikea aikaisesti ilman kilpailutilanteita.
Kolmas neuroverkko (Hebbian-verkko) olisi vastuussa oikean valinnan tekemisestä toisen verkon palauttaman syötteen mukaan. Tämä verkko olisi opetettu valmiiksi palauttamaan oikean vaihtoehdon (esim. kivi -> paperi).
Teen ohjelmointityöt yleensä Infernon Limbolla ja säikeiden synkronisoinnit saa hoidettua mukavasti käyttämällä kanavia apuna. C:llä ohjelmoitaessa tykkään eniten Plan 9 -käyttöjärjestelmän mallista: http://lsub.org/who/nemo/9.intro.pdf
jalski kirjoitti:
Säie, joka on vastuussa ensimmäisen verkon opettamisesta...
... täytyy synkronoida niin, että opettaminen on hoidettu siinä vaiheessa, kun verkkoa seuraavan kerran tarvitaan. Siispä opettamisen voi aivan hyvin tehdä kokonaan joko siinä vaiheessa, kun opetettava asia on selvillä, tai silloin, kun verkkoa taas tarvitaan.
jalski kirjoitti:
Kolmas neuroverkko...
... on silkkaa ajanhukkaa, kun saman asian voi tehdä lyhyellä ehtolauseella. On siis aivan turha väittää, että sille tarvitsisi säikeen.
Et ole vieläkään tainnut ajatella asiaa loppuun asti. Verkkojen opettamisen voit joka tapauksessa aloittaa aina vasta, kun saat tietää vastustajan siirron (sitähän niille opetetaan), ja opettamista seuraa heti seuraavan oman siirron valinta. Käytännössä siis verkon 2 opetus voi pyöriä taustalla tasan sen aikaa, kun verkosta 1 haetaan tulosta, ja verkon 1 opetus taas ei lainkaan. Korjaa toki ja piirrä kaavio, jos olen väärässä.
Säikeillä...
tulosta lue aloita opetussäie 1 aloita opetussäie 2 odota opetusta 1 laske verkon 1 tulos odota opetusta 2 laske verkon 2 tulos
... vai ilman?
tulosta lue opeta verkkoa 1 laske verkon 1 tulos opeta verkkoa 2 laske verkon 2 tulos
Yrität minusta nyt tehdä yksinkertaisesta asiasta hirveän mutkikkaan.
Metabolix kirjoitti:
Oikea taikatemppu löytyikin aivan yllättäen, joten seuraa muutos sääntöihin: Ohjelma tulostaa vastauksensa tavallisilla tulostusfunktioilla. Ohjelma voi siis tulostaa komentorivillä ruudulle. Tiedostoja tai muita ylimääräisiä kikkoja ei tarvita. (Säännöissä aiemmin mainittu toimintatapa on yhä sallittu, jos joku välttämättä haluaa käyttää sitä.)
No miten kommunikointi vastustajabotin kanssa tapahtuu? Ei kai se osaa komentoriviltä niitä siirtoja lukea / ei kai se osaa syöttää niitä valintoja inputin kautta?
Grandi kirjoitti:
No miten kommunikointi vastustajabotin kanssa tapahtuu? Ei kai se osaa komentoriviltä niitä siirtoja lukea?
Osaahan ohjelma nyt syötepuskurin lukea? Esimerkkiohjelmissa oli ainakin oikein hyvät esimerkit lukemiseen ja tulostamiseen.
Joo, siltä vaikuttaa. Katsoin nuo esimerkit hieman hutaisten.
Mielestäni, jos halutaan tekoäly-ohjelmalla matkia ihmisaivojen toimintaa on ongelmanratkaisu luontevampaa jakaa prosesseihin, jotka toimivat itsenäisesti ja keskustelevat toistensa kanssa.
Samasta syystä käytän mielummin kolmatta neuroverkkoa lopullisen vastauksen saamiseen yksinkertaisen vertailun sijaan.
Alla hahmotelma toteutettuna Infernolle Limbolla käyttäen säikeitä ja kanavia. '+'-merkillä on merkattu liikenteen suunta kanavassa.
--+input--+monitor--+net1--+net2--+net3--+ + | | | | + | train_net1--+train_net2 | + | | *----------------------*
Sääntöjen kirjoittaja kirjoitti:
Valmista dataa saa olla enintään yksi megatavu.
Tarkoittaako tämä erillisiä datatiedostoja, vai myös lähdekoodia?
Tuskinpa lähdekoodin koko on niin suuri, että sillä on suurtakaan merkitystä tuohon maksimimäärään, vaikka megatavuraja koskisikin datan ja lähdekoodin yhteismäärää. Muutenhan lähdekoodiin voisi helposti sisällyttää rajattomasti dataa.
Grandi kirjoitti:
Sääntöjen kirjoittaja kirjoitti:
Valmista dataa saa olla enintään yksi megatavu.
Tarkoittaako tämä erillisiä datatiedostoja, vai myös lähdekoodia?
Rajoitus koskee dataa. Jos kuitenkin kooditiedosto sisältää merkittäviä datamääriä, sekin lasketaan kokonaan mukaan, jottei sääntöä pääse kiertämään.
Toteutin ja testasin eilen kolme kappaletta oman ideoimani toteutuksen tarvitsemaa neuroverkkoa. Yhden valmiiksi opetetun ja kaksi pelin aikana oppivaa verkkoa.
Jos kilpailukoneelle olisi mahdollista saada Inferno asennettua, niin saattaisin innostua tekemään ohjelman, mikä täyttää kilpailussa asetetut vaatimukset.
jalski kirjoitti:
Jos kilpailukoneelle olisi mahdollista saada Inferno asennettua...
Se ei näköjään ollut mahdollista (asennusohjelma jumittui täysin), ja muutenkin epäilen, että mielekäs ajanotto ja ohjelman toiminnan valvonta olisi tuollaisessa ympäristössä mahdotonta (ts. vaatisi huomattavan määrän erityisesti siihen tarkoitukseen kirjoitettuja apuvälineitä, ehkä paljon enemmän kuin tähän mennessä yhteensä).
Voisitko jalski harkita jonkin muun työkalun käyttöä, koska olisi kuitenkin hauskaa saada sinunkin älysi mukaan kilpailuun?
Metabolixin sallimaa kielivalikoimaa ei voi arvostella suppeaksi:
https://www.ohjelmointiputka.net/kilpa.php?
Testikoneessa on Java-kehitysympäristö, GCC:n C-, C++-, Objective-C- ja Fortran-kääntäjät, Haskell-kääntäjä (GHC), Brainfuck-kääntäjä, Free Pascal ja FreeBASIC sekä Python-, Ruby-, Perl- ja PHP-tulkit ja Mono-ympäristö, jossa voi ajaa .Net-ohjelmia.
Infernon linux-version asennusohjelma ei vissiin tällä hetkellä toimi.
Osoitteessa: http://code.google.com/p/inferno-npe/downloads/list
Löytyy paketit Infernon svn 408 buildille linuxille ja windowssille. Lisäksi tarvitset fontit virallisesta asennuspaketista.
Infernolle kirjoitetun ohjelman voi ajaa shellistä suoraan käynnistämällä: emu ohjelma
Miten kilpailun voittajat valitaan? Arvostellaanko jokainen kaksinpelisarja voitto-tappio-tasapeli tyyliin vai lasketaanko kaikkien pelien voitettujen käsien yhteismäärä kokonaistulokseksi?
Julkaistaako lähdekoodit kaikkien saataville välivaiheessa?
Mielenkiintoinen kilpailu kieltämättä. Katsotaan saanko minkäänlaista älyä aikaiseksi. Kovin haastehan tässä on kehittää tekoäly, joka pystyy ennakoimaan ja "tietämään" vastustajan seuraavan siirron.
Moiman kirjoitti:
Julkaistaako lähdekoodit kaikkien saataville välivaiheessa?
Metabolix kirjoitti:
Chiman kirjoitti:
Eli tässä puolivälin mittelössä ilmeisesti julkistetaan ottelujen siirtosarjat ja pisteytys. Ei varmaankaan tekoälyjen koodeja?
Juuri näin. Koodien julkaiseminen taitaisi viedä kilpailusta pohjan.
FooBat kirjoitti:
Miten kilpailun voittajat valitaan?
Voitettujen käsien määrä ratkaisee. Tämä lienee reiluin arvostelu, koska onhan 900 kättä voittanut parempi kuin 501 kättä voittanut, vaikka kumpikin näistä voittaakin yksittäisen ottelun. (Varsinaisten käsien lisäksi tietenkin lasketaan vastustajan virheen takia implisiittisesti voitetut kierrokset.)
Muistutus: Kilpailun välikierrokselle ehtii mukaan sunnuntai-iltaan asti. Pelidata julkaistaan maanantaina. Vain pelien kulku ja lopputulokset julkaistaan, ei minkäänlaisia virallisia välituloksia tai muita tilastoja.
Jos johonkin ilmoittautumis- tai päivitysviestiin ei ole tullut vastausta, nyt on sopiva hetki lähettää viesti uudestaan.
Välierät on nyt pelattu ja siirtosarjat julkaistu. Kiitos jo tässä vaiheessa kaikille osallistujille: näyttää, että tästä tulee oikein hyvä kilpailu.
Ohhoh, mukava nähdä tulokset. Vähän liian ylimielisesti tuli ennen kilpailua ajateltua, että tuskin oma äly yli 50:llä pisteellä häviäisi kenellekkään.
Shotgun ja Spock sitten osoittivat toisin.
Jos laskukaava on kuten ajattelin, eli ainoastaan voitetut erät lasketaan, niin näyttäisi oma Saikyou sijoittuvan jopa kolmanneksi näiden kahden jälkeen, mutta suurella erolla.
Oliko laskukaava näin, vai lasketaanko kenties nuo otteluiden erotukset yhteen?
Dzarg kirjoitti:
Oliko laskukaava näin, vai lasketaanko kenties nuo otteluiden erotukset yhteen?
Voitoista saa pisteitä ja häviöistä sakotetaan. Tekoälyn esim pisteet saadaan siis ottamalla hakemistosta esim jokaisesta tiedostosta se rivi, jolla kerrotaan kyseisen tekoälyn tulos muodossa esim: -25. Kilpailussa jaetaan siis yhteensä nolla pistettä. :)
Metabolix kirjoitti:
Voitoista saa pisteitä ja häviöistä sakotetaan. Tekoälyn esim pisteet saadaan siis ottamalla hakemistosta esim jokaisesta tiedostosta se rivi, jolla kerrotaan kyseisen tekoälyn tulos muodossa esim: -25. Kilpailussa jaetaan siis yhteensä nolla pistettä. :)
Selvä, laskin pisteet nyt uudestaan tuolla tavalla. Tässä yhteispisteet välierästä. Jos syystä tai toisesta tarkoituksella yhteispisteitä ei haluttu julkaista, niin voin poistaa nuo. Toisaalta ainakin suurin osa täällä varmaankin pystyy koodinpätkällä ne laskemaan itsekkin.
Shotgun tosiaan vei. Itse en pärjännyt kovin hyvin, vaikka olisin kyllä ollut kärjen tuntumassa mikäli pisteet olisi laskettu voittoprosentista. Nytpä pitääkin ahkeroida tämä loppuaika, kun tietää vähän minkä tyyppisiä tekoälyjä on vastassa.
Kyllä tästä vielä ihan hyvä kilpailu saadaan vaikka toi mun Shotgun vielä tässä vaiheessa veikin pidemmän korren. Spokissa on selvästi aineista ja noi kolmostilaakin kärkkyvätkin saattavat parantaa tulostaan merkittävästi.
Voisi siihen lopulliseen kilpailuun pistää mukaan pari kilpailun ulkopuolista tyhmää pelaajaa, jottei toi jokseenkin satunnainen 'typerys' pärjäisi noinkin hyvin :) Ne auttaisivat heikompia pelaajia saamaan enemmän pisteitä verrattuna satunnaiseen bottiin. Oli tuolla kyllä nytkin muutama pelaaja, jotka ajoivat tuota virkaa, mutta oletan, että tämä muuttuu ennen lopullisia pelejä.
Dzarg kirjoitti:
Jos syystä tai toisesta tarkoituksella yhteispisteitä ei haluttu julkaista – –
Laiskuus... Kuten sanoit, eiköhän täällä jokainen osaa laskea ne viime kädessä vaikka kynällä ja paperilla.
FooBat kirjoitti:
Voisi siihen lopulliseen kilpailuun pistää mukaan pari kilpailun ulkopuolista tyhmää pelaajaa – –
Tämä on hyvä ehdotus, yritän keksiä jotain. Yksi tällainen tapaus onkin jo mukana.
Tärkeintä kilpailussa on tietenkin pitää kaikki koodauskykyiset kesälomalla visusti sisällä, ettei tule raitisilmamyrkytystä tai auringonpistosta.
Pitää näyttävästi parannella paljon älyä, ku jää solmuun tollasiin "älyttömiin" älyihin. -.-
Onkos jossakin jaossa testiohjelmaa jolla voi kilpailuttaa omaa älyä itsensä kanssa?
tesmu kirjoitti:
Onkos jossakin jaossa testiohjelmaa jolla voi kilpailuttaa omaa älyä itsensä kanssa?
Ei ole, ja tällaisesta ohjelmasta tuskin olisi hyötyäkään, koska sääntöjen äly pelaa itsensä kanssa aina tasan. Vastaavaan lopputulokseen pääsee siis niin, että syötteen lukemisen sijaan käyttää aina äskeistä tulostettaan:
tulosta(valinta) vastustaja = valinta
Jos koneella on ohjelma socat
, sillä voi käynnistää pelin tällaisella komennolla:
socat EXEC:'ajokomento' EXEC:'toinen_komento'
Tai näin, jos äskeinen ei toimi:
socat EXEC:'ajokomento',pty,echo=0,raw EXEC:'toinen_komento',pty,echo=0,raw
Tekoäly voi vaikka kirjoittaa siirtonsa tiedostoon, jotta niitä voi tarkastella jälkikäteen. Jos tiedostoon kirjoittaminen ei miellytä ja käytössä on lisäksi ohjelma nimeltä tee
, komentoa voi muuttaa näin:
socat SYSTEM:'komento | tee a.txt' SYSTEM:'toinen_komento | tee b.txt'
Windows-version socat
ista sekä tarvittavat Cygwin-kirjastot voi ehkä ladata täältä (en kokeillut). Useimmissa Linuxeissa se löytyy luultavasti paketinhallinnasta.
Lähinnä, voisin kokeilla vanhaa älyä vastaan paranneltua älyä jollon, että paransinko vai huononsinki.
Kymmenen ekaa saa mun testiohjelman täältä.
http://rapidshare.com/files/250848231/runner.
Tulee ihan conffimahdollisuuden kanssa. Testibottien kirjoitus jää harjoitustehtäväksi, mutta mainittakoon, että tuo testausohjelma toimii vain ohjelmien kanssa jotka kirjoittavat vastauksensa output streamiin ja vaatii, että ohjelma flush:aa vastauksensa (tarpeellista esim. C:n kanssa).
Vaatii java 1.6 runtimen toimiakseen. Käyttöehdot kieltävät käyttöliittymästä valittamisen :)
Tuli itsekkin heti alkuun testiohjelma kirjoitettua, ei ilman sitä itselläni ainakaan ollut luottoa tekoälyn kykyihin. Vaatii myös flushin eikä tule conffimahdollisuuksien kanssa. Syntaksi esimerkiksi
java Tester ./a.out "java Malli"
Tuolta löytyy myös yksinkertaisesti tilastollisuutta käyttävä heikko tekoälyvastustaja ja socketeilla toimiva testiohjelma, joka mahdollistaa kavereiden tekoälyjä vastaan pelaamisen luovuttamatta koodeja. Tosin melko hyödytön ilman palvelinosaa jonka teki toinen henkilö, mutta se on vielä hieman keskeneräinen. Matsia voi kuitenkin tulla vaikka ircistä huutelemaan jos haluaa (tällä nickillä ircnetissä esimerkiksi tavoittaa).
Suunnitteilla olisi kyllä edistyneemmät palvelimet ja asiakasohjelmat, jotka mahdollistaisivat monen samanaikaisen pelaajan automaattisen kaikki kaikkia vastaan peluuttaminen ja lopputilastojen näyttämisen, mutta saa nyt nähdä riittääkö tässä aika ennen finaalia.
Kilpailu alkaa lähestyä loppuaan: tekoälyt täytyy lähettää viimeistään ensi maanantaina, 13.7. klo 13.37. Tänä viikonloppuna on siis sopiva hetki kirjoittaa oma tekoäly tai parannella sitä. Vielä ehtii mukaan!
72 minuuttia aikaa päättymiseen :)
Hmm, pitäiskö aloittaa osallistumisen pohtiminen :D
Viimeiset minuutit ovat käsillä. Mukaan ehtii vielä, ja jos ilmoittautumisissa on jotain epäselvää, viimeistään tässä vaiheessa kannattaa ottaa yhteyttä asian johdosta.
Noniin, nyt kun ilmoittautuminen on päättynyt, olisikos ylläpito valmis ilmoittamaan tuon 'oikean taikatempun'? :) Mikä tämä taikatemppu on joka ei vaadi edes flushausta ja ottaa tulostukset stdoutista?
Tekoälyjä tuli kilpailuun kaikkiaan 37, päästiin siis jopa ristinollakilpailua komeampiin lukuihin. Tekoälyt ovat 0xF4, Brainluck, byrokrat, Code_395, Daeron_NG, Encephalon, esim, FAGGOT, Fail, foo, himmeli, JankenB, Jokuihme, jousipallo, kaiku, Kaksari, KiviKova, Kolykko, Leikkuri09, luuseri, MonkeyBot, nameless, NIGGERx2, onnekas, palikka, paperiaivo, Puudeli, r5nd0m, Risaksi, Saikyou, set, Shotgun, Spock, tekoaly, tumpelo, typerys ja u137.
Useimmat älyt selviytyivät peleistä loppuun asti, JankenB ja byrokrat lopettivat toisinaan toiseksi viimeiselle kierrokselle ja Puudeli kärsi säännöllisesti muistivirheistä (segfault) pelin puolivälin paikkeilla.
Tulokset julkaistaan mahdollisimman pian.
Milo: Taikatemppu itse asiassa lukee jo tuolla ylempänä:
Metabolix kirjoitti:
socat EXEC:'ajokomento',pty,echo=0,raw ...
Ohjelma socat luo siis tässä pseudoterminaalin (pty), jonka pitäisi ohjelman puolesta vastata normaalia konsoli-ikkunaa, ja ohjaa siihen tulevan tulosteen eteenpäin (...) tällä kertaa putkien avulla. Esimerkiksi FreeBASIC ei kuitenkaan kelpuuta samaa taikariviä, mutta sille taas kelpasi yllättäen normaali uudelleenohjaus tiedostoon. (Ilmeisesti flushaus tapahtuu FB:ssä automaattisesti, ja ilmeisesti sen "hienompi" konsolinkäsittely taas sotkee tilannetta pseudoterminaalin kannalta.) Menetelmä toimi hyvin, joten sitä käytetään tulevissakin kilpailuissa.
Hmm käänsittehän te ohjelmani uusiksi?
Kaikki toimi meikun päässä kyllä ihan niin kuin pitikin. Noh eipä siinä hittojakaan sitten :)
Heh en huomannut tuota taikatemppua sivun puolivälissä.
Milo kirjoitti:
Hmm käänsittehän te ohjelmani uusiksi?
Kyllä. Lähetin sähköpostiisi arvauksen kaatumisen syystä. Harmi, että näin kävi, mutta onneksi kilpailuja tulee vielä lisää. ;)
Metabolix kirjoitti:
Milo kirjoitti:
Hmm käänsittehän te ohjelmani uusiksi?
Kyllä. Lähetin sähköpostiisi arvauksen kaatumisen syystä. Harmi, että näin kävi, mutta onneksi kilpailuja tulee vielä lisää. ;)
Joo aika selvä syy :) unohdin vaihtaa merkkiä kun muunsin satunnaisluvun arvontalaskua..
Tulokset on nyt julkaistu. Voittaja on Jorma Sainion tekoäly Shotgun, joka menestyi hyvin jo välikierroksilla. Toiseksi tuli Toni Huttusen Leikkuri09 vain 350 pisteen erolla, ja lähellä kärkeä on koko joukko muitakin tekoälyjä. Onnea voittajalle ja kiitokset jälleen kaikille osallistujille!
Kiitokset myös Laurille erinomaisen kilpailun järjestämisestä!
Hieno kilpailu oli. Yllätyin miten hyvin pärjäsin, vaikka tekoälyni ei edes pyrkinyt vastustajan voittamiseen :D
Hieno kilpailu tosiaan. Vähän toi oma botti hävettää (Encephalon), kun ihan yksinkertaisetkin botit sen voittivat. Pääsinpä kuitenkin vähän keskimääräistä paremmalle sijoitukselle, joten täysin satunnaisbotiksi bottia ei voi sanoa.
Onnittelut voittajalle, ei olisi tullut minulle mieleen tehdä moista.
Jossakin vaiheessa muutin mieleni anonyyminä osallistumisesta, mutta en jaksanut lähettää mailia, jossa ilmoittaisin asiasta. Ohjelmani on nameless.py, ja sen tiedon saa ylläpito tuloslistaan päivittää, jos jaksaa & katsoo aiheelliseksi.
Tarkka lukija havaitsee ohjelmani olevan hyvin lyhyt, mutta kohtuullisestihan tuo pärjäsi kahden illan hommaksi. Tein ensin aiemman version, joka toimi hieman eri tavalla, mutta sitten korjasin sitä seuraavana päivänä nokkelalla "kasvata indeksiä yhdellä" tekniikalla, jota juuri olen patentoimassa :) :)
Täytyy nyt vertailla eri ratkaisujen pituuksia ja suhteuttaa ne menestykseen, että voi kuvitella olevansa jollain mittarilla aivan ehdoton ykkönen :) :)
Hauska kisa kyllä. Kiitän.
Teinpä hieman paremmat kuvaajat tarkempaa pelien analysointia varten: http://kahvi.tuuna.us/ksp/
Kiitokset hienon kilpailun järjestämisestä ja onnittelut kärkikolmikolle.
Oma sijoitukseni oli hyvin samaa tasoa kuin viiden vuoden takaisessa Ristinolla-kilpailussa, eli voitin 5/6 vastustajista. Tulosten silmäilyn perusteella ei jäänyt mitään jossiteltavaakaan. Hyvä näin.
Frozenball, näkyvätkö tilastossasi Puudelin tulokset oikein? Minusta ainakin Putkan tilasto sanoo mm.
Puudeli - 0xF4
157 - 670
ja
Puudeli - Brainluck
170 - 659
Sinun kuvaajissasi Puudelin kohdalla taas on eri luvut näissä peleissä, ja kuvaajat näyttävät katkeavan kesken. Luenko niitä väärin vai mitä on tapahtunut?
Ihme, en tullu vikaks. Voittaja olo =)
Mukava kilpailu. Minun tekoäly, foo, menestyi mielestäni ihan kivasti siihen nähden, että älyn koodaamiseen/suunnitteluun käytetty aika oli vain parisen tuntia ja äly oli varsin yksinkertainen ainakin noihin parhaiten menestyneisiin älyihin verrattuna.
Parilla oli käytössä tuo "kun alan häviämään enemmän niin pistän satunnaiseks"... Ei tullut itsellä mieleen mutta olishan tuolla muutaman pojoa enemmän saanu :p
Pekka Karjalainen kirjoitti:
Luenko niitä [Puudelin kuvaajia] väärin vai mitä on tapahtunut?
Kuten hieman aiemmin keskustelussa mainitsin, Puudeli kärsi segfault-ongelmista. Frozenballin kuvaajat katkeavat siis pelin loppuun, mikä on tavallaan perusteltua, kun tarkoitus on tutkia tekoälyn toimintaa eikä toimimattomuutta. Oikeissa pisteissä on sitten laskettu vastustajalle voitot lopuilta kierroksilta (usein noin 500 lisäpistettä).
Kävipäs jännäksi, kun ei ehtinyt enää välikilpailun jälkeen virittämään tuota Shotgunia. Vähän laskeskelin silloin, että jos pari vastustajaa tajuaa minimoida tappionsa niin kisasta tulee vielä aika tiukka ja näinhän siinä kävikin.
Kiitokset kilpailun järjestäjille ja hyville vastustajille. Pitää varmaan vaivautua paikalle putkamiittiin pelaamaan erä kivi-sakset-paperi -peliä.
Hyvin suunniteltu ja toteutettu mielenkiintoinen kilpailu oli tosiaan. Vielä kun esimerkkeinä oli jo toimivat tekoälyt, niin niitä muokkaamalla osallistumiskynnys oli todella matala.
FooBat kirjoitti:
Vähän laskeskelin silloin, että jos pari vastustajaa tajuaa minimoida tappionsa niin kisasta tulee vielä aika tiukka ja näinhän siinä kävikin.
Joo kyllähän tämä hyvin sattuneen satunnaisuuden antama 25:n pisteen voitto Shotgunista jokseenkin paremmalta näyttää kokonaispisteiden kannalta kuin tuo puolivälin 409:n pisteen häviö, mutta moraalisestihan se on silti hävitty :)
Tein tulossivulle linkitetyn tekstitiedoston (ksp-pelit.txt) pohjalta taulukoita siitä, miten paljon kukin sai pisteitä/voittoja/tappioita/tasapelejä ketäkin vastaan. Tuosta näkee esim. voittaneen Shotgunin pärjänneen selvästi muita paremmin Brainluckia vastaan ja heikommin Encephalonia vastaan. Tosin Encephalonin ottelutulosten jakauma oli kapea, ko. botti toimi varsin satunnaisesti?
Joo, kattelin Encephalonin koodia hiukan. Se tosiaan ottaa tappioiden minimoinnin tosissaan ja menee heti ensimmäisellä kierroksella random protect moodiin, kun ei ole yli 50 pistettä voitolla :).
Nooh, löysin tuosta omasta shotgunistakin heti bugin kun aloin katselemaan sitä uudestaan, tosin vain käyttäjälle dumpattavasta statistiikan keräämisestä eikä suoranaisesti toimintaan vaikuttavasta ominaisuudesta.
FooBat kirjoitti:
Joo, kattelin Encephalonin koodia hiukan. Se tosiaan ottaa tappioiden minimoinnin tosissaan ja menee heti ensimmäisellä kierroksella random protect moodiin, kun ei ole yli 50 pistettä voitolla :).
Sepäs selittääkin aika paljon asioita. Miinusmerkin laiton jälkeen ajoin pelit uudestaan, tosin en valitettavasti saanut socat-komennolla niitä ajettua. Siispä lisäsin jokaiseen pelaamani bottiin flush-komennon erikseen (lähinnä Python- ja PHP-botteihin, muut ohjelmointikielet eivät ole niin tuttuja):
Encephalon - Monkeybot (26.): 341-312-347 VOITTO
Encephalon - byrokrat (31.): 329-325-345 VOITTO
Encephalon - esim (30.): 331-332-337
Encephalon - Fail (25.): 333-339-328
Encephalon - foo (21.): 342-319-339 VOITTO
Encephalon - himmeli (9.): 316-329-355
Encephalon - JankenB (29.): 318-338-343
Encephalon - jousipallo (5.): 329-352-319
Encephalon - onnekas (6.): 340-329-331 VOITTO
Encephalon - typerys (11.): 345-318-337 VOITTO
Encephalon - Risaksi (36.): 327-331-342 (huvittavaa eikö :D)
Näyttää tosin siltä, että pärjäsin satunnaisuudella paremmin.
Muutaman pisteen voittoa ei kannata hehkuttaa vielä kovin suurena voittona. Kahden täysin satunnaisenkin botin välillä tulee usein yli -+50 pisteen eroja tuloksissa ja kaikkia tuloksia alle 30-40 pisteen erolla voi oikeastaan pitää tasapeleinä (joku tilastomatemaatikko saa kertoa tarkan luvun :)). Pelejä pitäisi toistaa useilla eri random seedeillä ohjelmien väleillä ja laskea tuloksista keskiarvo, jos haluttaisiin tarkempaa tietoa tasaisten ohjelmien keskinäisestä paremmuudesta.
Gah... Odotin että olisin hävinnyt koko kilpailun, mutta hyvinhän tuo kolykko pärjäs :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.