Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: Kilpailu: Ohjelmoi tekoäly, joka kerää lukuja

Sivun loppuun

Metabolix [22.12.2018 01:10:00]

#

Vuodenvaihteessa 2018–2019 pidetään jälleen ohjelmointikilpailu.

Tässä tekoälykilpailussa pelataan peliä, jossa kerätään lukuja ruudukosta, ja suurimman pistemäärän kerännyt voittaa.

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!

Kilpailun logosta kiitos Johannes Tuomelalle.

TapaniS [22.12.2018 12:23:30]

#

Onpas jälleen tehty hieno toteutus ja upea peli, joka niin yksinkertainen, että sen tajuaa melkein kertalukemalla ja kuitenkin niin vaativa tehdä voittava ohjelma, että jyvät erottuvat joukosta!

TaSman on jo kehitteillä ja pisteitä ei laudalle jätetä!

Esimerkkiohjelma (java) toimii hyvin, kun kopioin molemmat .class -tiedostot samaan kansioon, missä KilpailuProxy.exe sijaitsee.

jo123 [22.12.2018 16:33:02]

#

Ymmärsinkö nyt ohjeet oikein, että Pythonissa ei esimerkiksi numpy -kirjastoa voi käyttää?

Edit: Ja jatkokysymys: Millä jakaumalla pelilauta arvotaan?

Metabolix [22.12.2018 18:07:41]

#

jo123: Kun ohjelmat tehdään ilman kirjastoja, niitä voi olla realistista kääntää myös JavaScriptille ja tuoda kisan jälkeen selaimella kaikkien testattaviksi.

Pelilaudan arvonnassa joka ruudun kohdalla (lähes) tasaisesti jakautunut satunnaismuuttuja 0 ≤ x < 1 korotetaan kolmanteen potenssiin, kerrotaan 10:llä ja pyöristetään alaspäin. (Korjaan tämän juuri testaussivulle.)

jo123 [22.12.2018 18:32:11]

#

Metabolix kirjoitti:

(22.12.2018 18:07:41): jo123: Kun ohjelmat tehdään ilman kirjas­to­ja...

Eli jos teen koodin JavaScriptillä, voin käyttää kirjastoja?

Tai jos teen koodia, joka ei kuitenkaan käänny JavaScriptille... :P

Grez [22.12.2018 19:20:57]

#

jo123 kirjoitti:

Tai jos teen koodia, joka ei kuitenkaan käänny JavaScriptille... :P

Mitenköhän se käytännössä onnistuu?

Metabolix [22.12.2018 19:45:13]

#

jo123: Jospa keskittyisit hyvän idean kehittämiseen. Harvoin se käytännön toteutus jää mistään kirjaston käytöstä kiinni.

jo123 [22.12.2018 20:17:54]

#

Metabolix kirjoitti:

jo123: Jospa keskittyisit hyvän idean kehittämiseen. Harvoin se käytännön toteutus jää mistään kirjaston käytöstä kiinni.

Mietin siis lähinnä, jos ehtisi tehdä tässä jouloloman aikana jonkinlaisen Deep Q Learning toteutuksen peliin. Neuroverkot vaativat toki koulutukseen suhteellisen paljon laskentatehoa ja aikaa, mutta suorittamiseen melko vähän (muistiraja tosin rajoittaa verkon kokoa rajusti). Periaatteessa neuroverkot ovat pelkkää lineaarialgebraa, joten suorittaminen onnistuu tietysti kielellä kuin kielellä verrattain helposti. Tätä kuitenkin helpottaisi kovasti, jos saisi kasan lineaarialgebran funktioita käyttöön.

Suunnitelmana oli käyttää neuroverkon kouluttamiseen Python+Tensorflow+Keras. Tällöin sen suorittaminen olisi toki helpointa, jos saisi Pythonin varustettuna TensorFlow:lla. Tuo JavaScript -ehdotus liittyi siihen, että voisin tarvittaessa toteuttaa kilpailuversion tällä kirjastolla: https://js.tensorflow.org/ (verkko toki koulutettu ensin Pythonilla).

Ja Grezlle: En tiedä. Kaikki mahdolliset algoritmit on tietysti toteutettavissa JavaScriptillä. Voi olla, että joissakin tapauksissa kääntäminen JavaScriptille ei olisi silti suoraviivaista tai että syntynyt koodi olisi liian tehotonta. Tai sitten näin ei ole, en ole mikään asiantuntija.

Metabolix [22.12.2018 21:39:51]

#

jo123 kirjoitti:

Suunnitelmana oli käyttää neuroverkon kouluttamiseen Python+Tensorflow+Keras.

TensorFlow ei varmastikaan ole kisassa käytettävissä, ja myöskään sen JS-version vaatimukset eivät kisaympäristössä täyty. Jos nyt neuroverkon toteutus on tästä kiinni, niin Python 3:ssa numpy voi olla hyväksyttävä.

jalski [22.12.2018 22:50:27]

#

Olisikohan tällä kertaa näin joulun alla mahdollisuus saada 8th kilpailussa sallittujen ohjelmointikielten listalle?

Metabolix [22.12.2018 23:46:43]

#

jalski, 8th ei ole mahdollinen vaihtoehto. Kyseessä on suljetun lähdekoodin ohjelma, jonka ilmaisversionkin lataamiseksi pitää hyväksyä lisenssi ja antaa tietojaan yritykselle. Tällaista en ota kisaympäristöön. (Eikä nyt tukita tätä keskustelua ylimääräisillä 8th-koodeilla, kiitos.)

decoy [23.12.2018 14:52:59]

#

Upean oloinen peli, antaa mukavasti ajateltavaa jo pelkällä olemassa olollaan.

koska minulla menee noin kymmenen vuotta ennen kuin pystyn ottamaan osaa niin kovasti toivoisin että tuon peli jäisi pelattavaksi.

luulisi että muutama kisaajan koodikin voisi lahjottautua tähän tarkoitukseen itsenäisesti. ;) heh.

täällä yrittänyt kiinnostua jälleen elämästä, ja ohjelmointi putka tehtävineen ollut kiva paikka siihen.

mukavaa kaikkea hyvää jokaiselle.

jalski [23.12.2018 21:11:21]

#

Metabolix kirjoitti:

jalski, 8th ei ole mahdollinen vaihtoehto.

Harmi, en taida viitsiä osallistua kilpailun nykyisellä ohjelmointikieli valikoimalla. Olisi ollut kiva kokeilla graph datatyyppiä apuna tässä tehtävässä.

Testiohjelman syötteessä on muuten BOM mukana. Tämä voisi olla hyvä mainita, ettei aiheuta turhaa hämminkiä osalle osallistujista.

Metabolix [24.12.2018 00:53:37]

#

jalski kirjoitti:

Testiohjelman syötteessä on muuten BOM mukana.

No ei varmasti ole.

jalski [24.12.2018 01:14:20]

#

Metabolix kirjoitti:

jalski kirjoitti:

Testiohjelman syötteessä on muuten BOM mukana.

No ei varmasti ole.

Luin syötteen pelaajien lukumäärästä, yritin suoraan muuttaa sitä numeroksi ja sain vastaukseksi null. Tulostin kokeeksi syötteen tiedostoon ja otin siitä heksa dumpin:

C:\temp>type debug.txt
 2
C:\temp>"c:\users\Jali\desktop\hexdump\hexdump.exe" /debug.txt
00000000: EF BB BF 32                                        | ...2

Ohjelma toimii testiohjelman kautta oikein poistamalla syötteiden alusta 0xEFBBBF tavut suorittamalla: "\xEF\xBB\xBF" "" s:replace. Kokeilemalla ohjelmaa komentoriviltä suoraan ilman testiohjelmaa tämä ei ole tarpeen.

Metabolix [24.12.2018 09:17:34]

#

Epäilen, että kuvaamasi vika johtuu jollain tavalla käyttämästäsi kielestä. Testausjärjestelmä on ihan sama kuin aiemmissakin kilpailuissa, ja kenelläkään muulla ei ole esiintynyt vastaavaa ongelmaa. Lisäksi esimerkiksi seuraavanlainen C:llä tehty ohjelma näyttää ihan oikeaa dataa:

for (int c; (c = getchar()) != EOF;)
	fprintf(stderr, "%02x%c", c, c == '\n' ? '\n' : ' ');

jsbasic [25.12.2018 23:38:54]

#

Miten tuo aikaraja? Hylätäänkö ajan ylittäneet tekoälyt kokonaan (DNF), vai jääkö siihen asti kerätyt luvut lopulliseksi tulokseksi? Entä näkyykö jossain kulutettua aikaa? Tuo

"timeUser": 0.07

ei varmasti tarkoita kulutettua kokonaisaikaa?

Metabolix [26.12.2018 00:48:29]

#

Aikarajan ylittävä ohjelma ei saa kyseisestä pelistä pisteitä, ja jos raja ylittyy runsaasti, ohjelman peli keskeytetään, jottei se hidasta muiden kilpailua.

Ohjelman kokonaisaika näkyy tulosteen kohdassa time (= timeUser + timeSystem). Myös KilpailuProxy tulostaa ajankäytön omaan komentorivi-ikkunaansa.

(Näköjään aiempi KilpailuProxy.exe käytti Windowsissa kielen mukaista desimaalierotinta, jolloin tulos ei välttämättä näkynyt testaussivulla. Korjasin tämän, uusi versio KilpailuProxysta on nyt ladattavissa testaussivun linkistä.)

On syytä muistaa, että ajankäyttö omalla koneella ei vastaa välttämättä ajankäyttöä minun koneellani, ja siis ohjelma kannattaa tehdä riittävän nopeaksi. Ajankäytön ennakointiin voi käyttää erilaisia CPU Benchmark -sivustoja.

jsbasic [26.12.2018 10:37:58]

#

Entä Kilpailuproxyn python-versio? Minulla on koodissa sekunnin viive

sleep(1)

, mutta ajaksi ilmoitetaan 0.20 s.

"time": 0.2

Grez [26.12.2018 11:00:01]

#

jsbasic kirjoitti:

Minulla on koodissa sekunnin viive

sleep(1)

"The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal's catching routine."

En sinänsä tiedä onko tuosta kyse.

jsbasic [26.12.2018 13:16:48]

#

Niin, ilmeisesti kyse on näistä moniajon kommervenkeistä, tai sitten sleepissä kulunutta aikaa ei lasketa ohjelman omaksi ajaksi. Tein tekoälylle itsenäisen aikalaskurin, jossa kyllä näkyy sleepissä kulunut aika.

jalski [26.12.2018 14:01:27]

#

Vaikka en saakaan osallistua, niin tein kokeeksi viereisistä ruuduista isoja pisteitä ahnehtivan "tekoälyn". Päädyin toteuttamaan oman graafi toteutuksen, mistä saan suoraan mahdolliset siirrot kartalla ja kyseisen siirron suunnan ja pistemäärän. Nykyiseen toteutukseen tämä on hiukan liian hieno, mutta helppo pohja tulevalle jatkokehitykselle. Nykyisellään alkupeli sujuu hyvin, mutta kun ympärillä on paljon tyhjää niin menee heikommin.

Käännetyt Windows ja linux binäärit täältä harjoitusvastustajaksi.

Metabolix [26.12.2018 15:41:16]

#

Kuten säännöissä kai lukee, suoritusajaksi lasketaan ohjelman aktiivinen suoritinaika ja siis ei esimerkiksi nukkumista tai syötteen odottamista. Tämä on tavallinen tieto, jonka saa luotettavasti käyttöjärjestelmältä ilman mitään omia mittausviritelmiä. Linuxissa ohjelman suoritusaikaa voi tutkia esimerkiksi komentorivillä time-komennolla.

Nukkuminen on tietysti häiritsevää kilpailun kulun kannalta, joten sellaista ei pidä omaan tekoälyyn laittaa.

jalski [27.12.2018 22:42:44]

#

Mod. siirsi toisesta keskustelusta:

jsbasic kirjoitti:

Poimintakilpailu on oikein onnistunut idea, vaikka sen näkemistä ei ole suoranaisesti rajoitettu. Joutuuhan tekoäly miettimään pelimaailmaa nykyiselläänkin, jotta se osaisi muodostaa optimaaliset reitit.

Poimintakilpailun hienous on, että siinä voi pärjätä yksinkertaisella toteutuksella, mikä suunnistaa automaattisesti ilman siirtojen laskemista ja poimii matkalla numeroita "optimoimalla" isojen numeroiden ja numeroryhmien määrien mukaan.

