Kirjautuminen

Haku

Tehtävät

Kilpailu

Ohjelmoi tekoäly!
Aikaa 4.2. saakka.

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

Sivut:

Sivu 2 / 2

Sivun loppuun

jo123 [09.01.2019 00:27:43]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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]

Lainaa #

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!


Sivun alkuun

Sivut:

Vastaus

Muista lukea keskustelun ohjeet.
Tietoa sivustosta