Kirjautuminen

Haku

Tehtävät

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

Sivut:

Sivu 2 / 3

Sivun loppuun

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.


Sivun alkuun

Sivut:

Vastaus

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

Tietoa sivustosta