Oma "tekoälyni" toimii jo kohtuullisesti. Vaatii tosin vielä hiukan hienosäätöä, jotta jättää joitain tyhmyyksiä tekemättä ja tällä hetkellä voi vielä jäädä "jumiin" joissain tilanteissa. Tähän olen miettinyt jo korjauksen valmiiksi.

Tältä meno näyttää nyt ilman siirtojen laskemista.

jsbasic [28.12.2018 18:27:26]

#

Tuo dropboxista löytynyt tekoälysi oli vielä helppo vastus. Kannattaa muuten laittaa versionumero, jotta tietää mihin viittaa.

os [28.12.2018 20:43:20]

#

Mielenkiintoinen kilpailu, kiitoksia Metabolixille järjestämisestä! Tällä kertaa ehdin varmaankin jopa osallistua.

Kontribuoin pari obfuskoitua harjoitusvastustajaa kirittämään kisaa:

1. osvastus1.js Voittaa jalskin harjoitusvastustajan mutta helpohko (?) voittaa ihmispelaajana
2. osvastus2.js Voittaa edellisen vastustajan ja minut joka kerta

Näitä pitäisi voida ajaa Nodella (testasin v. 8.11.4:lla Debianilla) näin

python KilpailuProxy.py node /path/to/osvastus2.js

Hyvä kysymys, mikä olisi sopivin tapa jakaa harjoitusvastustajia jakamatta varsinaisesti lähdekoodia. Tämä vaikutti vähemmän hasardilta kuin jalskin binäärit (jotka kuitenkin ajoin, toivottavasti eivät olleet malwarea :D)

jalski [28.12.2018 21:11:59]

#

jsbasic kirjoitti:

Tuo dropboxista löytynyt tekoälysi oli vielä helppo vastus. Kannattaa muuten laittaa versionumero, jotta tietää mihin viittaa.

Tuossa ei vielä ollut varsinaisesti älyä mukana, vaan oli lähinnä testi graafi toteutukselle. Graafilta kysyttiin sijainnin naapuri solmut ja vastauksena saatiin lista solmuista suuntineen ja pistearvoineen. Lista sortattiin ja valittiin se missä oli suurin pistearvo. Jos ympärillä oli pelkkää tyhjää, niin arvottiin suunta.

Nykyinen versio ei käytä satunnaisuutta ollenkaan ja suunnistaa automaattisesti potentiaalien avulla.

Metabolix [28.12.2018 21:59:22]

#

os kirjoitti:

Hyvä kysymys, mikä olisi sopivin tapa jakaa harjoitusvastustajia jakamatta varsinaisesti lähdekoodia.

Jos resurssit eivät ole tiukalla ja luottamusta KilpailuProxyyn riittää, nykyisellä systeemillä voisi kai laittaa ohjelman KilpailuProxylla omalle palvelimelle julkisesti tavoitettavaksi.

L2-K2 [29.12.2018 10:09:57]

#

os kirjoitti:

(28.12.2018 20:43:20): Mielen­kiin­toinen kilpailu, kiitoksia...

Molemmat linkit johtavat samaan tiedostoon? Ainoastaan tiedoston nimi vaihtuu, pelitapa ja ainakin md5-tiiviste ovat samat molemmille.

Molemmat tekoälyt esiintyivät siis nimellä "osvastus1" pelissä, ja lisäksi kun ainakin välillä ihmiselle häviävä oma yksinkertainen "tekoälyni" voitti tuon jälkimmäisen suoraan erin 4–0, niin alkoi epäilyttää, että ei tainnut tulla oikea äly peliin.

PS. Pitäisi varmaan opetella kirjoittamaan nopeampaa pythonia, tai sitten vaan muuntaa koodi C++ tai edes JS. 8–20 sekuntia saan tyypillisen pelin CPU-ajaksi. Haluaako joku suosittella hyvää python–javascript kääntäjää?

PPS. Kolmen aidosti erilaisen pelaajan samanaikainen peli toimi – kuten olettaa saattoi – tasaisemmin. Ihminen, osvastus1 ja omani älyni pelasivat tasan 1–1–1. Käteviä nuo spontaanit liittoumat pistejohtajaa vastaan.

os [29.12.2018 11:05:05]

#

L2-K2 kirjoitti:

Molemmat linkit johtavat samaan tiedostoon? Ainoastaan tiedoston nimi vaihtuu, pelitapa ja ainakin md5-tiiviste ovat samat molemmille.

Olet oikeassa. Olin vahingossa laittanut saman tiedoston molempiin. osvastus2.js-Gist on nyt korjattu.

EDIT: vs.ps.: Minulla ei ole kokemusta Python-JS-kääntäjistä. Nuo omat teköälyni on kirjoitettu C++:lla ja käännetty Emscriptenillä Javascriptiksi... jota Node näyttäisi suureksi hämmästyksekseni ajavan melkein yhtä nopeasti kuin natiivikoodiksi käännettyä C++:aa. Voi myös olla, että jos tekoäly olisi alunperin kirjoitettu JS:llä niin nopeus ei välttämättä olisi yhtä hyvä

Jaska [29.12.2018 12:21:09]

#

os kirjoitti:

EDIT: vs.ps.: Minulla ei ole kokemusta Python-JS-kääntäjistä.

Ei kai tällaista voikaan tehdä ainakaan täydellisesti. Esimerkiksi Pythonissa voi kirjoittaa

const = 1

mutta Javascriptissä const on varattu sana. Mutta ehkä kääntäjän tekemiseen riittää, että jotkut toiminnallisuudet toimivat Pythonilla ja siitä käännetyllä JS:llä.

jsbasic [30.12.2018 14:13:30]

#

os kirjoitti:

Nuo omat teköälyni on kirjoitettu C++:lla ja käännetty Emscriptenillä Javascriptiksi... jota Node näyttäisi suureksi hämmästyksekseni ajavan melkein yhtä nopeasti kuin natiivikoodiksi käännettyä C++:aa. Voi myös olla, että jos tekoäly olisi alunperin kirjoitettu JS:llä niin nopeus ei välttämättä olisi yhtä hyvä

Mielenkiintoista. Emscripten kääntää C++-koodin asm.js-koodiksi, joka on javascriptin "alajoukko". Tai lieneekö se javascriptiä laisinkaan, koska siitä on poistettu dynaamisuus ja roskienkeruu... Olisiko se nyt edes järkevää kääntää natiivikoodia ylemmälle tasolle?

Wikipedia: Asm.js#Performance

Oma tekoälyni on tällä hetkellä python-koodia, mutta yritän vielä luoda erillisen C++-version, jonka voisin kääntää asm.js-koodiksi, ja julkistaa täällä harjoitusvastustajana...

TapaniS [30.12.2018 20:48:26]

#

os kirjoitti:

(28.12.2018 20:43:20):
1. osvastus1.js Voittaa jalskin harjoitusvastustajan mutta helpohko (?) voittaa ihmispelaajana
2. osvastus2.js Voittaa edellisen vastustajan ja minut joka kerta

Näitä pitäisi voida ajaa Nodella (testasin v. 8.11.4:lla Debianilla)

Saako näitä toimimaan win -ympäristössä? Harjoitusvastustajaa tarvittaisiin! Miten js-tiedostot saa pelittämään KilpailuProxyllä?

os [30.12.2018 21:24:33]

#

TapaniS kirjoitti:

Saako näitä toimimaan win -ympäristössä? Harjoitusvastustajaa tarvittaisiin! Miten js-tiedostot saa pelittämään KilpailuProxyllä?

En ole testannut, mutta kyllä pitäisi saada. Eli asenna ensin Node.js ja sitten aja

KilpailuProxy.exe node osvastus2.js

olettaen että osvastus2.js on samassa kansiossa.

Jaska: Pythonia voi kyllä kääntää C-kieleksi (https://cython.org/, http://nuitka.net/) ja JavaScriptiksi (https://www.transcrypt.org/). Kielten erilaiset varatut sanat tuskin ovat kääntäjille merkittävä ongelma. Eihän muuttujan nimiä esimerkiksi tarvitse säilyttää ollenkaan, jos tavoitteena ei ole ihmisluettava koodi, vaan esim. asm.js.

L2-K2 [30.12.2018 22:06:09]

#

os kirjoitti:

(29.12.2018 11:05:05): ”– –” Olet oikeassa. Olin vahingossa laittanut saman...

Paljon johdonmukaisempi tulos oikean version kaksi kanssa: "osvastus2" >> oma ykkösversioni älystä >> "osvastus1".

Pitänee siis vetää mietintämyssy selvästi syvemmälle ja pohtia joku oikeasti älykäs tapa valita siirtonsa.

os kirjoitti:

TapaniS kirjoitti:

Saako näitä toimimaan win -ympäristössä? Harjoitusvastustajaa tarvittaisiin! Miten js-tiedostot saa pelittämään KilpailuProxyllä?

En ole testannut, mutta kyllä pitäisi saada. Eli asenna ensin Node.js ja sitten aja

KilpailuProxy.exe node osvastus2.js

olettaen että osvastus2.js on samassa kansiossa.

Tämä toimii. Testasin siis juuri kyseisellä yhdistelmällä, ja toki "..\" -jne. jos ja kun ei halua kopioida noita älyjä kilpailuproxyn kanssa samaan kansioon tai säätää komentokehotteen polun kanssa.

TapaniS [30.12.2018 22:13:06]

#

Joo, kiitos paljon! Lähti toimimaan. TaSman jää vielä jälkeen, mutta pitää säätää lisää ...

jalski [30.12.2018 22:30:21]

#

TapaniS kirjoitti:

Joo, kiitos paljon! Lähti toimimaan. TaSman jää vielä jälkeen, mutta pitää säätää lisää ...

Oma yksinkertainen kehitysversioni jää osvastus2:sesta yleensä noin 100-200 pisteen päähän erässä. Täytyy säätää hiukan arvoja ja kokeilla lisätä pari juttua...

Tegu [31.12.2018 16:16:29]

#

Hauska kilpailu, etenkin jos pelaajia oikeasti tulee laudalle suunnilleen toista kymmentä samanaikaisesti. Kokeilin 64 pelaajaa samaan aikaan, ja yhtäkkiä tilaa onkin reilusti vähemmän, ja kaikkialla tapahtuu. Mielenkiintoinen twisti, kun kovin pitkiä suunnitelmia ei varmaan ihan helposti saa tehtyä? Luultavasti käyttäytyminen tiiviissä usean pelaajan ympäristössä ratkaisee enemmän kuin kaksintaistelukokeilut.

Tässä yksi tulos, mutta satunnaisuus tuntui vaikuttavan aika paljon. Pitäisi varmaan olla joku automatisoidumpi testipenkki, jos vaan jaksaisi kyhäillä. https://i.imgur.com/EhiDljO.png

Tällä kertaa halusin opetella Rustia, ja tuo onkin toinen Hello Worldia pidempi ohjelmani sillä (toinen oli yksi Advent of Coden päivä). Räpellys on sen mukaista.

En kehdannut kysyä tätä ennen kuin oli jotain valmista, mutta olisiko mahdollista saada Rust sallittujen kielien joukkoon (käyttämäni versio on 1.31.1)? :) Ei toki välttämätöntä, jos se aiheuttaa kohtuutonta vaivaa (esim. jos tarkoitus on käännellä selaimessa pyöriväksi).

jsbasic [31.12.2018 19:12:40]

#

Tegu kirjoitti:

Pitäisi varmaan olla joku automatisoidumpi testipenkki, jos vaan jaksaisi kyhäillä.

