Järjestäjä: Metabolix
Vuodenvaihteessa 2009–2010 Ohjelmointiputkassa pidettiin tekoälykilpailu. Aiheena oli kahden pelattava lautapeli, jossa nappulat pomppivat toistensa yli kohti laudan vastakkaista reunaa. Kaikki tekoälyt pelasivat vuorollaan toisiaan vastaan, ja jokaisesta voitetusta pelistä sai yhden pisteen.
Kilpailuun osallistui kaikkiaan 15 tekoälyä. Aihe oli selvästi hankala näin lyhyessä ajassa ratkaistavaksi: harva kilpailun tekoäly antaa kunnon vastuksen ihmiselle. Useimmat tekoälyt laskevat melko yksinkertaisesti, mikä siirto veisi lyhyellä tähtäimellä mahdollisimman pitkälle, mutta uskalsipa joku osallistua myös ohjelmalla, joka käyttää ensisijaisesti etukäteen kehitettyä taktiikkaa. Tällä kertaa ihmisen valmiiksi viilaama strategia jopa päihitti useimmat tekoälyt, mutta voiton veivät kuitenkin tyypilliset lautapelialgoritmit ja raaka laskenta.
Seuraavassa taulukossa ovat kaikki kilpailun osallistujat järjestyksessä kokonaispistemäärän mukaan. Varsinaisten kilpailijoiden lisäksi kilpailussa oli mukana esimerkkiäly esim.
sija | tekoäly | kieli | koodirivejä | tekijä | nimimerkki | voitot | tappiot |
---|---|---|---|---|---|---|---|
1. | Kettu | C++ | 1090 | Aleksi Hartikainen | ahr | 28 | 0 |
2. | pompom | Lua | 200 | Lauri Kenttä | Metabolix | 26 | 2 |
3. | Mijuku | C++ | 250 | Markku Velinen | Dzarg | 22 | 6 |
4. | Ants | Pascal | 270 | Teemu Valo | User137 | 20 | 8 |
5. | Kuovi | C# | 660 | Eki Lehtimäki | Eki Lehtimäki | 18 | 10 |
LiteYear | C++ | 360 | Antti Vainio | Anaatti | 18 | 10 | |
silta10 | C++ | 340 | Toni Huttunen | Seriffi | 18 | 10 | |
8. | Kabot | C++ | 210 | Sami Kalliomäki | Sami345 | 14 | 14 |
9. | P3TO | Python | 280 | Juho Peltonen | aaämdee | 12 | 16 |
10. | Pompper | C++ | 100 | Tomi Kokkonen | tkok | 11 | 17 |
11. | Awesome | C++ | 380 | Michael Borderborough | Borderi | 9 | 19 |
12. | Hypsis | Java | 420 | Tigon | 7 | 21 | |
13. | vahajarki | Python | 120 | Juho Pinola | JP_94 | 5 | 23 |
14. | esim | * | 11×80 | 2 | 26 | ||
15. | viikinki | C | 20 | Mikko Sysikaski | Sisuaski | 0 | 28 |
Onnea voittajalle!
Seuraavassa taulukossa ovat otteluiden tulokset. Ensimmäisessä sarakkeessa lukee pelin aloittaja ja ylärivillä toinen pelaaja. V merkitsee aloittajan voittoa ja H aloittajan häviötä, ja viivalla on merkitty tasapelit. Tulos on linkki sivulle, jolla voi katsella koko pelin. Älyn ottelua itseään vastaan ei laskettu yhteispisteisiin.
Ke | po | Mi | An | Ku | Li | si | Ka | P3 | Po | Aw | Hy | va | es | vi | voittoja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kettu | H | V | V | V | V | V | V | V | V | V | V | V | V | V | V | 14 |
pompom | H | V | V | V | V | V | V | V | V | V | V | V | V | V | V | 13 |
Mijuku | H | H | V | H | V | V | V | V | V | V | V | V | V | V | V | 11 |
Ants | H | H | V | H | H | V | H | V | V | V | V | V | V | V | V | 10 |
Kuovi | H | H | H | V | V | H | V | V | V | V | V | V | V | V | V | 10 |
LiteYear | H | H | H | H | V | V | H | V | V | V | V | V | V | V | V | 9 |
silta10 | H | H | H | V | V | V | V | V | V | V | H | V | V | V | V | 10 |
Kabot | H | H | H | H | H | H | H | H | V | V | V | V | V | V | V | 7 |
P3TO | H | H | H | H | H | H | V | H | H | H | V | V | V | V | V | 6 |
Pompper | H | H | H | H | H | H | H | H | H | H | V | V | V | V | V | 5 |
Awesome | H | H | H | H | V | H | V | H | H | H | – | H | V | V | V | 5 |
Hypsis | H | H | H | H | H | H | H | H | H | H | H | H | V | V | V | 3 |
vahajarki | H | H | H | H | H | H | H | H | H | H | V | H | V | V | V | 3 |
esim | H | H | H | H | H | H | H | H | H | H | H | H | H | V | V | 1 |
viikinki | H | H | H | H | H | H | H | H | H | H | H | H | H | H | – | 0 |
voittoja | 14 | 13 | 11 | 10 | 8 | 9 | 8 | 7 | 6 | 6 | 4 | 4 | 2 | 1 | 0 |
Seuraavassa kuvassa tekoälyjen lähtöpaikka on yläreunassa ja maali alareunassa. Kilpailussa hyvin menestyneiden älyjen reitit on väritetty vihertävällä, keskitasoisten sinertävällä ja heikoimmille jääneiden reitit punertavalla. Mitä kirkkaampi alue on, sitä useampi nappula siitä on kulkenut. Laudan keskilinja on ollut hyvin suosittu, mutta osa parhaista älyistä onkin kiertänyt sivummalta.
Tarkastellaan vielä erikseen tuloslistan alku- ja loppuosia. Seuraavassa kuvassa ovat vain viimeiset neljä tekoälyä, ja poikkeamia kuvan reunoille ei juuri näy:
Parhaat neljä tekoälyä taas ovat hajaantuneet selvästi enemmän. Tästä voinee päätellä, että sivukautta on päässyt tehokkaasti huonompien tekoälyjen ohi.
Kuitenkin itse voittaja on pysytellyt erityisesti alkumatkasta lähellä keskilinjaa, eli suorin reitti sittenkin on ollut paras, kunhan on osannut ottaa hyödyn irti vastustajan nappuloista.
Viimeisestä kuvaajasta selviää, kuinka paljon älyt ovat edenneet y-suunnassa yhdellä siirrolla. Jokainen mahdollinen etenemä on kuvattu omalla värillään. Palkkien pituuksia on painotettu hyppyjen pituuksilla, jotta harvemmin sattuneet pitkät hypyt näkyisivät paremmin. Palkin koko kuvastaa siis likimain, kuinka suuren osuuden koko kilpailusta äly on edennyt kyseisellä hyppypituudella.
Kuvaajasta nähdään, että häntäpään älyt eivät ole paljon hyppineet. Toisaalta voittajakaan ei ole kaikkein innokkain hyppijä, eli tässä pelissä on kyse paljon muustakin kuin pitkistä hypyistä.
Tekoälyjen lähdekoodit voi ladata yhtenä pakettina. Osallistujilta pyydettiin tekoälyn saatteeksi myös pientä selostusta sen toimintaperiaatteesta. Näin he kertovat ratkaisuistaan:
Kettu Aleksi Hartikainen ahr | Ohjelma käyttää parhaan siirron etsimiseen minimax-hakua, jota on tehostettu muutamalla shakkitekoälyistä tutulla tekniikalla:
|
pompom Lauri Kenttä Metabolix | Taktiikka perustuu ilman vastustajaa tehokkaaksi todettuun menetelmään: Ensin rakennetaan hieman kulmittaista ketjua ja toiseksi suoraa ketjua laudan päähän asti. Sitten vain hypytetään nappuloita ketjua pitkin maaliin, ja lopuksi puretaan ketju alkupäästä lähtien. Muutama ensimmäinen siirto on valittu ennalta, loput lasketaan sen perusteella, kuinka lähellä suunniteltua ketjua tai maalia kohderuutu on. Tekoäly ei ennakoi omia tai vastustajan siirtoja mitenkään; siirrot tehdään vain nykyisen tilanteen perusteella ja vain oman etenemisen näkökulmasta. Menestys riippuu täysin siitä, tukkiiko vastustaja tien ja osaako ehkä jopa hyödyntää valmiiksi tarjottua hyppyreittiä. Ihmispelaajalle tekoälystä ei ole juuri vastusta. |
Mijuku Markku Velinen Dzarg | Tekoäly siirtää ensin neljä vakiosiirtoa ja sen jälkeen aloittaa siirtojen arvioinnin tutkimalla kaikki omat siirtomahdollisuudet, kaikki niiden jälkeiset vastustajan siirrot ja vielä niiden jälkeiset omat siirrot. Siirroksi valitaan se siirto, joka tuottaa isoimman hyödyn (tai pienimmän haitan) y-koordinaatin suhteen. Samantasoisista siirroista valitaan se, jossa siirrettävä nappula on kauimpana maalista. Aika oli vähän tiukassa, joten ei tullut mitään omaperäistä toteutettua ja tekoäly on suoraan jatkettu C++-esimerkkitoteutuksesta. |
Ants Teemu Valo User137 | Neljäs kehitysversio kokeilee hyppyjä ja yksittäisiä siirtoja, jolla liikkuu eniten kullakin vuorolla. Joka vuorolla käydään myös läpi ja pisteytetään kaikki omat ja vastustajan siirtovaihtoehdot, jotka seuraavat niitä. Antaa hieman enemmän painoarvoa nappuloille, jotka ovat kauimpana maalista. |
Kuovi Eki Lehtimäki | Kuovi arvioi pelitilanteita MSPV-pisteytyksen avulla (MSPV = "monenko siirron päässä voitosta?"). Yhden nappulan MSPV-arvo on pienin laillisten siirtojen lukumäärä, jolla nappula pääsisi maaliin, jos laudan muut nappulat eivät liikkuisi. (Ei siis todellakaan absoluuttinen siirtojen määrä varmasta voitosta, vaan tunnusluku, joka kertoo, onko nappulan asema hyvä vai huono.) Pelivuorollaan Kuovi kokeilee eri siirtoja, laskee kutakin siirtoa vastaavan kaikkien nappuloiden yhteenlasketun MSPV-pistemäärän ja valitsee (yleensä) pienimmän tuloksen antavan siirron. Koskaan ei siis lasketa enempää kuin yksi siirto eteenpäin. Taktiikan haittapuoli on se, että siirto, joka parantaisi asemia parin siirron päästä mutta huonontaa MSPV-pisteitä tilapäisesti "pomppureittien" tukkeutumisen takia, on tällä logiikalla aina huono. Ongelman kiertämiseksi Kuovi yrittää tunnistaa, milloin sen oma peli on muuttumassa passiiviseksi, ja käyttää silloin "aggressiivista avaussiirtoa", joka ei ole mitenkään riippuvainen MSPV-pisteistä. Myös kuusi ensimmäistä siirtoa tehdään MSPV-pisteistä riippumatta aina samalla tavalla, jotta alkusommitelma saataisiin mahdollisimman hyväksi. Aluksi Kuovi laski myös vastustajan MSPV-pisteitä ja yritti mahdollisuuksien mukaan haitata vastustajan peliä. Testeissä estotaktiikkaa käyttävä Kuovi kuitenkin yleensä hävisi pelinsä, joten lopullinen Kuovi ei yritä estämistä lainkaan. |
LiteYear Antti Vainio Anaatti | Jokaisella vuorollaan ohjelma etsii aluksi kaikki siirrot, jotka pystyisi tekemään. Tämän jäkeen se pisteyttää jokaisen siirron, ja lopulta se siirto, joka sai eniten pisteitä, tehdään. Tekoäly keskittyy pääasiassa omaan peliin eikä niinkään välitä vastustajasta. Siirtojen pisteytyksessä käytetään joitakin yksinkertaisia asioita kuten etenemistä y-akselilla, mutta myös monimutkaisempia asioita kuten omien nappuloiden x-koordinaattien keskiarvoa. Muutama tilanne on myös etukäteen pisteytetty, ja tietyin väliajoin käytetään vähän erilaisia pisteytysmenetelmiä. |
silta10 Toni Huttunen Seriffi | Seuraa asetettua reittiä vastustajaa huomioimatta. Luottaa muiden tekoälyjen sokeuteen. |
Kabot Sami Kalliomäki Sami345 | Tekoäly laskee pisteet kaikille mahdollisille siirroille ja valitsee niistä parhaan. Pisteet lasketaan oman, vihollisen ja oman seuraavan siirron perusteella. |
P3TO Juho Peltonen aaämdee | Python 3 Teko-Olento pyrkii etenemään aina ensisijaisesti hyppimällä. Yrittää hankaloittaa muodostelmalla vastustajan kulkua. |
Pompper Tomi Kokkonen tkok | Esimerkin kevyesti paranneltu versio. |
Awesome Michael Borderborough Borderi | Minimaxia höystettynä hupaisilla heuristiikoilla. |
Hypsis Tigon | Tämä on oikeasti yhden viikonlopun väsäys, mutta kiinnostaa, miten pärjää. Omalla vuorolla peli käy läpi mahdolliset siirrot ja laskee sitten syntyville pelitilanteille jonkin arvosanan. Siirroista valitaan se, joka johtaa parhaaseen pelitilanteeseen. Varsin perinteinen menetelmä, olettaisin. Itse tekoäly on siis pelilaudan tilanteen pisteiden laskemisessa. Tämä on pilkottu osiin, jotka vaikuttavat pisteisiin eri painoarvoilla. Ajoin ohjelmaa pari tuntia niin, että eri painoarvoilla pelaavat tekoälyt pelasivat toisiaan vastaan, ja poimin sieltä sitten parhaan tänne kisaan. Jatkokehittäminen olisi helppoa lisäämällä uusia sääntöjä pelitilanteen pisteytykseen ja muuttamalla ohjelmaa niin, että pelitilannetta katsotaan enemmän kuin tämän yhden siirron verran eteenpäin. |
vahajarki Juho Pinola JP_94 | Tekoäly yrittää siirtää nappuloita mahdollisimman nopeasti maalia kohti tarvittaessa vastustajan nappuloita kiertämällä. Äly osaa myös hyppiä nappuloiden yli ja voi tehdä pitkiäkin hyppysarjoja sen ollessa mahdollista ja kannattavaa maalia kohti pääsemisen kannalta. |
esim | Esimerkkiohjelma liikuttaa nappuloita askeleen kerrallaan maalia kohti tai positiiviseen x-suuntaan, jos tie on tukittu. Jos kumpikaan ei onnistu, ohjelma pysyy paikallaan. |
viikinki Mikko Sysikaski Sisuaski | Rintamapuolustus. |
Kiitokset vielä niin osallistujille kuin yleisöllekin onnistuneesta kilpailusta!