Harmi että socket-ohjelmointi ei ole minun alaani. Miten tuollaiseen osoitteeseen (ws://localhost:50001/kilpailu) pitäisi käydä käsiksi? Lisäksi tuo Kilpailuproxyn ja Poimintapelin välinen rajapinta ei luonnollisesti ole avoin, kuten Kilpailuproxyn ja tekoälyjen rajapinta.

Penkin voisi toteuttaa unix-putkena, mutta 64 kilpailijaa putkessa olisi jo ajatuksena erikoinen.

TapaniS [01.01.2019 10:02:49]

#

Ohessa TaSman8 harjoitusvastustajaksi. Tämä on toteutettu Javalla ja aika tasaväkinen osvastus2:n kanssa. Ohjelma tutkii siirtoja 8 vuoroa eteenpäin ja valitsee parhaimman jatkon. Lopulliseen versioon on kuitenkin tulossa huomattavia parannuksia, joita en vielä voi paljastaa ...

Metabolix [01.01.2019 18:04:53]

#

jsbasic kirjoitti:

Miten tuollaiseen osoitteeseen (ws://...) pitäisi käydä käsiksi?

WebSocketilla.

jsbasic kirjoitti:

Lisäksi tuo Kilpailuproxyn ja Poimintapelin välinen rajapinta ei luonnollisesti ole avoin, kuten Kilpailuproxyn ja tekoälyjen rajapinta.

Ai mikä rajapinta ei ole avoin? Mielestäni WebSocket-rajapinta on aivan täysin avoin, ja mitään muuta dataa ei lähetetä kuin kilpailuohjeiden mukaisia viestejä ja lopussa ajankäyttötiedot.

Tegu kirjoitti:

Pitäisi varmaan olla joku automatisoidumpi testipenkki, jos vaan jaksaisi kyhäillä.

Onko sinulla jokin idea, jonka voisi turvallisesti, hyödyllisesti ja kohtuullisella vaivalla lisätä testaussivulle myös tulevia kilpailuja ajatellen?

Tällä hetkellä usean tekoälyn pelin vakiosiemenellä saa helposti aloitettua, kun laittaa testaussivun Katselu-osaan dataa, jossa on replayn sijasta osoitteita:

{
  "identifier": "2018-poimintapeli",
  "boardSeed": 1234,
  "addresses": [
    "ws://localhost:50001/kilpailu",
    "ws://localhost:50002/kilpailu",
    "ws://localhost:50003/kilpailu"
  ]
}

Tegu kirjoitti:

Olisiko mahdollista saada Rust sallittujen kielien joukkoon?

Rust onnistuu.

jalski [01.01.2019 20:11:29]

#

Metabolix kirjoitti:

Tegu kirjoitti:

Olisiko mahdollista saada Rust sallittujen kielien joukkoon?

Rust onnistuu.

Tegu, onneksi Rust ei ole yksi käyttämistäni ohjelmointikielistä. Muuten olisi tuokin ollut mahdotonta...

Metabolix [01.01.2019 20:23:43]

#

jalski kirjoitti:

Tegu, onneksi Rust ei ole yksi käyttämistäni ohjelmointikielistä. Muuten olisi tuokin ollut mahdotonta...

jalski, tuo on jo röykeää. Olet pyytänyt ja saanut aiemmin mahdollisuuden Infernon Limboon (jonka virittelyyn meni tunteja, ja jätit silti osallistumatta) ja Fortraniin ja jopa PL/I:hin. Sinulle on siis jo toteutettu enemmän ja hankalampia toiveita kuin muistaakseni muille pyytäjille yhteensä. Eli mietipä kaksi kertaa asennettasi ja keskity vaihtelun vuoksi asiaan äläkä hifistelyyn oudoilla kielillä.

Rust on kohtuullisen tunnettu ja isoissakin projekteissa käytetty. Sen asennus onnistui komentorivillä yhdellä komennolla, samoin ohjelman kääntäminen optimointeineen.

Sen sijaan pyytämäsi 8th on paitsi äärimmäisen tuntematon, myös suljettua lähdekoodia ja kaupallinen. Jopa ilmaisversion lataamiseksi pitäisi erikseen hyväksyä lisenssi ja antaa sähköpostiosoite firmalle. Tässä on mielestäni riittävästi syitä olla ottamatta kyseistä kieltä koneelleni.

johku90 [02.01.2019 17:12:22]

#

Kiitoksia Metabolixille hienosta kilpailusta. Eiköhän tällä aikataululla nähdä minunkin viritys :P

Tegu [03.01.2019 01:48:59]

#

Kieltämättä meni hieman hifistelyksi ja kokeilunhaluksi itsellänikin. Olisihan sitä ihan hyvin voinut käyttää jotain valmiiksi tuettua kieltä, kun lista on jo nyt mukavan vaihteleva (etenkin kun nyt vilkaisin listaa uudelleen).. Kiitos siis vaivannäöstä!

Lähetin ensimmäisen version mukaan. Hieman toivon, etten joudu jättämään sitä lopulliseksi. Mietintämyssyä joutuu täälläkin käyttämään, että keksisi joko parannusta tai eri lähestymistapaa.

Metabolix kirjoitti:

Onko sinulla jokin idea, jonka voisi turvallisesti, hyödyllisesti ja kohtuullisella vaivalla lisätä testaussivulle myös tulevia kilpailuja ajatellen?

Ei valitettavasti ole mitään sen konkreettisempaa ideaa. Lähinnä huomasin, että älyjen järjestys vaihtelee paljonkin riippuen laudasta tai satunnaisten älyjen tapauksessa ajosta. Sen vuoksi kävi mielessä ajaa pelejä automaattisesti eri laudoille ja koostaa jotenkin tulokset. Näin voisi vertailla omia kehitysversioitaan (ja muiden ohjelmia) laajemmalla otoksella. En sitten ole varma, olisiko tuo edes järkevä tapa kehittää älyä.

Tulevia kilpailuja ajatellen tuosta ei varmaan olisi niin hyötyä, koska se taitaa joka tapauksessa muistuttaa kisan lopullisia ajoja.

Metabolix kirjoitti:

Tällä hetkellä usean tekoälyn pelin vakiosiemenellä saa helposti aloitettua, kun laittaa testaussivun Katselu-osaan dataa, jossa on replayn sijasta osoitteita

Tämä onkin kätevä ominaisuus! Ei ainakaan tarvitse klikkailla niin paljoa, kun eri järjestelyitä voi tallentaa ja ladata uudelleen.

reino [05.01.2019 16:29:25]

#

Kun kerran pythonissa on sallittu numpy niin linkitetäänhän c-ohjelmat myös libmath:in kanssa?

Haluaisin myös tarkennusta siihen että missä kohtaa tekoälyn pitäisi tulostaa oma nimensä. Oma tekoälyni tulostaa nimensä kentän lukemisen jälkeen, mutta osvastus1 ja osvastus2 tulostaa nimen pelaajien määrän lukemisen jälkeen. Ohjesivu on järjestyksen osalta epäselvä. Testausohjelma toimii kummankin järjestyksen kanssa mutta huomasin ongelman kirjoittaessa omaa testausohjelmaa.

Ja jalskin ohjelmasta vielä, miten on mahdollista että 8th generoiman binäärin koko on 12M vs. 15K gcc:n kääntämä tekoäly? Liekö sitten 8th:n generoima koodi jotenkin obfuskoitua vai onko siellä kenties tulkki taustalla (disassemblointi näytti ainakin mielenkiintoiselta)?

Metabolix [05.01.2019 16:35:55]

#

reino, math.h on toki sallittua standardi-C:tä. Vai tarkoitatko jotain muuta? C++:ssa on myös hyödyllinen valarray.

Nimen tarkalla tulostushetkellä ei ole merkitystä, kunhan se on ensimmäinen tuloste.

jalski [05.01.2019 17:41:26]

#

reino kirjoitti:

Ja jalskin ohjelmasta vielä, miten on mahdollista että 8th generoiman binäärin koko on 12M vs. 15K gcc:n kääntämä tekoäly? Liekö sitten 8th:n generoima koodi jotenkin obfuskoitua vai onko siellä kenties tulkki taustalla (disassemblointi näytti ainakin mielenkiintoiselta)?

8th on Forth johdannainen, joten tulkki löytyy kyllä taustalla ja sanat käännetään todennäköisesti tavukoodiksi. Suorituskyky on riittävä useimpiin sovelluksiin. Käännetyt binäärit ovat itselläni ainakin n. 7500 kt, josta JUCE vie todennäköisesti suurimman osan.

ahr [07.01.2019 01:59:47]

#

Kiitos hauskasta kisasta, erityisesti sääntöjen yksinkertaisuus miellyttää.

Oma tekoälyni käyttää jonkin verran raakaa voimaa (n. 1s/peli, C++), toivottavasti ei ole liian hidas javascriptille käännettynä.

Kiitos myös os:lle kirityksestä. Saatan vielä itsekin jakaa kevennetyn js-version, jos vain saan emscriptenin toimimaan.

Metabolix [07.01.2019 17:37:40]

#

ahr kirjoitti:

toivottavasti ei ole liian hidas javascriptille käännettynä.

JS-käännös, jos se edes toteutuu, on toki vain bonus kisan päättymisen jälkeen; aikarajalla ei ole siinä enää merkitystä.

jo123 [09.01.2019 00:27:43]

#

Sain vihdoinkin tämän neuroverkkototetuksenkin oppimaan jotakin. Ei silti muiden tarvitse olla huolissaan, ei tämä kovin hyvä ole (oikeastaan aika huono toistaiseksi, voittaa kyllä minut) :) Tarvitsisi lisäsäätöä ja ennen kaikkea järkyttävän määrän tunteja koulutusta, että tästä tulisi oikeasti kilpailukykyinen, ja luulen etten itse tähän enää tunteja upota. Ei sillä, olihan tämä ihan opettavaista ja hauskaa jo nykyiselläänkin. Koulutin tätä nyt neljällä pelaajalla noin 30h GTX-1080 tason näytönohjaimella. Erilliset neuroverkot siis pelasivat peliä keskenään. Kouluttaminen tarkoittaa käytännössä funktion (jota siis nyt tällä kertaa kutsutaan neuroverkoksi) sovittamista dataan, neuroverkko on turhan romantisoitu ilmaisu mielestäni.

Ongelmana tosin on, että painot ovat pakattuinakin kooltaan noin 1.7Mt, mikä on jonkin verran datatiedostolle sallitun 1Mt:n yli :D. Ehkä singluaariarvohajotelman avulla pakkaamalla saisin näitä matriiseja kutistettua tarpeeksi (hävikillistä). Eli onko tuo 1Mt:n raja ehdoton? Tietysti voisin myös laittaa puolet painoista tekstinä osaksi kooditiedostoa, jolloin kummankaan datatiedoston eikä kooditiedoston koko ehkä olisi yli 1Mt :P

Voin antaa linkin git-repoon kunhan kilpailuaika päättyy, jos jotakuta kiinnostaa. Varsinainen suorittava koodi kun ei käytännössä kerro neuroverkkojen tapauksessa juuri mitään.

Metabolix [09.01.2019 19:08:10]

#

jo123: Kyllä näistä rajoista pidetään kiinni, ja lisäksi sääntöjen kiertäminen kepulikonsteilla (kuten sijoittamalla runsaasti dataa lähdekoodiin tilarajoituksen kiertämiseksi) on hyvän tavan vastaista ja näin siis myöskin (strategisen löyhästi kirjatuissa) säännöissä kielletty.

jo123 [10.01.2019 11:18:28]

#

Metabolix kirjoitti:

(09.01.2019 19:08:10): jo123: Kyllä näistä rajoista pidetään kiinni...

Jees :) anteeksi turha kyseleminen...täytyy katsoa, jos pääsisin tuohon 1Mt.

Edit: Juuh, eihän tämä edes ollut mikään ongelma, ihan omaa tyhmyyttä. Tallensin nyt painon kahteen tavuun neljän tavun sijasta, ja tarkkuus riittää vallan mainiosti.

jsbasic [12.01.2019 15:56:05]

#

os kirjoitti:

python KilpailuProxy.py node /path/to/osvastus2.js

Hyvä kysymys, mikä olisi sopivin tapa jakaa harjoitusvastustajia jakamatta varsinaisesti lähdekoodia. Tämä vaikutti vähemmän hasardilta kuin jalskin binäärit (jotka kuitenkin ajoin, toivottavasti eivät olleet malwarea :D)

Niin, olen miettinyt samaa ongelmaa. Onko olemassa jotain yleistä tapaa ajaa koodia hiekkalaatikossa niin, että ainoa vuorovaikutus olisi standardit virrat tai muu ascii-yhteensopiva viestinvälitys?

Ensin tulee mieleen emulaattorit, mutta ne harvoin käyttävät stdout:ia puhumattakaan stdin:sta. Dosemu kaatuu, jos sille syöttää jotain. Olisiko Brainfuckista tähän. Ainakin on olemassa joitain C->BF kääntäjiä. Virtuaalikoneista ei ole kokemuksia. Ne kuulostavat raskaita tähän ongelmaan.

Edes C-koodin obfuskoitiin ei tunnu löytyvän sopivaa, pientä ohjelmaa.

Node ei taida olla täysin turvallinen sekään?

os [13.01.2019 12:23:34]

#

jsbasic kirjoitti:

Node ei taida olla täysin turvallinen sekään?

Node ei tosiaan ole yhtään turvallisempi kuin binäärikoodi. Se ei pyöri minkäänlaisessa hiekkalaatikossa vaan voi tehdä koneella mitä vaan käyttäjän oikeuksien puitteissa. Valitsin sen siksi, että JS-koodia voi sen avulla helposti pyörittää sekä Windowsissa, Linuxissa että OSX:ssä, ja asm.js-koodi on käytännössä lukukelvottomaksi obfuskoitua.

Jos jaettujen teköälykoodien hyväntahtoisuudesta on huolissaan, voi niitä toki ajaa virtuaalikoneessa, mikä tekee pahanteosta ainakin huomattavasti vaikeampaa.

Toisenlaisen hiekkalaatikon voisi toteuttaa myös niin, että testaussivu tukisi (KilpailuProxyn lisäksi) selaimessa pyöriviä JavaScript-tekoälyjä, joiden lähdekoodin voisi esimerkiksi syöttää johonkin tekstikenttään. Tämä vaatisi sen, että kilpailulla olisi stdin/stdout-API:n lisäksi myös erillinen JavaScript-API.

Testauksesta: Pelimekaniikka on kilpailussa täysin julkinen ja esimerkkiohjelmissa myös melkein kokonaan implementoituna. Tämän avulla on suhteellisen helppo rakentaa testiohjelma, joka pelauttaa vaihtoehtoisia samalla ohjelmointikielellä toteutettuja teköälyjä toisiaan vastaan saman prosessin sisällä ilman mitään socketteja tai muuta I/O:ta. Tekoälylle pitää vaan määrittää jonkinlainen natiivirajapinta. Omassa toteutuksessani se näyttää tältä:

class Aly {
public:
  virtual char siirto(const Peli &peli) = 0;
  virtual ~Aly() {}
};

L2-K2 [13.01.2019 20:37:02]

#

jo123 kirjoitti:

(09.01.2019 00:27:43): Sain vihdoinkin tämän...

Pitääkin sitten kilpailun päätteeksi katsoa, että miten valitsit lähtömuuttujat verkollesi. Sehän se oikeasti noissa neuroverkoissa (lue: hassusti määritellyn funktion joka antaa tässä jonkun neljästä mahdollisesta kirjaimesta ulos) on se kriittinen vaihe, joka ei oikeasti ole automatisoitavissa (ja joka olisi esimerkiksi sille edelliselle kilpailupelille ollut hyvin vaikeaa tehdä järkevästi – ainakin mielestäni).

Lähetin oman ohjelmani kilpailuun, ja nyt pitää pohtia pitäisikö joistain sen osaominaisuuksilla olevasta versiosta tehdä asm.js -käännös muille harjoitusvastustajaksi ennen kilpailun loppumista vai ei.

Ei ole neuroverkkoja.. vaan ihan konventionaalisempi lähestymistapa (jossa on ainakin yksi paha heikkous jota en ajatellut ennen kilpailun sulkeutumista paljastaa).

TapaniS [14.01.2019 08:55:54]

#

Harjoitusvastustajia kaipaisin lisää. TaSman jyrää nykyiset harjoitusvastustajat, mutta hiukan hankala hahmottaa, mitä tapahtuu, jos laudalla on yhtäaikaa enemmän pelaajia.

Montako pelaajaa on mukana loppukilpailussa?

Täytyy korjata sen verran, että tilanteet vaihtelevat aika paljon, kun laudalla on useampi pelaaja.

Metabolix [14.01.2019 13:43:46]

#

Tiedoitus: Tämänhetkisen osallistujamäärän perusteella veikkaan, että kisassa pelataan 6–12 pelaajan otteluita. Jos kuitenkin osallistujia tulee aivan yllättävän paljon, täytyy pohtia sopivaa ratkaisua.

os kirjoitti:

Toisenlaisen hiekkalaatikon voisi toteuttaa myös niin, että testaussivu tukisi selaimessa pyöriviä JavaScript-tekoälyjä

Sehän itse asiassa tukee; näin esimerkki toimii. Tekstikenttä vain puuttuu. Ehkäpä viilaan sellaisen seuraavaa kisaa varten. JavaScriptin suoritusmallin vuoksi tekoäly pitää toteuttaa funktiona, jota kutsutaan callback-tyylisesti kisaohjelman syötteellä. Tämä vaatii perinteiseen komentoriviohjelmaan nähden hieman erilaista koodin järjestelyä, pääsilmukan sijaan tilakoneen. Mietinkin, millaisella ohjeistuksella tulevissa kisoissa saisi ohjattua tekoälyt tämäntapaiseen muottiin. Ehkä täytyy tehdä esimerkkiohjelmaan äärimmäisen lyhyt pääohjelma, jota ei saisi muokata...

L2-K2 [15.01.2019 00:43:04]

#

os kirjoitti:

–– Nuo omat teköälyni on kirjoitettu C++:lla ja käännetty Emscriptenillä Javascriptiksi... jota Node näyttäisi suureksi hämmästyksekseni ajavan melkein yhtä nopeasti kuin natiivikoodiksi käännettyä C++:aa. Voi myös olla, että jos tekoäly olisi alunperin kirjoitettu JS:llä niin nopeus ei välttämättä olisi yhtä hyvä

Näin hieman ehkä tämän ketjun pääasiallisen aiheen sivuitse: mitä kirjastoa/funktiota käytit syötteen lukemiseen tuossa C++ ohjelmassasi josta teit emscripten-käännöksen Vai onko tuo stdin-toimivuus kiinni jostain kääntäjän lipusta?

Nuo sinun älysi siis toimivat minulla nodella, ja sain asennettua emscriptenin kääntöympäristön jotta olisin voinut kokeilla kääntää yhden harjoitusvastustajan javascriptiksi (alustana: Ubuntu 18.04, Windows Linux Subsystem). Ei toiminut, vaikka "Hello, world!" kääntyy ja toimii (riippumatta onko se iostream vai cstdio). Myöskään mikään kokeilemani minimalistinen ohjelma, jossa tehdään syötteen lukua ei toimi (iostream ja std::cin; cstdio ja scanf tai edes getc). Kaikki nämä ohjelmat jumittuvat syötteen lukuun (eivätkä ilmeisesti koskaan saa syötettä).

jsbasic [15.01.2019 15:02:15]

#

L2-K2 kirjoitti:

Kaikki nämä ohjelmat jumittuvat syötteen lukuun (eivätkä ilmeisesti koskaan saa syötettä).

Hauska sattuma, että myös dosemu kaatuu syötteenlukuun, vaikka näillä ei ole keskenään mitään tekemistä. Olisi ollut hauska kokeilla toteutusta vaikka QBASIC:lla.

echo "testisyote" | dosemu -dumb "omavastus.exe"

ERROR: cpu exception in dosemu code outside of VM86()!
....
CPU was in user mode
Exception was caused by non-available page

Tässä alkaa kiinnostamaan Adruinot ja Rasberryt, koska hiekkalaatikko ei näytä muuten onnistuvan.

Metabolix [15.01.2019 16:08:26]

#

Virtuaalikone on melko helppo ratkaisu. Yksinkertaisinta on laittaa sekä tekoäly että KilpailuProxy virtuaalikoneeseen ja ohjata isäntäkoneelta jokin portti virtuaalikoneelle asetuksista tai vaikka SSH:lla.

Kielivalintana QBasicin tilalle sopii ihan kilpailussakin FreeBASIC, jolla saa lähes samat koodit käännettyä nykyaikaisille käyttöjärjestelmille, kunhan ei yritä käyttää reaalitilan tyyliin muistia tai portteja tms.

Kisan tuloksia ajatellen saa mielellään jo ehdottaa kiinnostavia tilastoja.

R1xa [15.01.2019 22:55:50]

#

Hienot puittet tehty kilpailulle.

Tuolta pitäisi vastata yksi toteutus, jos joku haluaa kokeilla:

ws://193.210.228.180:50001/kilpailu

os [16.01.2019 22:54:08]

#

L2-K2 kirjoitti:

Näin hieman ehkä tämän ketjun pääasiallisen aiheen sivuitse: mitä kirjastoa/funktiota käytit syötteen lukemiseen tuossa C++ ohjelmassasi josta teit emscripten-käännöksen Vai onko tuo stdin-toimivuus kiinni jostain kääntäjän lipusta?

Nuo sinun älysi siis toimivat minulla nodella, ja sain asennettua emscriptenin kääntöympäristön jotta olisin voinut kokeilla kääntää yhden harjoitusvastustajan javascriptiksi (alustana: Ubuntu 18.04, Windows Linux Subsystem). Ei toiminut, vaikka "Hello, world!" kääntyy ja toimii (riippumatta onko se iostream vai cstdio). Myöskään mikään kokeilemani minimalistinen ohjelma, jossa tehdään syötteen lukua ei toimi (iostream ja std::cin; cstdio ja scanf tai edes getc). Kaikki nämä ohjelmat jumittuvat syötteen lukuun (eivätkä ilmeisesti koskaan saa syötettä).

Joo, siinä olikin vähän virittämistä. Ongelma johtuu siitä, ettei blokkaaminen odottamaan stdinin lukemista mielivaltaisessa paikassa ohjelmaa käytännössä onnistu JavaScriptin toimintaperiaatteesta johtuen. Tästä pääsee yli muuttamalla pelimekaniikan tilakonemuotoon (kuten Metabolix aiemmin päättelikin), jolloin stdiniä voi lukea Noden ehdoilla.

Laitoin oman ohjelmani rungon nyt Githubiin jakoon. Sieltä löytyy tilakone ja tarvittavat Node+emscripten-viritykset mutta ei varsinaista tekoälyä tai harjoitusturnauskoodia... ainakaan vielä ;)

https://github.com/oseiskar/poimintapeli-2019

L2-K2 [17.01.2019 04:56:52]

#

os kirjoitti:

Joo, siinä olikin vähän virittämistä. Ongelma johtuu siitä, ettei blokkaaminen odottamaan stdinin lukemista mielivaltaisessa paikassa ohjelmaa käytännössä onnistu JavaScriptin toimintaperiaatteesta johtuen. Tästä pääsee yli muuttamalla pelimekaniikan tilakonemuotoon (kuten Metabolix aiemmin päättelikin), jolloin stdiniä voi lukea Noden ehdoilla.

Laitoin oman ohjelmani rungon nyt Githubiin jakoon. Sieltä löytyy tilakone ja tarvittavat Node+emscripten-viritykset mutta ei varsinaista tekoälyä tai harjoitusturnauskoodia... ainakaan vielä ;)

https://github.com/oseiskar/poimintapeli-2019

Kiitos, näyttää oikein selkeältä ja olisihan tuon osin voinut päätellä siitä Metabolixin viestistä (ei tosin ehkä olisi ihan hetkessä tullut tuota saanut koodattua, kun aikaisempi emscripten-kokemus on puhdas 0).

Vaatinee siis jonkin verran muutostyötä, että saa oman harjoitusvastustajansa muokattua vaaditulla tavalla puhtaaksi tilakoneeksi, mutta paljon vähemmän koodausta kuin ilman tuollaista selkeää esimerkkiä (ja valmiiksi noita sinun tekemiäsi boilerplate-henkisiä välttämättömiä ”nodemain.cpp” ja ”main.js” palikoita).

Eiköhän sitä ensi viikonloppuna voisi jakaa harjoitusvastustajan (hämäämään muita optimoimaan älynsä sitä vastaan, jotta varsinainen äly voi rauhassa... ei-ku ;-).

jo123 [17.01.2019 11:32:10]

#

L2-K2 kirjoitti:

Pitääkin sitten kilpailun päätteeksi katsoa, että miten valitsit lähtömuuttujat verkollesi. Sehän se oikeasti noissa neuroverkoissa (lue: hassusti määritellyn funktion joka antaa tässä jonkun neljästä mahdollisesta kirjaimesta ulos) on se kriittinen vaihe, joka ei oikeasti ole automatisoitavissa (ja joka olisi esimerkiksi sille edelliselle kilpailupelille ollut hyvin vaikeaa tehdä järkevästi – ainakin mielestäni).

Tämä pelihän on siitä hauska, että se on paitsi pelilaudan siirtojen suhteen symmetrinen myös rotaatioiden suhteen symmetrinen (pelilaudan siirtämisen tai kiertämisen ei pitäisi vaikuttaa tehtävään siirtoon). Periaatteessa voisi siis tehdä verkon, joka tulostaa vain yhden luvun. Toteutin tosin omani huonosti, joten se outputtaa kyllä neljä lukua :D

FooBat [18.01.2019 02:34:03]

#

Tämähän on mukavan oloinen kilpailu. Helposti lähestyttävät säännöt ja silti varsin paljon syvyyttä erilaisissa strategioissa mitä tuohon voi toteuttaa. Pitää yrittää rakentaa jonkinlainen haastaja, vaikka sitä kuningasideaa ei vielä olekaan syntynyt.

ahr [19.01.2019 17:56:12]

#

Kiitos OS tuosta pohjasta! Uudemmalla node-versiolla (v11.6.0) ei toiminut ihan suoraan: koodasin syötteenluvun uudelleen readline-moduulilla.

Tässä nykyisestä tekoälystäni laskusyvyydeltään kevennetty versio: https://gitlab.com/snippets/1799302 .

L2-K2 kirjoitti:

Vaatinee siis jonkin verran muutostyötä, että saa oman harjoitusvastustajansa muokattua vaaditulla tavalla puhtaaksi tilakoneeksi

Itse pidin tilan kauniisti globaaleissa muuttujissa kuten alkuperäisessä ohjelmassani, korvasin vain mainin tuolla tilakoneen rivinlukufunktiolla.

TapaniS [19.01.2019 21:50:11]

#

Kiitos uudesta harjoitusvastustajasta! Aika hyvä tämäkin kyllä on! Lohdutuksena voisin todeta, että laskentasyvyyden lisääminen ei välttämättä johda parempaan lopputulokseen.

L2-K2 [20.01.2019 05:34:53]

#

ahr kirjoitti:

(19.01.2019 17:56:12): Kiitos OS tuosta pohjasta! Uudemmalla node...

Ei joo ole ihan ”plug-and-play” saada näköjään nodella pelittämään stdin. Joku ongelma tuon ”emscripten/bind.h” kanssa kääntöympäristössäni, oletan.

Ajonaikaisesta virheestä päätellen siis uusimmalla versiolla (ja myös Ubuntu 18.04 paketinhallinnan versiolla) emscripteniä ei tule noita tuolla määritettyjä funktiota ”käännettyyn” JS-koodiin (ainakaan siis kun emscripten-kääntäjä on asennettuna Windows Linux Subsystem sisälle): Kun tuota ”os” esimerkkiä kokeilin kääntää (ja käänsinkin), niin ajonaikaisesti tulee ”TypeError: alustus is not a function”. [Missä alustus on siinä käsin kirjoitetussa JS oleva kääre kutsumaan sitä ”nodemain.cpp”:ssä määriteltyä funktiota.]

Siispä en saanut emscripten-versiota pelittämään sillä määrällä aikaa, mitä ajattelin tuon emscriptenin opetteluun tällä kertaa käyttää, joten valitettavasti ei ole harjoitusvastustajaa teille jakaa tällä kertaa.

Ajoympäristö toimii kyllä, koska myös ahr:n älyä voin ajaa ja testata. (Koska en itse anna muille kiusoitteluversiota, niin reiluussyistä päätin olla hienosäätämättä omaa älyäni näiden testipelien perusteella mitä nyt ajelin. Saa mennä suosiolla hihavakioparametreilla.)

Metabolix [20.01.2019 15:22:49]

#

Innokkaille harjoitusvastustajien tekijöille ja käyttäjille ilouutinen! Lisäsin testaussivulle ominaisuuden, jolla voi laittaa JS-tekoälyjä pudotusvalikkoon. Nyt siis tarvitsee vain muuttaa tekoäly tällaiseen JavaScript-muotoon:

function (output) {
	// TODO: Tekoälyn kaikki asiat tähän väliin! Esimerkiksi luokka:
	var tekoäly = new Tekoäly()
	return function (input) {
		tekoäly.käsittele_syöte(input)
		if (tekoäly.peli_kesken) {
			output(tekoäly.tee_siirto())
		} else {
			return false
		}
	}
}

Tässä output on siis funktio ja input tulee merkkijonona (rivi kerrallaan). Merkkijonoihin ei tule rivinvaihtoja.

Koodit ajetaan iframessa sandbox-attribuutin kera, eli käsittääkseni tekoälyn ei pitäisi pystyä käytännössä muuhun kuin laskentaan. Firefoxilla ja Chromiumilla testasin, ja tuntui toimivan ihan hyvin. Toki varovaisuutta saa silti noudattaa.

Lisäksi näitä JS-tekoälyjä voi käyttää Katselu-sivun kautta aiemmin kuvaamassani formaatissa pelkällä nimellä, eli pelin saisi nopeasti käyntiin vaikka näin:

{
  "identifier": "2018-poimintapeli",
  "addresses": [
    "esim",
    "jstesti",
    "ws://localhost:50001/kilpailu"
  ],
  "boardSeed": 2062564522
}

ahr [21.01.2019 08:23:34]

#

L2-K2 kirjoitti:

Kun tuota ”os” esimerkkiä kokeilin kääntää (ja käänsinkin), niin ajonaikaisesti tulee ”TypeError: alustus is not a function”.

Tämä ongelma minullakin oli. Korjaantui (en tiedä vielä miksi), kun poistin WebAssemblyn käytöstä emcc:n lipulla "-s WASM=0".

Metabolix [21.01.2019 13:41:52]

#

Tässä on obfuskoitu versio tekoälystäni harjoitusvastukseksi: http://paste.dy.fi/yPk. Keskimmäinen rivi on itse tekoäly, ja kyseinen rivi riittää nykyisen testaussivun JS-tekoälyksi. Ensimmäinen ja viimeinen rivi ovat sitä varten, että koko palikka toimii suoraan myös komentorivillä SpiderMonkey-tulkilla. Todennäköisesti tämä versio jää myös kisakäyttöön.

TapaniS [21.01.2019 18:57:03]

#

En saanut Metabolixin harjoitusvastustajaa pelaamaan win-ympäristössä. Kuinkahan tuo onnistuisi? LenniJS ja osvastus2 kyllä toimivat hienosti!
----
Edit: No nyt lähti toimimaan! Piti ladata päivitetty testaussivu ja syöttää uuden valikon kohdalta koodi laatikkoon. Nyt testaillaan kovasti!

Niin - ja kiitokset uudesta ominaisuudesta testisivulla sekä harjoitusvastustajasta!

skeskinen [23.01.2019 02:19:00]

#

Kiitos järjestäjille mukavasta kilpailusta!

Täältä uutta harjoitusvastustajaa:
https://gist.github.com/skeskinen/665d504cfcb874e956d2bb0defbacb55
Saman tyyppinen formaatti kuin Metabolixilla, eli keskirivi jos haluaa pyörittää testaussivulla ja kaikki kolme nodelle.

Piti kokeilla Rustin kääntämistä Wasmiin ja se olikin aika näppärää. Sen sijaan wasmin muunto inlinettäväksi javascriptiksi olikin vähän turhan työlästä, vaikka omaan mokailuunhan siinä aika meni.

Libo [26.01.2019 17:11:29]

#

Metabolix kyseli kiinnostavien tilastojen perään. Jotenkin kiinnostaa kunkin tekoälyn suorituksen tasaisuus. Sitä voisi arvioida kunkin tekoälyn saamista pisteistä kyseisen pelikierroksen voittajaan suhteutettuna - ja tuon %-osuuden vaihtelusta. Siis jos yksi tekoäly saa aina 55-60% kunkin kierroksen voittajan pisteistä se on tasainen suoritus. Toisaalta jos toinen tekoäly saa 30-100% kunkin pelikierroksen voittajan pisteistä sen suoritus riippuu paljon pelilaudan ominaisuuksista tai jostain muusta eikä ole kovin tasainen suorittaja. %-osuuden keskiarvoa ja hajontaa/variaatiota siis ehdotan....

Metabolix [27.01.2019 22:24:32]

#

Libo: Kiitos, laitan tuollaisen. Saa ehdottaa vielä muutakin. Koodailen tilastoja näillä näkymin ensi viikonloppuna.

Kisaan on ilmoittautunut nyt 10 ohjelmaa. :)

TapaniS [29.01.2019 09:35:50]

#

Sain vihdoin pelikelpoisen version mukaan kisaan. Rekursioiden kanssa oli eniten vaikeuksia, niitä tulikin nyt harjoiteltua enemmän kuin koskaan aikaisemmin!

Omissa testeissäni tasaisimman tuloksen teki HalfLife3. Veikkaan sille hyvää loppusijoitusta. TaSman:in tulokset ovat epätasaisia: joskus se voi voittaa, mutta sitten se taas voi jäädä kauas kärjestä.

jsbasic [01.02.2019 17:45:37]

#

Koska tekoälylläkin on hiilijalanjälki, niin resurssien kulutus kiinnostaa. Tilasto ohjelman käyttämästä muistista ja ajasta olisi poikaa. Lisäksi käytetyt resurssit suhteessa voitettuihin pisteisiin kiinnostaisivat.

L2-K2 [02.02.2019 03:25:07]

#

jsbasic kirjoitti:

Koska tekoälylläkin on hiilijalanjälki, niin resurssien kulutus kiinnostaa. Tilasto ohjelman käyttämästä muistista ja ajasta olisi poikaa. Lisäksi käytetyt resurssit suhteessa voitettuihin pisteisiin kiinnostaisivat.

Tuo suoritusaika–suorituskyky -riippuvuus on kyllä mielenkiintoinen (etenkin tietyn tyylisille osin raakaa voimaa käyttäville älyille). Ainakin oman älyni tapauksessa joku alle 1 % laskenta-aikaa käyttävä nyrkkisääntöäly sai luokkaa yli 90 % pisteistä (ainakin kaksinpelissä kehittyneempää serkkuaan vastaan). Mutta, tuo tasolta ”voittaa lähes aina minut” tasolle ”ihan turha edes yrittää itse pelata tuota vastaan” pääsy oli laskennan puolesta yllättävän vaikeaa vaikka lopulta se ero pistemäärässä ei kovin iso ollutkaan- (Oleellisesti tämä siis paljastaa, että en keksinyt mitään ovelaa, vaan vauhti korjaa virheet ja voima tekniikan.)

Käytännössä siis jos joku meistä täällä keksi jonkun oivaltavan nyrkkisääntöälyn, niin kisan voi hyvin voittaa vaikka sen nopein äly.

johku90 [03.02.2019 22:33:04]

#

Ohhoh, menipä viime tippaan :O Mutta sielläpä on vielä yksi botti jonon jatkoksi...

FooBat [04.02.2019 18:02:08]

#

Onhan tässä vielä aikaa.

skeskinen [04.02.2019 18:15:17]

#

L2-K2 kirjoitti:

(02.02.2019 03:25:07): ”– –” Tuo suori­tu­sai­ka–­suo­ri­tuskyky -riip­pu­vuus...

Itsellä tuntui että ensimmäinen "nyrkkisääntöäly" oli suorastaan turhauttavan vahva. Mikään "fiksumpi" ratkaisu mitä yritin ei antanut merkittävästi parempaa tulosta omissa testeissäni.

Pelin luonteeseen kuuluu että parhaiten pärjää kun tekee asioita sopivasti erilailla kuin muut. Hyväkin idea voi kaatua siihen että muut tulevat kilpailemaan samoista numeroista.

Jos kilpailusta haluaisi tehdä vakavamielisemmän, niin tulee mieleen joku useamman kierroksen liiga. Esim. formaatti jossa joka kierroksella pitää löytää strategisia heikkouksia edellisen kierroksen voittajista.

Metabolix [04.02.2019 19:00:16]

#

Nyt on jo 15 ohjelmaa mukana. Näistä tulee pelilaudalle melkoinen kaaos. Alustavien ajojen perusteella kukaan ei ole selvästi ylivoimainen, mutta toivotaan, että vaikka tuhannen pelin perusteella alkaisi jo löytyä voittaja.

Tegu [04.02.2019 19:55:49]

#

skeskinen kirjoitti:

Mikään "fiksumpi" ratkaisu mitä yritin ei antanut merkittävästi parempaa tulosta omissa testeissäni.

Mulla ei edes ollut mitenkään erityisen vahva ratkaisu, mutta en silti saanut muutamilla muokatuilla ratkaisuilla luotettavaa parannusta.. Näin ollen kisaan jää ensimmäinen versioni vuodenvaihteesta. Vähän harmi, kun täälläkin on jo toinen toistaan parempia harjoitusvastuksia jaettu. Mielenkiinnolla kuitenkin odotan tuloksia ja muiden ratkaisutapoja!

skeskinen kirjoitti:

Jos kilpailusta haluaisi tehdä vakavamielisemmän, niin tulee mieleen joku useamman kierroksen liiga. Esim. formaatti jossa joka kierroksella pitää löytää strategisia heikkouksia edellisen kierroksen voittajista.

Tuosta tulee mieleen taannoisen Lukupeli-kisan voittaja PahaApina, joka hyödynsi suoraan välikierrosten siirtoja. :P

jsbasic [04.02.2019 21:11:43]

#

Tegu kirjoitti:

Mulla ei edes ollut mitenkään erityisen vahva ratkaisu, mutta en silti saanut muutamilla muokatuilla ratkaisuilla luotettavaa parannusta.. Näin ollen kisaan jää ensimmäinen versioni vuodenvaihteesta. Vähän harmi, kun täälläkin on jo toinen toistaan parempia harjoitusvastuksia jaettu.

Olen kokenut saman asian. Tein tehokkaimman version heti, mutta sitten tuli seinä vastaan. Osallistuin kuitenkin heikommalla versiolla. Se on persoonallinen.

Mikä piirre lopulta ratkaisee voiton? Oletin aluksi, että se olisi tekoäly, mutta olen muuttanut mieltäni. Poimintapeli on todella yksinkertainen. Kynnys on matala, mutta älykkyyskisa vaatisi paljon monimutkaisemmat puitteet. Hyvä esimerkki tekoälykilpailusta on Marcus Hutterin kilpailu Wikipedian pakkaamisesta. Putkaan ei sopisi noin monimutkainen kilpailu, mutta jotain datan ennustamiseen tai pakkaamiseen liittyvää sekin voisi olla. Useamman kierroksen liiga Poimintapelissä olisi tosiaan vakavamielisempi, kuten skeskinen sanoi.

Kaikesta huolimatta tämä oli opettavainen kilpailu. Tein pelistä oman version SDL-kirjastolla ja ohjelmoin itse POSIX-rajapinnan jolla luin prosessin in- ja out-virtoja. Socket-ohjelmointiakin kokeilin, mutta WebSocketista haluan pysyä kaukana.

L2-K2 [05.02.2019 00:43:52]

#

skeskinen kirjoitti:

(04.02.2019 18:15:17): ”– –” Itsellä tuntui että ensim­mäi­nen...

Valitsemassani nyrkkisäännössä oli sentään se hyvä puoli, että siitä oli melko luontevaa laajentaa siitä ”tarkka nyrkkisäännön ratkaisu pelin alkutilasta” muotoon ”likimainen ratkaisun parannus lähtien mielivaltaisesta tilasta kun muut ovat tehneet ’virheitä’”. Tuolla nyrkkisäännöllä (joka tulee sitten tulosten myötä ohjelman kuvauksessa) oli siksi ihan kiva skaalautuvuus lisälaskennalle. Ongelma toki on siinä, että se alkuoletus on hieman naurettava, eikä oikeasti pidä paikkaansa... (Siksi ’virheitä’ eikä virheitä.)

Tuon asioiden eri tavalla tekemisen allekirjoitan täysin. Kaksi samankaltaista älyä, joista kumpikin voitti (olisiko ollut) osvastus2 yksinään, hävisivät molemmat sille kun laittoi kaikki kolme laudalle samanaikaisesti. Jos tuo kävi jo välillä 2 -> 3, niin 15 tai useamman älyn samanaikainen peli voi olla tässä suhteessa todella kaoottista. Lisää yksi äly ja katso kun vielä äsken voittamassa ollut äly putoaa pahnanpohjimmaiseksi. Puhumattakaan jos joku teki ns. tasoittajan laudalle (joka siis pelaa aktiivisesti eniten pisteitä keränneitä – tai älyn evaluaation valossa keräämässä olevia – älyjä vastaan).

Useampi kierros toki ehkä muuttaisi asioita. Toisaalta pelkästään peliä seuraamalla on kyllä aika vaikea päätellä mitä mikin äly tekee.

Metabolix [05.02.2019 04:12:19]

#

Tosiaan 15 ohjelmaa ehti mukaan ennen kisan sulkeutumista.

Ajoin yhdellä tasolla (siemenluku heksadesimaalina 0x6b6c6c70) kaikki 6 ja 10 tekoälyn pelit, mutta pari tekoälyä jäi tuloksissa liian lähekkäin, joten ajan vielä ainakin toisen kokoelman pelejä, nyt muuttuvalla siemenluvulla.

Koetan saada tehtyä myös niitä JS-käännöksiä tekoälyistä.

jsbasic kirjoitti:

WebSocketista haluan pysyä kaukana.

WebSocket on kieltämättä hankala rajapinta itse toteutettavaksi, mutta onneksi siihen on kirjastoja. Mielestäni nykyinen testausjärjestely toimii paljon luotettavammin kuin aiemmat versiot (kuten useita vuosia käytössä ollut Java-viritelmä) ja on helpompi ylläpitää. Lisäksi harjoitusohjelmien JavaScript-versioiden julkaisu osoittautui yllättävän suosituksi.

Ehkäpä seuraavaan KilpailuProxyn versioon saadaan uusia ominaisuuksia kuten asetustiedosto ja mahdollisuus useaan ohjelmaan sekä jonkinlainen komentorivikäyttöliittymä, johon voisi kytkeä oman testausohjelman.

Libo [05.02.2019 20:16:04]

#

Omissa testeissäni kaksintaisteluissa oli selvempiä eroja tekoälyjen välillä kuin mitä sitten 8-10 älyn ’kaaoksessa’. Tuossa kohtaa erot olivat tasaantuneet/kääntyneet ja ’suosikki’ olikin jo toinen.
Peli on tosiaan yksinkertainen ja näin ensikertalaiselle sopiva. Vaikea oli keksiä mitään strategiaa tai muita voittavia hienouksia.
Ja ellei tuo rekursioharjoitelmani ’ketjutin’ jää viimeiseksi ’’tekoälyksi’’ niin ihmettelen.

Metabolix [06.02.2019 00:00:00]

#

Tulokset on julkaistu, ja tekoälyjä voi testata netissä!

Kilpailun voitti os tekoälyllään osvastusX. Seuraavilla sijoilla ovat ahr tekoälyllään Lokki ja skeskinen tekoälyllään HalfLife3, ja heidän keskinäinen järjestyksensä lienee sattuman kauppaa. Loput tulokset löytyvät tulossivulta.

Kilpailu oli erittäin tasainen, ja moni tekoälyistä varmasti vaihtaisi järjestystään, jos testejä jatkettaisiin ja painotettaisiin eri pelaajamääriä. Kuitenkin ensin sanoin, että pyrittäisiin pelaamaan kaikilla ohjelmilla yhtä aikaa, ja myöhemmin ennustin 6–12 pelaajan pelejä, joten painoarvo kisassa on annettu näille. Jokainen voi sitten itse spekuloida, millä asetuksilla oma ohjelma olisi menestynyt vielä paremmin.

Testaussivulta löytyvät JavaScript-käännökset kaikista paitsi jopeli-ohjelmasta, jonka käännöksen esteeksi nousivat NumPy:n pakatut datatiedostot. Hyödynsin osvastusX:n käännöksessä Emscripteniä, kun kerran valmis pohja oli tarjolla, mutta muut ohjelmat käänsin itse. Varsin vähäisiä eroja tulee siitä, että tietyt algoritmit eivät ole tarkkaan määriteltyjä; esim. C++:n std::nth_element ei ole ilmeisesti stabiili lajittelu.

L2-K2 [06.02.2019 00:47:07]

#

Onnea voittajalle ja kiitos hyvin järjestetystä kilpailusta! Kiitos myös muille osallistujille!

Aika hauska tuo, että kaikki älyt voittivat vähintään yhden pelin. Kaikki siis olivat sopivassa kentässä parhaita, mikä kertoo kaikkien älyjen olleen hyvin päteviä.

Tästä kertoo myös, se että kun kokeilin huvikseni pelata viimeiseksi jäänyttä Ketjutinta vastaan, niin se antoi ihan kunnon haasteen ihmisellekin, enkä voittanut sen kuin 20 pisteellä! 752–732. (OsvastusX toki möyhensi minut samassa kentässä aika reilulla erolla 831–655, vaikka kenttä oli minulle jo tuossa kohtaa tuttu.)

Kaikkia koneita vastaan edelleen samassa kentässä (1485317077) pelatessani jäin vähemmän yllättäen aika alas (neljänneksi viimeiseksi). Tosin yllättäen isoin ero näytti syntyvän lähes heti pelin alussa (tuolla laudalla) kärkikuusikon löytäessä selvästi paremmat pisteet (kuin minä tai muut koneet). Tekoälyjen tasaisuutta kuvaa se, että kisan kolmanneksi viimeiseksi jäänyt Nipsu oli tässä kuusikossa ja siten myös tuli tässä laudassa neljänneksi mm. osvastusX edelle (loput noista kuudesta olivat ainakin tällä kertaa nuo TOP-5 näennäisen satunnaisessa järjestyksessä).

TapaniS [06.02.2019 09:44:56]

#

Kiitokset mukavasta kisasta ja onnea voittajille!

Hiukan jäi kysymyksiä kilpailusysteemistä. Kilpailusivulla annettiin ymmärtää, että kaikki ohjelmat laitetaan yhtä aikaa laudalle. Nyt suurimman painoarvon sai kuitenkin 4-6 ohjelman pelit. Itse optimoin ohjelman toimimaan paremmin isommalla joukolla. Eli vähän jäi kaivelemaan ...

Olisi mukava nähdä erittelyt isompien joukkojen kisoista.

-------------
Korjaan sen verran, että painoarvo useamman pelaajan peleissä onkin suurempi kuin pelien lukumäärä. Voittaja saa näissä peleissä enemmän pisteitä kuin pienen joukon peleissä. Varmaan kisajärjestely oli mietitty parhaalla tavalla.

Metabolix [06.02.2019 12:58:52]

#

TapaniS: Kyllä suurin painoarvo tulee isoista peleistä, koska niistä jaetaan lopputuloksiin enemmän pisteitä (pelaajien määrän mukaan). Kuitenkin mielestäni 15 pelaajaa oli jo liikaa, ja siksi laitoin noita 6 ja 12 pelaajan pelejä. Muistaakseni 4 pelaajan pelit eivät vaikuttaneet tuloksiin juurikaan.

jalski [06.02.2019 16:15:20]

#

Lueskelin kilpailussa mukana olleiden tekoälyjen kuvauksia ja ihmettelin, ettei kukaan ollut tehnyt kilpailuun mukaan potentiaali karttaa hyöyntävää toteutusta. Luulisin, että sopivasti hienosäädettynä sen sijoitus kilpailussa toteutuksen yksinkertaisuuteen nähden olisi ollut kohtuullisen korkealla.

Libo [06.02.2019 18:19:26]

#

Heh, tässähän tulee ihan oma kisa - ihminen kaikkia älyjä vastaan laudalla nro 1485317077. Minä tulin neljänneksi...

Kävikös muuten niin, ettei kukaan käyttänyt satunnaisuutta älyssään? Ajoin älyjen kesken tuon samaisen laudan muutamaan kertaan ja aina sama lopputulos. Ainakaan satunnaisuus ei tällä otoksella tullut ilmi.

Ja sitten komppaan TapaniS:ää: "Olisi mukava nähdä erittelyt isompien joukkojen kisoista."
Itsekin odotin kisat ajettavan 'kaikki kaikkia vastaan', vaikka Metabolix kertoikin ajelleensa ajoja pienemmillä kokooonpanoilla.

os [06.02.2019 21:55:53]

#

Kiitoksia vielä Metabolixille ja vastustajille hienosta kisasta!

Tässä vielä alkuperäiset koodini Githubissa https://github.com/oseiskar/poimintapeli-2019
Lisänä zippipaketissa olevaan versioon on tukitoiminnallisuuksina:

* Emscriptenillä Node-ohjelmaksi paketointi ja
* testipenkki eli komennot make match ja make show (harjoitusturnaus tilastona tai ASCII-grafiikkana)

Näistä erityisesti jälkimmäistä pidän avaimena onneen ja menestykseen: kilpailutekoälyn logiikkaa ja parametreja on viritelty testipenkin avulla niin, että se voitti testiturnauksissa edelliset parhaat versiot, itsensä eri parametreilla ja perusvastustajat (kuten jalskin mainitseman potentiaalikarttatyyppisen älyn). Ajoin testiturnauksina kaksintaisteluja ja n. 9 älyn pelejä (määrä vaihteli vähän eri vaiheissa koodausta).

En kuitenkaan mennyt niin pitkälle että olisin käyttänyt testipenkkiä parametrien automaattiseen hakuun (kuten ilmeisesti ainakin entropy ja jopeli), koska käyttämässäni n. 2000 pelin turnauksessa kesti yhdellä säikeellä vähintään useita minuutteja per ajo.

osvastusX:n peruslogiikkana (paitsi loppupelissä) on syvyyshaku omille siirroille ja hakusyvyydellä 9, mihin päästään kilpailuajan puitteissa hyvin kun haun aikana ei varata dynaamisesti yhtään muistia.

Metabolix [06.02.2019 23:23:33]

#

Libo: Toteutin JavaScriptilla Mersenne Twisterin sitä tarvitseville ohjelmille, ja yhdestä ohjelmasta muokkasin pois käytännössä merkityksettämän satunnaislukujen käytön. Lisäksi tarvittaessa voi aina arpoa luvut valmiiksi...

jalski: Ainakin omat versioni painovoimasta, metapalloista ym. johtivat niin huonoihin tuloksiin, että jätin ne suosiolla pois kisasta. Usein tekoäly päätyi esimerkiksi kulkemaan isojen lukujen välistä poimimatta niistä juuri mitään tai jäi jumiin tyhjään tilaan tasaväkisten valintojen väliin. Mutta voit tietenkin itse kokeilla, saatko parempia tuloksia.

Tässä on piste-erittely kisan otteluista pelaajamäärän mukaan. Oikeastaan merkittävin poikkeama on Calgary88:n sijoituksessa. Toisaalta 15 pelaajan peleistä voi saada melkein mitä tahansa tuloksia, jos satunnaisluvut suovat.

ohjelma15 p.pisteet10 p.pisteet6 p.pisteet4 p.pisteet
osvastusX1.161091.339642.297682.5049
Lokki3.153182.311293.294353.4904
HalfLife35.145953.302671.303941.5173
pathfindr4.147694.287785.249344.4311
Calgary882.155145.285948.228019.3563
TaSman7.122506.270634.251365.4291
XRPicker6.124507.250696.237126.4063
Uppopallo8.107638.248827.233428.3805
Kumpuin9.95419.213999.223627.4031
jopeli10.935111.1659110.1834211.3042
poimuri13.720613.1473811.1757110.3399
Reiska12.749810.1712013.1525213.2616
Nipsu11.777812.1521912.1552412.2897
entropy14.622514.1306314.1118414.2003
Ketjutin15.317115.606115.765515.1647

L2-K2 [07.02.2019 01:00:08]

#

Libo kirjoitti:

(06.02.2019 18:19:26): Heh, tässähän tulee ihan oma kisa - ihminen...

Ainakin omassani on satunnaisuutta siinä miten tuota parasta ketjua seuraavia pistelaattoja etsitään*, mutta se satunnaisuus on tosiaan (kuten Metabolix ehti mainita) kullakin pelikerralla identtinen sekvenssi satunnaislukuja.

* Älyni siis hyppii laatalta laatalle, eikä ”turhaan” vaivaudu välissä päivittämään tilaansa – tällä säästi aikaa jotta voi etsiä hyviä polkuja – valitettavasti vaan oletukseni tiukasta ”en mene jos joku muu voi millään ehtiä ensin -säännöstä” ei löydä yhtä hyviä polkuja kuin noiden parhaiden älyjen sumeampi logiikka (ehkä ehdin tuonne, joten lasken sen osalla painoaan mukaan)).

jalski [07.02.2019 07:03:09]

#

Metabolix kirjoitti:

jalski: Ainakin omat versioni painovoimasta, metapalloista ym. johtivat niin huonoihin tuloksiin, että jätin ne suosiolla pois kisasta. Usein tekoäly päätyi esimerkiksi kulkemaan isojen lukujen välistä poimimatta niistä juuri mitään tai jäi jumiin tyhjään tilaan tasaväkisten valintojen väliin. Mutta voit tietenkin itse kokeilla, saatko parempia tuloksia.

Kokeilin potentiaali karttaa ja se toimi hyvin, kun aina luvun ympärille luotu kenttä oli muodostettu sopivilla arvoilla. Omassa versiossani kokonaiskenttä oli luotu siten, että se painotti lukujen yhteissummaa alueella ja tekoäly valitsi aina suurimman vieressä olevan potentiaalin. Oma kokeiluni saattoi joskus jäädä jumiin tasaväkisten valintojen väliin, mutta tästä olisi todennäköisesti päästy eroon luomalla pieni "häntä" potentiaali työntämään tekoälyä eteenpäin.

skeskinen [07.02.2019 08:47:35]

#

Kiitos Metabolix järjestelyistä.

Hauska tuo taulukko tuloksista eri pelaajamäärillä. Itseäni ainakin yllättää, että HalfLife3 pärjäsi verrattain noin paljon paremmin 4p ja 6p peleissä. Tosiaan Calcaryn hyvä suoritus alkuperäisen kilpailuhengen mukaisessa kategoriassa on myös huomion arvoista.

Tarkoittaako jalski potentiaalikartalla jotain tiettyä algoritmia? Useat kilpailijat näyttäisivät olevan vain joku variaatio simppelistä hausta ja ainakin hl3 ja lokki käyttävät jotain löyhästi "fysiikan inspiroimaa" heuristiikkaa.

jalski [07.02.2019 09:23:49]

#

skeskinen kirjoitti:

Tarkoittaako jalski potentiaalikartalla jotain tiettyä algoritmia? Useat kilpailijat näyttäisivät olevan vain joku variaatio simppelistä hausta ja ainakin hl3 ja lokki käyttävät jotain löyhästi "fysiikan inspiroimaa" heuristiikkaa.

Oma tekoälyni käytti vain vain yksinkertaista ruudukkoa. Potentiaalikentän arvot oli valittu siten, että luvun kohdalla kentän arvo oli ykkönen (jotta luvun arvolla olisi isoin painoarvo siirtoa valitessa) ja pieneni kauemmas mentäessä. Kenttien arvot ja lukujen arvot summattiin ja siirroksi valittiin aina suurimman potentiaalin omaava viereinen ruutu.

jsbasic [07.02.2019 11:23:57]

#

Kilpailun säännöissä sanottiin:

lainaus:

Jos tekoälyjä on niin vähän, että ne voivat hyvin pelata samanaikaisesti, kaikki tekoälyt pelaavat yhtä aikaa. Muuten pelataan jollain tavalla tasapuolisesti pelejä eri tekoälyjen kesken; tarkempi toteutus riippuu osallistujamäärästä.

Minusta kilpailu ratkesi joka tapauksessa vastustajan liikkeiden ennakointiin. Tekoälyjen kuvauksissa on sellainen mielenkiintoinen yksityiskohta, että parhaiten sijoittunut puolisko mainitsee aina sanan "vastustaja". (Ainoa poikkeus on Calgary88, joka käyttää termiä "kilpailija".) Etenkin Lokki ja Halflife3 (sijat 2.-3.) näyttävät perustavan pelinsä vastustajan ennakointiin, jopa todennäköisyyksiin, ja pisteiden kerääminen jää toisarvoiseksi. Neljänneksi-kahdeksanneksi tulleet laskevat, ehtiikö vastustaja pisteelle ensin. Heikommin suoriutuneet puhuvat korkeintaan "muista pelaajista". En nyt haluaisi olla psykoterapeuttina, mutta eikönhän tämä kerro vähän halveksuvasta asenteesta vastustajia kohtaan, joka kieltämättä itsellänikin oli. :D

Metabolix [07.02.2019 18:41:44]

#

jalski: Pystytkö antamaan ihan lukuja useammasta testiajosta muita vastaan?

Strategiasta jäin itse miettimään, olisiko kisassa ollut sijaa aggressiiviselle tekoälylle. Nythän strategia oli pääsääntöisesti se, että valitaan paras reitti sieltä, missä vastustaja ei ole häiritsemässä. Aggressiivinen pelaaja olisi voinut hakea parhaan reitin mahdollisimman läheltä vastustajaa niin, että vastustajaa lähinnä olevat epävarmat luvut poimitaan ensin ja edetään sitten varmoille alueille. Tämä toimisi ehkä vain pienillä pelaajamäärillä, koska suuressa joukossa ei juurikaan jää omaa turvallista pelitilaa.

Kommenttina vielä kisasta yleisesti: Tämä kisa oli kiireessä aloitettu, ja osallistujamäärää ja osallistujien tasoa oli vaikea arvioida, ja siksi suunnitelma jäi hieman epämääräiseksi. Lisäksi tämä oli ensimmäinen kisa, jossa oli kerralla yli neljä pelaajaa. Nyt on kokeiltu, ja seuraavalla kerralla on paremmin tiedossa, miten tällainen monen pelaajan peli käyttäytyy. Pyrin siis selvempään ohjeistukseen ensi kerralla.

FooBat [07.02.2019 20:38:33]

#

Oli aika odotettua, että Calgary88 tekoälyni pärjää paremmin isommassa joukossa. Mitä enemmän pelaajia pelissä on mukana, sitä suurempi osa pisteistä jaetaan pelin alun ryntäyksessä. Calgaryn tekemä suunnattu haku (jossa ei käännytä takaisinpäin) on itse asiassa on tähän tilanteeseen lähellä optimaalista, koska voidaan olettaa, että joku muu on kumminkin kerännyt kaikki taakse jäävät pisteet. Tämä suunnattu haku on myös todella kevyt laskea 'loppuun asti' eli alussa löydetään heti varsin hyvä 12-24 askelta pitkä reitti.

Jos pelaajia on vähemmän, alulla on vähemmän painoarvoa ja muutenkin Calgaryn käyttämä haku ei enää ole optimaalinen, koska se ei ota alkuunkaan huomioon muiden pelaajien liikettä (maksimaalisen pessimististä etäisyysgraafia lukuunottamatta). Tähän kilpailuun olisi pitänyt tehdä aivan toisenlainen botti, jos tämä olisi ollut esim. kaksinpeli, mikä on havaittavissa siinä, että Calgary ei alkuunkaan pärjää tällaisissa peleissä.


Vähän itseäni harmittaa, etten saanut varattua enempää aikaa tähän kilpailuun. Puuhastelin pari iltaa testaussysteemien kanssa, mutta lopulta oikean tekoälyn tekeminen jäi viimeiseen yöhön ja piti rajusti optimoida koodaukseen käytetyn ajan suhdetta tulosten odotusarvoon :). Lopulta tuloksena oli mahdollisimman yksinkertainen äly, jolla oli edes jonkinlainen edellytys pärjätä. Tulipahan nimettyäkin se lapsuuden sankarin mukaan deadline päivänä. RIP Matti.

Alunperin suunnitteilla oli jonkin tyyppinen pelin loppuun asti laskeva monte carlo viritelmä, mutta tämä olisi ollut varsin haastava optimointitehtävä ja muutenkin se olisi vaatinut kaikenlaista virittelyä ollakseen hyvä. Ehkäpä teen tämän vielä omaksi iloksi jossain vaiheessa kun kerta tuli noi testisysteemitkin tehtyä jo.

jalski kirjoitti:

Metabolix kirjoitti:

jalski: Ainakin omat versioni painovoimasta, metapalloista ym. johtivat niin huonoihin tuloksiin, että jätin ne suosiolla pois kisasta. Usein tekoäly päätyi esimerkiksi kulkemaan isojen lukujen välistä poimimatta niistä juuri mitään tai jäi jumiin tyhjään tilaan tasaväkisten valintojen väliin. Mutta voit tietenkin itse kokeilla, saatko parempia tuloksia.

Kokeilin potentiaali karttaa ja se toimi hyvin, kun aina luvun ympärille luotu kenttä oli muodostettu sopivilla arvoilla. Omassa versiossani kokonaiskenttä oli luotu siten, että se painotti lukujen yhteissummaa alueella ja tekoäly valitsi aina suurimman vieressä olevan potentiaalin. Oma kokeiluni saattoi joskus jäädä jumiin tasaväkisten valintojen väliin, mutta tästä olisi todennäköisesti päästy eroon luomalla pieni "häntä" potentiaali työntämään tekoälyä eteenpäin.

Itse kokeilin potentiaalikarttaa ensimmäisenä versiona ja sen sai toimimaan kohtuullisen hyvin kun käytti exponentiaalisesti etäisyyden mukaan vähenevää potentiaalia. Varsin rajut 0.55-0.3 kertoimet etäisyysaskelta kohti tuntuivat toimivan parhaiten 6-8 pelaajan peleissä, eli voimakkaasti painotetaan lähellä olevia pisteitä. Itseasiassa Calgary88 käyttää tuota toissijaisena ohjausmallina.

Pelkästään potentiaaliin perustuvat botit jäivät kuitenkin aika paljon jälkeen botista, joka etsi vähän parempaa reittiä muutaman askeleen päähän. Etenkin alussa potentiaalibotit jäävät paljon jälkeen ja myöhemminkin ne eivät minulla ottaneet kilpailijoita huomioon ja menivät usein vääriä pisteitä kohti.

Lisäys:

Metabolix kirjoitti:

jalski: Pystytkö antamaan ihan lukuja useammasta testiajosta muita vastaan?

Ajoin testiksi hiukan pelejä omalla potentiaalikenttäbotilla. Noita kilpailubotteja vastaan 15 botin pelissä se sijoittui aika luotettavasti suunnilleen puoliväliin Calgaryn ollessa lähellä kärkeä. Omia yksinkertaisia testibotteja vastaa testibenchissäni potentiaalibotti sai yleisesti ~95% pisteistä verrattuna Calgaryyn. (Vertailukohdaksi parhaan lähimmän pistearvon hakenut ahne botti puolestaan sain noin 80% Calgaryn pisteistä.) Testipeleissäni oli yleensä mukana 8-10 pelaajaa.

Metabolix kirjoitti:

Strategiasta jäin itse miettimään, olisiko kisassa ollut sijaa aggressiiviselle tekoälylle. Nythän strategia oli pääsääntöisesti se, että valitaan paras reitti sieltä, missä vastustaja ei ole häiritsemässä. Aggressiivinen pelaaja olisi voinut hakea parhaan reitin mahdollisimman läheltä vastustajaa niin, että vastustajaa lähinnä olevat epävarmat luvut poimitaan ensin ja edetään sitten varmoille alueille. Tämä toimisi ehkä vain pienillä pelaajamäärillä, koska suuressa joukossa ei juurikaan jää omaa turvallista pelitilaa.

Lisäsin Calgary bottiin lopuksi hivenen agressiivisuutta antamalla hiukan enemmän painoarvoa pisteille jotka olivat lähellä vastustajia. Tämä paransi botin keskimääräistä tulosta pari prosenttia omassa testisetupissani, mikä on ihan näkyvä parannus.

L2-K2 [07.02.2019 23:46:49]

#

Metabolix kirjoitti:

Strategiasta jäin itse miettimään, olisiko kisassa ollut sijaa aggressiiviselle tekoälylle. Nythän strategia oli pääsääntöisesti se, että valitaan paras reitti sieltä, missä vastustaja ei ole häiritsemässä. Aggressiivinen pelaaja olisi voinut hakea parhaan reitin mahdollisimman läheltä vastustajaa niin, että vastustajaa lähinnä olevat epävarmat luvut poimitaan ensin ja edetään sitten varmoille alueille. Tämä toimisi ehkä vain pienillä pelaajamäärillä, koska suuressa joukossa ei juurikaan jää omaa turvallista pelitilaa.

Kokeilin hieman tuontapaista ihmispelattuna ennen kuin päädyin tuohon erittäin säikkyyn älyyni. Ei tuntunut agressiivisuus yhtään toimivalta (ainakaan 2–3 pelaajan peleissä yhtä tai kahta yksinkertaista konetta vastaan), koska yksin on ”aika vaikea” rajata vastustajansa liikettä.

1. Toista häiritessä ei saa koskaan päätyä vain 1 ruudun päähän vastustajastaan, koska silloin joutuu väistämään pistelaattoja, tai päästämään yksinkertaisenkin vastustajan lipsahtamaan sille vaivalla puolustetulle omalle pistealueelleen.

2. Koska tuo edellinen, niin se oma pistekertymä jää nopeasti jälkeen pideltävästä vastustajasta.

3. Ja, koska kenttä on (topologisesti) torus (lue: donitsi), niin sen vastustaja lopulta kerättyä sen vartioidun alueensa tyhjäksi (joilloin se johtaa pisteissä), niin se voi vaan lipsahtaa vastakkaisten reunojen yli sinne missä oli vielä pisteitä. Jos reunat olisi suljettuja, niin yksinkertaisen vastustajan voisi (ainakin yrittää) vangita reunalle jumiin.

Se ei-koskaan-julkaistu harjoitusvastustajani olisi ollut hieman tällainen häirikkö – minimoi kaikkien muiden pelaajien pistemääräodotusarvojen maksimin ja oman odotusarvon erotusta (ts. pelaa sitä pelaajaa vastaan joka kulloinkin näyttäisi voittavan). Koska koin itse tämän täysin kilpailun hengen vastauksesi, niin jätin sen siis kilpailusta pois – se ei varmaankaan olisi koskaan voittanut yhtään lautaa, ja olisi vaan pyrkinyt tasoittamaan monen pelaajan pelejä. ”Harjoitusvastusjana” muita hämäämässä se olisi ehkä ollut sopiva, siis ”mitä ihmettä tämä kaveri oikein tekee ja miksi”.

jalski [08.02.2019 18:46:08]

#

FooBat kirjoitti:

Metabolix kirjoitti:

jalski: Pystytkö antamaan ihan lukuja useammasta testiajosta muita vastaan?

Ajoin testiksi hiukan pelejä omalla potentiaalikenttäbotilla. ...

Löysin oman tekoälyni kehitysversion raakileen temp hakemistostani ja kokeilin pistää sen kilpailun älyjä vastaan. Suurimmassa osassa pelejä sen sijoitus tuloksissa pysytteli vähän puolenvälin yläpuolella, mutta joskus se jäi häntäpäähän. Sopivassa kentässä "Greedy" oli myös hyvin mukana kärjen tuntumassa, voittajalle se yleensä kyllä hävisi selvällä marginaalilla.

jsbasic [09.02.2019 11:37:15]

#

FooBat kirjoitti:

Tulipahan nimettyäkin se lapsuuden sankarin mukaan deadline päivänä. RIP Matti.

Olipa vaikuttava nimi. Itse vuotta nuorempana en Nykäsen hyppyjä koskaan nähnyt, mutta onneksi hänellä oli välillinen vaikutus lapsuuteeni ja harrastuksiini. Mäkihyppy on niin elegantti ja luonnonläheinen laji, etenkin kun sitä hypättiin silloin päivänvalossa.

Itsellänikin kävi mielessä tehdä suunnattu haku aloitukseen, mutta pyrin vielä kevyempään toteutukseen. Tavoitteenani oli tehdä vektorimuotoinen malli parhaista pisteistä ja poluista. Sellaista mallia oli kuitenkin raskas päivittää, koska tilanne kentällä muuttuu niin nopeasti. Oli pakko toteuttaa vektorimalli rivikohtaisesti. Toteutuksessani etsitään korkein piste jokaiseltä vaakariviltä. Kun joku nappaa tuon pisteen, etsitään rivin seuraavaksi korkein piste, jne. Rivien parhaista pisteistä rakentuu siis jonkinlainen verkko, jossa on 25 solmua, eli yhtä paljon kuin rivejä. Tämän sähläyksen jälkeen olen kuitenkin tyytyväinen Nipsun lopputulokseen.

Libo [09.02.2019 16:52:40]

#

How about round two?

Tässä taitaa muutamilla olla jäänyt hieman hampaankoloon jotain tästä kisasta. Muutama on jo viritellyt älyänsä kisan jälkeen.
Ja onko sittenkään tuo osvastusX lyömätön?

Esitän ajatuksen, että otetaan kierros kaksi samasta kisasta!

Pidetään vaikka kärkikolmikon älyt ennallaan (joille toki uudet versiot sallittu uusilla nimillä) ja kukin saa viritellä omia älyjään paremmaksi.
Koska lähdekoodit on jaettu niin sovittakoon, että näistä ei kopsata muihin älyihin mitään. Keskustelusta saatuja ajatuksia saa toki hyödyntää.

Saammeko ’someälyllä’ tehtyä vielä paremmin tekoälyn tähän peliin jolla tuo paikkansa ansainnut kärkikolmikko nuijitaan maan rakoon?

Ja kisan säännöistä/kisamuodoista/pistelaskusta voi tehdä järjestäjälle ehdotuksia.

Grez [10.02.2019 08:10:49]

#

Sinänsä jotta kierros kaksi olisi reilu kaikkia kohtaan, niin siihen pitäisi ottaa vain ne älyt, joita tekijä on parannellut tai jotka tekijä haluaa osallistumaan muokkaamattomina.

Lebe80 [11.02.2019 09:11:07]

#

Onko joku tehnyt tästä kikkaretta, jolla voisi katsoa "turnausta"?

johku90 [11.02.2019 09:11:20]

#

Eipä kait someälyn kokeilemiseen toista kierrosta tarvita? Ei muuta kuin testaussivulle kokeilemaan uusia botteja, ja jos saa jotain lupaavia tuloksia niin pasteaa koodin tänne niin muut saa yrittää parantaa.

Metabolix [11.02.2019 13:12:20]

#

Lebe80: Millaisessa muodossa haluaisit katsoa turnausta? Siinä on 27818 peliä, eli melkoista pikakelausta saisi olla. Kahdeksan peliä sekunnissa antaisi lähes tunniksi katsottavaa.

Metabolix [11.02.2019 17:22:34]

#

Nyt on myös tekoäly jopeli testaussivulla. Jos testaussivun haluaa tallentaa omalle koneelle niin, että tämäkin tekoäly toimii, poimintapeli-jopeli-data.js täytyy tarvittaessa itse ladata erikseen.

Lebe80 [12.02.2019 09:15:55]

#

Metabolix kirjoitti:

Lebe80: Millaisessa muodossa haluaisit katsoa turnausta? Siinä on 27818 peliä, eli melkoista pikakelausta saisi olla. Kahdeksan peliä sekunnissa antaisi lähes tunniksi katsottavaa.

Jossain vaan, olisiko se sitten jokin shakkimainen, jossa valitaan listalta jo ratkenneita pelejä voisi laittaa pelin pyörimään (esim. siirto sekunnissa) ja pausettaa halutessaan.

Lähinnä, että näkisi, miten pelit etenivät.

Metabolix [12.02.2019 12:53:28]

#

Lebe80, tosiaan kisan testaussivulla voi ajaa pelejä ja myös itse pelata ohjelmia vastaan. Kisassa pelattuja otteluita ovat esimerkiksi kaikki 6 ja 10 pelaajan pelit siemenluvulla 1802267760 sekä 15 pelaajan pelit siemenluvuilla 4919 – 6255, eli näillä parametreilla voi katsoa. (Ei ole paljon eroa, vaikka katsoisi ihan satunnaisia pelejä.) Lisäksi pelattiin vaihtuvilla siemenluvuilla. Kaikki kisan pelit voi ladata tästä linkistä (6,6 Mt, purettuna noin 100 Mt), ja haluamansa pelin voi syöttää tiedostona testaussivulle Katselu-osioon.

Lebe80 [12.02.2019 13:14:52]

#

Metabolix kirjoitti:

(12.02.2019 12:53:28): Lebe80, tosiaan kisan testaus­si­vulla voi ajaa...

Juuri tällaista kaipasin! Linkki mennyt täysin ohi! Kiitos!

Libo [13.02.2019 20:19:03]

#

Metabolix kirjoitti:

...kaikki 6 ja 10 pelaajan pelit siemenluvulla 1802267760...

Pitääkö tuo ymmärtää siten, että kaikki kisan 6 tai 10 pelaajan pelit pelattiin samalla kentällä? Tuleehan tuossa tietysti pelaajien keskinäinen paremmuus esiin jos/kun pelattiin kaikilla pelaajakombinaatioilla. Mutta ainakin omissa testeissä tietyt kentät sopivat tietylle älylle ja kenttien vaihdolla oli suuria vaikutuksia tuloksiin. Ymmärsinkö tuon lainauskohdan siis oikein?

Ja olikos sulla Metabolix jokin valmis systeemi/kaavio, jolla pelattiin kaikki pelaajakombinaatiot 6 pelaajan peleissä vai mistä tuo ottelumäärä tuli?

Nimim. Piru lukee raamattua

Metabolix [13.02.2019 20:42:37]

#

Libo kirjoitti:

Pitääkö tuo ymmärtää siten, että kaikki kisan 6 tai 10 pelaajan pelit pelattiin samalla kentällä?

Ei, vaan kaikki 6 ja 10 pelaajan kombinaatiot ovat pelanneet kyseisellä siemenluvulla ja lisäksi muilla (joka kombinaatiolle erilaisilla) siemenluvuilla. Vakiosiemenluku nyt oli helpompi kirjoittaa viestiin satunnaista otteluiden katselijaa varten. Paketista voit kaivaa ne muut luvut.

Libo kirjoitti:

Ja olikos sulla Metabolix jokin valmis systeemi/kaavio, jolla pelattiin kaikki pelaajakombinaatiot 6 pelaajan peleissä vai mistä tuo ottelumäärä tuli?

Mikä erityinen ”systeemi” tai ”kaavio” siihen tarvitaan? Kombinaatiot on helppo luoda rekursiolla, ja eri kombinaatioiden (ja siten otteluiden) lukumäärä on aivan normaalia matematiikkaa eikä siis mikään yllätys.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta