Kuten äskettäin oli puhe, nyt vuodenvaihteessa 2017–2018 kilpaillaan pitkästä aikaa.
Tässä tekoälykilpailussa pelataan 4 pelaajan lautapeliä, jossa pitää saada mahtumaan laudalle mahdollisimman monta omaa pelilaattaa. Pelilauta on 25×25 ruutua ja laatat ovat 1–4 ruudun kokoisia. Laattoja laitetaan vuorotellen, ne eivät saa koskea sivuista toisiinsa, mutta omien laattojen pitää olla kulmista kiinni toisissaan.
Tarkemmat säännöt ovat kilpailusivulla, ja peliä (ja omaa tekoälyään) voi kokeilla testaussivulla.
Tervetuloa kilpailuun!
Kiitokset Metabolix, jälleen näyttää huolellisesti ja laadukkaasti järjestetyltä kilpailulta ja esimerkkiohjelmat madaltavat varmasti kynnystä lähteä jalostamaan omaa versiota :)
Itselle ei kuitenkaan selvinnyt, miten testausohjelmalla ajetaan useita eri tekoälyjä? Haluan siis testata tekoälyäni muitakin tekoälyjä, kuin itseään tai ihmistä vastaan. Täytyykö KilpailuProxy.exe:stä käynnistää useampi instanssi tmv?
ajv kirjoitti:
Itselle ei kuitenkaan selvinnyt, miten testausohjelmalla ajetaan useita eri tekoälyjä?
Voit käynnistää KilpailuProxysta useamman kappaleen ja syöttää testaukseen niistä saatavat eri osoitteet. Täsmensin ohjeita tältä osin. KilpailuProxy on tehty mahdollisimman yksinkertaiseksi tietoturvan ja helpon peruskäytön takia.
Testaussivu piti laittaa kotikoneelle ladattavaksi sen takia, että ainakaan Firefox ei salli HTTPS:n yli ladatulta sivulta salaamattomia yhteyksiä edes localhostiin ja tietenkään localhostille ei saa asiallista SSL-sertifikaattia. Jos jollakulla on tähän ongelmaan hienompi ratkaisu, saa mielellään kertoa.
KilpailuProxyn ohjeisiin voisi vielä lisätä että linuxille tarvitaan vähintään pythonin versio 3.6 jota ei löydy ainakaan debian stablen repositorioista.
Onko jokin erityinen syy miksi .net core (C#) ei ole tuettu? Ei taida kukaan enää monoa paljon pyöritellä, se kun pyörii natiivina niin Linuxissa kuin muissakin. Myös 4.5 versio on sen verran vanha, että voisiko myös muihin kieliin asettaa rajoitukset vuoden 2012 versioon, mikäli uudempaa ei voida käyttää?
reino kirjoitti:
KilpailuProxyn ohjeisiin voisi vielä lisätä että linuxille tarvitaan vähintään pythonin versio 3.6 jota ei löydy ainakaan debian stablen repositorioista.
Kiitos tiedosta. Muutin ohjelmaa niin, että se toimii myös hieman vanhemmilla versioilla, ainakin Python 3.5:lla. Itse voi korjata vaihtamalla Popen-kutsuihin encoding-parametrin tilalle universal_newlines = True.
groovyb kirjoitti:
Onko jokin erityinen syy miksi .net core (C#) ei ole tuettu?
En ole perehtynyt nykyiseen .NET-tarjontaan erityisemmin. Testasin nyt, ja nähtävästi Microsoftin systeemi ei ole yhteensopiva resurssirajojen kanssa: esimerkkiohjelma ei käynnisty, jos muistiraja on vähemmän kuin 2,5 Gt. Eli ei näytä nyt sopivan kisasysteemiin. Testaan uudestaan sitten, jos joskus ehdin toteuttaa rajat cgroupeilla.
Itse asiassa Monossakin pitäisi toimia ilmeisesti C# 6.0 ja osa uudemmastakin. Korjaan tämän tiedon kilpailuohjeisiin. Toivottavasti tämä lohduttaa.
groovyb kirjoitti:
voisiko myös muihin kieliin asettaa rajoitukset vuoden 2012 versioon, mikäli uudempaa ei voida käyttää?
Hassua sinänsä valittaa kielten tarkoista versioista, kun usein kärjessä on ollut C89 tai C++98 tai yhtä ikivanha Pascal. Ei tekoälykilpailuja voiteta jollain kielen yksittäisellä uudella ominaisuudella vaan omatekoisella algoritmilla.
Syy johtuu siitä, että C# 6:sessa tuli isoja muutoksia, sekä 4.5 nuget tarjonnasta tänä päivänä. Puhumattakaan siitä että jaksaisi asennella vanhoja settejä koneelle, eri .net versiot pitää erikseen asentaa eivätkä tule mukana edes windowsissa. Tämä oli lähinnä kehittäjiä helpottava tekijä, kun ei tarvitse asentaa ikivanhoja systeemejä. Suosittelen kyllä siirtymään .net coreen, tämä asentuu helpolla mihin vaan käyttöjärjestelmään, ja jota kehittäjätkin monialustakehitykseen käyttävät. Sama ehkä koskee myös java 9:siä, jos lambdaa haluaa käyttää. muuten voisi tehdä kilpailut vain yhdelle kielelle, jos esim c++ kuitenkin on uusimmalla gcc:llä käännettävissä. Ja ei varmaan voiteta yhdellä ominaisuudella, mutta sillä ei varmaan ole tekemistä sen kanssa että jaksaako edes osallistua jos joutuu ensin päivän asentelemaan kikkareita.
Java 9 on nyt asennettu. Näköjään eri versiot ovat eri paketteina niin, että isompi päivitys ei tule automaattisesti.
C# 7 on nyt tuettu, nimittäin Monon mukana tuleekin myös Microsoftin C#-kääntäjä eli csc. Tämä tieto puuttui Monon C#-wikisivulta, onneksi luin uutisia.
Korjailin ja parantelin testaussivun käyttöliittymää hieman.
Hieno homma! Vuoden ensimmäisellä viikolla kerkeän tähän osallistumaan. Vähintään karkea bruteforce ratkaisu luvassa, saa nähdä kuinka pitkälle kerkeää kehittelemään :)
Voittaako pelin se joka on saanut täytettyä suurimman määrän ruutuja pelilaudalla, vai se joka on pystynyt tekemään viimeiseksi jääneen siirron?
Ilmis kirjoitti:
Voittaako pelin se joka on saanut täytettyä suurimman määrän ruutuja pelilaudalla, vai se joka on pystynyt tekemään viimeiseksi jääneen siirron?
Kilpailusivulla lukee:
lainaus:
Tavoitteena on saada laudalle enemmän laattoja kuin muut; jokaisesta laatasta saa yhden pisteen riippumatta laatan koosta.
Eli pelin voi voittaa vaikka tippuisi ensimmäisenä kunhan on saanut asetettua laudalle enemmän laattoja kuin muut.
t0ll0 kirjoitti:
Eli pelin voi voittaa vaikka tippuisi ensimmäisenä kunhan on saanut asetettua laudalle enemmän laattoja kuin muut.
Toisaalta joka vuorolla asetetaan yksi laatta, joten eniten laattoja ehtii asettaa se, joka on viimeisenä mukana. Kuten itsekin lainasit: ”Tavoitteena on saada laudalle enemmän laattoja kuin muut; jokaisesta laatasta saa yhden pisteen riippumatta laatan koosta.”
Ruuduilla ei ole merkitystä pisteissä, vain laattojen lukumäärällä. Neljän ruudun laatasta saa yhden pisteen, aivan kuten yhden ruudun laatastakin.
Testaussivu näyttää myös pistemäärät.
Huomioitavaa on, että turnauksen kannalta ei tule olemaan merkitystä, mitkä pisteet yksittäisestä pelistä saa; täpärä voitto on yhtä arvokas kuin murskavoitto.
Metabolix kirjoitti:
Toisaalta joka vuorolla asetetaan yksi laatta, joten eniten laattoja ehtii asettaa se, joka on viimeisenä mukana.
On silti mahdollista, että ensimmäisenä pudonnut voittaa pelin. Ajattelin tilannetta missä muut pelaajat käyttävät aina neljän ruudun paloja ja ensimmäisenä putoaa ainut pelaaja joka käytti vain yhden ruudun paloja. Tuskin näin sattuu käymään, mutta mahdollista se toki on.
Kilpailusivu on kyllä selkeästi kirjoitettu ja kunhan sen jaksaa lukea ajatuksella läpi niin säännöt on simppelit :)
t0ll0 kirjoitti:
On silti mahdollista, että ensimmäisenä pudonnut voittaa pelin.
Ei ole mahdollista. Tämä on täysin yksiselitteistä. Voit vaikka kokeilla testaussivulla, saatko aikaan sellaisen tilanteen.
Metabolix kirjoitti:
Ei ole mahdollista. Tämä on täysin yksiselitteistä.
Äh en tiedä miten asian olin ajatellut. Olet oikeassa. Yhdestä vuorosta saa aina yhden pisteen.
kilpailusivu kirjoitti:
Tekoälyjen tulee pitäytyä kielten perusominaisuuksissa; kääntäjästä, kirjastoista, käyttöjärjestelmästä tai prosessorin tyypistä riippuvaisia ominaisuuksia ei pidä käyttää.
Tarkoittaako tämä että gcc:llä ei linkitetä -lm optiolla?
reino: Standardikirjasto (ml. matematiikkakirjasto) sisältyy kielen perusominaisuuksiin ja on tietenkin siis sallittu. Se, miten tämä GCC:ssä tarkalleen tapahtuu, on säännön kannalta epäolennainen tekninen yksityiskohta.
Säännöistä:
Metabolix kirjoitti:
Ohjelma saa käyttää yhdessä ottelussa kokonaisuudessaan enintään 512 megatavua muistia
Javan tapauksessa, vähennetäänkö muistin käytöstä virtuaalikoneen käyttämä muisti? Tämän muistirajoituksen kohdalla mielestäni C-koodaajilla on etulyöntiasema muistinkulutuksen osalta.
Miten tarkalleen lasket ohjelman käyttämän muistin? Ainakin ps- ja top-komennot palauttavat useita eri lukuja, mitä tulee muistinkäyttöön.
Onko ohjelman max. aikaraja 30 vai 90 sekuntia? Säännöissä mainitaan molemmat:
Metabolix kirjoitti:
ja 30 sekuntia laskenta-aikaa.
Metabolix kirjoitti:
käyttää yli 90 sekuntia
Timmmo kirjoitti:
Javan tapauksessa, vähennetäänkö muistin käytöstä virtuaalikoneen käyttämä muisti? – – Miten tarkalleen lasket ohjelman käyttämän muistin?
Javan muisti rajoitetaan parametrilla -Xmx512M, jolloin itse virtuaalikoneen muisti ei vaikuta. Muissa kielissä rajoitukseen käytetään Bashin ulimit-komentoa (-v, virtual memory). Isoimmista tulkeista olen laittanut vähän tasoitusta muistirajaan.
Muistimäärä ei ole aiemmissa kisoissa ollut ongelma kuin jossain ihan bugitilanteessa. 512 Mt on sen verran paljon, ettei sitä pysty kovin tehokkaasti käyttämään annetun aikarajan puitteissa: esimerkiksi noin ison int32-taulukon jokaisen alkion xorraus edellisen kanssa silmukassa vie 1 sekunnin. Toisin sanoen 30 sekunnissa ei ehdi tehdä kuin muutaman toimituksen per muistipaikka. Jos siis tuo muistiraja paukkuu, luultavasti algoritmi on myös liian hidas.
Timmmo kirjoitti:
Tämän muistirajoituksen kohdalla mielestäni C-koodaajilla on etulyöntiasema muistinkulutuksen osalta.
Kielten erot ovat todellisia niin kisassa kuin muussakin ohjelmoinnissa. Mielestäni tämä on ihan oikein eikä edellyttäisi välttämättä edes antamiani pieniä muistitasoituksia.
Timmmo kirjoitti:
Onko ohjelman max. aikaraja 30 vai 90 sekuntia?
Kuten säännöissä lukee: 30 sekunnin jälkeen ei saa pisteitä kyseisestä ottelusta. 90 sekunnin jälkeen ohjelman peli keskeytyy, ja ongelman toistuessa ohjelmaa uhkaa jo hylkääminen koko kisasta. Käytännössä 30 sekunnin rajaa valvotaan time-komennolla ja 90 sekunnin raja asetetaan ulimit-komennolla.
Olisiko mahdollista saada 8th kilpailussa sallittujen ohjelmointikielten listalle?
jalski, ei ole.
Säännöistä vielä:
Metabolix kirjoitti:
Otteluiden pisteistä lasketaan kokonaispisteet. Tarkempi turnausjärjestely päätetään osallistujamäärän mukaan. Luultavasti ensiksi lajitellaan tekoälyt sopivien otteluiden perusteella tasonsa mukaisiin lohkoihin ja sitten ratkaistaan lohkojen sisäiset järjestykset pelaamalla lohkon kaikki otteluvaihtoehdot.
Miten tekoälyjen tasot tarkalleen määritellään lohkojen muodostamista varten? Onkohan tässä vaarana että kovatasoiset älyt kohtaavat jo alkulohkoissa?
Yksi vaihtoehto olisi generoida osallistujista kaikki mahdolliset neljän pelaajan lohkot. Tällöin kaikki pääsevät pelaamaan kaikkia vastaan. Mikäli osallistujia ei ole kovin paljoa, niin kombinaatioita ei tule liikaa. Ja peliaika on muutenkin aika lyhyt, joten muutamassa tunnissa ajanee kaikki lohkokombinaatiot.
Timmmo kirjoitti:
Onkohan tässä vaarana että kovatasoiset älyt kohtaavat jo alkulohkoissa?
Ajattelet nyt selvästi toisenlaista turnausta, jossa lohkojen voittajat menevät jatkoon jne. Itse ajattelin kuitenkin juuri sitä, mitä säännöissä lukee. Alustava järjestys voidaan ratkaista pelaamalla jokin tasapuolinen suppeampi valikoima eri yhdistelmiä. Tämä järjestys olisi lähes lopullinen, ja lohkoissa vain hienosäädettäisiin lähekkäisten tekoälyjen keskinäinen järjestys.
Timmmo kirjoitti:
Yksi vaihtoehto olisi generoida osallistujista kaikki mahdolliset neljän pelaajan lohkot.
Kaikkia otteluita tuskin viitsii pelata, jos osallistujia tulee yli 10. Esimerkiksi 10 tekoälystä muodostuu jo 5040 eri peliä, ja kun yksi peli voi teoriassa viedä 4*30 sekuntia, aikaa voisi kulua 7 vuorokautta. Toki useimmat tekoälyt ovat onneksi nopeampia, mutta yli 10 pelaajalla yhdistelmät myös lisääntyvät varsin nopeasti.
Tietysti on monenlaisia vaihtoehtoja.
Turha nyt miettiä tätä liikaa, ennen kuin on jokin käsitys osallistujien määrästä.
Esimerkkiohjelman kommentteihin oli jäänyt kilpailun suunnitteluvaiheesta väärä lautakoko ja pelaajamäärä, eli huomioittehan säännöissä olevat oikeat luvut. Tosin tämä ei varmaan testausvaiheessa voisi mitenkään jäädä huomaamatta.
Pitääkö varautua mahdollisiin virhesiirtoihin vai tarkastetaanko syötteet ennen niiden eteenpäin välittämistä?
Ohjelmalle ei syötetä virheellisiä siirtoja, vaan virheestä seuraa kyseisen tekoälyn putoaminen, jolloin muille syötetään sen kohdalla 0. Syötteet, joihin pitää varautua, ovat siis aloitusrivin jälkeen lailliset siirrot, pudonneen pelaajan kohdalla 0 ja lopetusvaiheessa -1.
Kysyisin vielä, mitä tekoälyn tulee tehdä, kun se huomaa, ettei se enää voi sijoittaa laattoja laudalle. Tuleeko sen sammua kupsahtaa välittömästi, vai tuleeko sen jotenkin muuten viestiä tilanteesta ensin, esim. tulostamalla omalla vuorollaan 0? Ohjeesta saan käsityksen että pitää sammua heti, onko varmasti näin?
Entä lause "Pelin päättyessä ohjelmalle syötetään luku -1"? Tarkoittaako "ohjelma" tuossa tekoälyä vai ohjelmaa joka peluuttaa tekoälyjä toisiaan vastaan? Kuka/mikä syöttää, ja liittyykö lause vain testiohjelman ajamiseen vai tositilanteeseen? Jos kaikki kilpailevat tekoälyt asianmukaisesti sammuvat kun eivät voi enää sijoittaa yhtään laattaa, niin eihän mikään niistä jää miinusykköstä odottelemaan, joten olettaisin että ensinmainittua, mutta varmistetaan nyt tämäkin.
öppis kirjoitti:
Kysyisin vielä, mitä tekoälyn tulee tehdä, kun se huomaa, ettei se enää voi sijoittaa laattoja laudalle.
Tekoälyn tulee sammua, kun siirtoja ei ole. Ei tarvitse tulostaa mitään. Tämä näkyy myös esimerkeistä.
öppis kirjoitti:
Entä lause "Pelin päättyessä ohjelmalle syötetään luku -1"?
Tekoälylle syötetään luku -1 pelin päättyessä. Kaikkien tekoälyjen pitäisi sammua ilmankin tätä, kun omaa siirtoa ei ole. Testaussivulla voi myös keskeyttää pelin aiemmin, jolloin -1 tulee ohjelmalle kesken pelin.
Ylipäänsä kaikki syöte- ja tulosteohjeet on kirjoitettu tekoälyn näkökulmasta, eli syöttäminen menee tekoälylle päin ja tulostaminen tekoälystä ulos.
Syöte on sama testausohjelmassa ja itse kilpailussa, nimittäin testausohjelmakin on sinänsä sama, kilpailussa sitä vain käytetään tekstipohjaisesti eikä selaimella. Jos ohjelman syöte ja tuloste toimivat testaussivulla oikein, ne toimivat myös kilpailussa oikein.
En saanut testaussivua toimimaan Internet Explorerilla, mutta Google Chromella esimerkkiohjelma alkoi nätisti täyttämään ruudukkoa!
En tiedä, miksei Explorer toiminut, mutta tämä siis tiedoksi muillekin.
Nyt sivun pitäisi toimia myös uusimmalla Internet Explorerilla. IE:tä ei enää kehitetä, joten kannattaa ehdottomasti vaihtaa johonkin nykyaikaiseen selaimeen. IE:stä puuttuu monia nykyaikaisia JS-funktioita.
Tuota noin ....
Tarvitsisin apua, miten pitäisi toimia: Ajoin esimerkkiohjelman testisivun ja KilpailuProxyn avulla. KilpailuProxy ilmoittaa, että muistinkäyttö esimerkkiohjelmalla on n. 875000 Kt. Eli 875 Mt. Jos simppeli esimerkkiohjelma jo ylittää muistinkäytölle asetetun rajan, niin miten tämä ratkaistaan?
Kyseessä javalla tehty esimerkki.
Metabolix kirjoitti:
Kaikkia otteluita tuskin viitsii pelata, jos osallistujia tulee yli 10. Esimerkiksi 10 tekoälystä muodostuu jo 5040 eri peliä, ja kun yksi peli voi teoriassa viedä 4*30 sekuntia, aikaa voisi kulua 7 vuorokautta.
Jos kaikkia mahdollisia neljän pelaajan lohkoja ei pelata kaikissa järjestyksissä, vaan ainoastaan yksi järjestys/kombinaatio, niin silloin pelejä tulisi 5040/4! = 210. Tällöin aikaa kuluisi 7 tuntia, joka on mielestäni sangen kohtuullinen aika.
Olisiko tämä yksi vaihtoehto?
Realistiset vaihtoehdot varmaankin selviävät sitten kun tekoälyjen määrä on selvillä. Aika turha spekuloida paljonko 10 tekoälyllä menisi aikaa johonkin jos niitä lopulta tulisikin 30.
Timmmo kirjoitti:
Jos kaikkia mahdollisia neljän pelaajan lohkoja ei pelata kaikissa järjestyksissä, vaan ainoastaan yksi järjestys/kombinaatio – – Olisiko tämä yksi vaihtoehto?
Se olisi epäreilua, koska pelissä aloittajalla on selvä etu.
On todella turhaa miettiä tässä vaiheessa uusia turnausvaihtoehtoja. Minulla on siihen jo ihan toimiva ratkaisu, kuten ohjeissa lukee.
Koodaa mieluummin pari tekoälyä, niin saadaan edes kilpailu. :D
TapaniS kirjoitti:
KilpailuProxy ilmoittaa, että muistinkäyttö esimerkkiohjelmalla on n. 875000 Kt. Eli 875 Mt. – – Kyseessä javalla tehty esimerkki.
Java-virtuaalikone varaa paljon muistia automaattisesti. Siksi Javasta ei saa luotettavaa muistiarviota KilpailuProxyn käytössä olevilla keinoilla. Sama saattaa koskea CLR-virtuaalikonetta (.NET-kieliä).
Muistimäärän tutkimista vaikeuttaa myös roskienkeruu: Java ei välttämättä vapauta käyttämäänsä muistia, ennen kuin muisti loppuu. Siksi muistinkäytön tutkiminen ei kerro, mikä olisi matalin riittävä määrä.
Javalle voi antaa parametrin -Xmx512M muistirajan varmistamiseksi. Matalampia rajoja voi testata, jos kiinnostaa, mikä on matalin toimiva muistimäärä. Muistimäärää voi tutkia myös ohjelman sisällä, mutta tällaiset tarkastukset tietysti pitää poistaa ennen kisaa.
Virhevirtaa (stderr, System.err) voi käyttää debug-tulosteisiin ilman, että se haittaa ohjelman testaamista muuten.
Lisäsin esimerkkiohjelman mukaan tiedostot, joissa on lueteltu kaikki erilaiset laatat (myös peilattuina ja pyöritettyinä) ja niiden viereiset ja kulmittaiset ruudut. Korjasin myös testaussivua hieman, kannattaa päivittää.
Ehdinpä itse osallistua ensimmäisenä. :) Peli olikin yllättävän vaikea. Tänään tuli myös ensimmäinen muu osallistuja kisaan, joten lopetan oman Kiusa-ohjelmani kehittämisen tähän (SHA1: 81b8aaaa085c0e06a705fcb53470d6d0926fc726). Saa nähdä, teenkö vielä toisen ohjelman.
Kannattaa lähettää tekoälystä jokin versio jo hyvissä ajoin, koska aiempi kokemus on osoittanut, että testiajoissani löytyy usein pieniä vikoja, jotka ehtii sitten vielä korjata.
TapaniS: Onkohan sitä hyvä jakaa täällä? Javaa voi helposti kääntää takaisin lähdekoodiksi, vaikka paikallisten muuttujien nimet siitä puuttuvatkin... Edit: Onneksi tuo on vielä melko alkeellinen eikä paljasta mitään kovin ihmellisiä taktiikoita.
Metabolix kirjoitti:
TapaniS: Onkohan sitä hyvä jakaa täällä? Javaa voi helposti kääntää takaisin lähdekoodiksi, vaikka paikallisten muuttujien nimet siitä puuttuvatkin... Edit: Onneksi tuo on vielä melko alkeellinen eikä paljasta mitään kovin ihmellisiä taktiikoita.
Joo, se on lähes suora kopio esimerkkiohjelmasta, johon on vain lisätty hiukan logiikkaa oman siirron valintaan. Jos joku tämän ohjelman pystyy päihittämään, ei ehkä jää viimeiseksi :-)
Mutta luulin, että takaisinpäin kääntäminen ei olisi kovin helppoa. Ehkä en nyt sitten julkaisekkaan toisen polven versiota TaS2. Se ei vielä ole valmis, mutta siinä tullee jo isompiakin palikoita laudalle ...
Metabolix kirjoitti:
Voit käynnistää KilpailuProxysta useamman kappaleen ja syöttää testaukseen niistä saatavat eri osoitteet.
Testasin tänään ensimmäisen kerran ohjelmaani KilpailuProxyä vasten. Käynnistin kahdessa eri command promptissa proxyn, molemmat antoivat saman osoitteen. Näytti silti toimivan. Ympäristönä Windows 7, Python ja Firefox.
Kehitysehdotuksia:
- Pelilaudan molemmilla akseleilla voisi olla koordinaatit. Helpottaisi debuggaamista
- Testisivu voisi näyttää älyjen ajankäytön
- Virheilmoitukset voisivat olla ehkä selkeämmät. Ainakin kerran älyni ylitti aikarajan, ja proxyssä näkyi jokin socketin katkeamiseen liittyvä ilmoitus, joka ei ollut kovin havainnollinen.
Tämä 30 sek aikaraja asettaa ainakin omalle Java-algoritmilleni haasteita; ei voi brute-forcettaa siirtokombinaatioita kovin pitkälle, aika tuppaa loppumaan. Ehkä paremmalla algoritmilla ja tietoranteiden huolellisemmalla suunnittelullla älyä voisi nopeuttaa. Saas nähdä miten pitkälle aika ja energia riittää tämän kehittämiseen, koska päivätyöt jne. Toisaalta, ihan hyvä että joutuu vähän käyttämään mielikuvitustaan, raakan min-max -forcettamisen sijaan. :)
Timmmo kirjoitti:
Käynnistin kahdessa eri command promptissa proxyn, molemmat antoivat saman osoitteen.
Ei kai sentään? Pitäisi olla eri portti (yhden numeron ero), koska eiväthän ne voi samaa porttia mitenkään käyttää. Joka tapauksessa yhden ohjelman testaamiseen riittää yksi proxy.
Timmmo kirjoitti:
- Testisivu voisi näyttää älyjen ajankäytön
Windowsissa kannattaa kokeilla mieluummin proxyn C#-versiota (eli binääriversiota), jonka pitäisi mitata ajankäyttö Windowsissa oikein. Vastaavasti Linuxissa taas Python-versio antaa tarkemmat tiedot, kunhan koneella on Bash ajan mittaamista varten tai GNU Time ajan ja muistin mittaamista varten.
Katsotaan, saanko jossain vaiheessa Python-versioon myös Windowsissa toimivat mittarit ja C#-versioon Linuxissa toimivat, mutta ei kannata pidättää hengitystä kummankaan suhteen.
Timmmo kirjoitti:
- Virheilmoitukset voisivat olla ehkä selkeämmät. Ainakin kerran älyni ylitti aikarajan, ja proxyssä näkyi jokin socketin katkeamiseen liittyvä ilmoitus, joka ei ollut kovin havainnollinen.
Testausohjelma tai proxy ei aseta aikarajaa tai muistirajaa, eli niistä ei seuraa testauksessa mitään virheilmoitusta tai katkeamista. Jos pelisi päättyi kesken, luultavammin tekoälysi kaatui ihan itsestään. Tekoälyn virhetulosteiden (kuten Javan poikkeusten) pitäisi näkyä proxyn ikkunassa.
Python-proxy näyttää näköjään virheilmoituksen, jos sockettia yritetään sulkea sekä selaimen että proxyn puolelta samaan aikaan. Poistan turhan ilmoituksen seuraavasta versiosta.
Timmmo kirjoitti:
Tämä 30 sek aikaraja asettaa ainakin omalle Java-algoritmilleni haasteita; ei voi brute-forcettaa siirtokombinaatioita kovin pitkälle
Eipä se toisaalta toimiva tekoälykilpailu olisikaan, jos ratkaisut voisi triviaalisti brute-forcettaa.
Timmmo kirjoitti:
Käynnistin kahdessa eri command promptissa proxyn, molemmat antoivat saman osoitteen. Näytti silti toimivan. Ympäristönä Windows 7, Python ja Firefox.
Tuolla tavalla käy ainakin Windows Subsystem for Linuxissa Windows 10:llä. Testasin myös kahdella netcat-prosessilla, ja sekin antaa hassusti mukamas kuunnella samaa porttia. Viestit kuitenkin tulevat vain toiseen. Tilannetta ei myöskään voinut tarkastella netstatilla tai ss:llä, koska ne eivät toimi (https://github.com/Microsoft/WSL/issues/2249). Ehkä nämä ongelmat liittyvät toisiinsa. Joka tapauksessa siirryin sitten suosiolla pois WSL:stä.
Hauska kisa! Paljon opeteltavaa ainakin itselleni. Lähetän kuitenkin jonkun tykinruoan palloilemaan älyjen joukkoon. :)
Tegu kirjoitti:
Tuolla tavalla käy ainakin Windows Subsystem for Linuxissa Windows 10:llä.
Täytyypä joskus testata sitäkin. Rikkinäiseen ympäristöön en ala rakennella mitään purkkavirityksiä, mutta esimerkiksi lisäparametri portin valintaan voisi tulla kysymykseen.
Toimiikohan WSL:ssä time-komento toivotulla tavalla, ja saako ehkä myös erillisen time-ohjelman asennettua?
$ time sleep 1 real 0m1.014s user 0m0.001s sys 0m0.003s $ /usr/bin/time sleep 1 0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1960maxresident)k 0inputs+0outputs (0major+72minor)pagefaults 0swaps
En tiedä erillisestä time-ohjelmasta (rootit on kyllä, jos se siitä on kiinni), sen oma time ainakin näyttää samalta ainakin WSL Ubuntussa. En tosiaan itsekään jaksanut kikkailla tuon kanssa tai muokata vaikka KilpailuProxya, joten sen takia ei tarvitse mitään korjata.
$ time sleep 1 real 0m1.007s user 0m0.000s sys 0m0.000s $ /usr/bin/time sleep 1 0.00user 0.01system 0:01.00elapsed 1%CPU (0avgtext+0avgdata 704maxresident)k 0inputs+0outputs (0major+202minor)pagefaults 0swaps
Tegu kirjoitti:
En tiedä erillisestä time-ohjelmasta
Vastaus silti tuli: /usr/bin/time on se erillinen time-ohjelma ja näyttää toimivan.
Timmmo kirjoitti:
Käynnistin kahdessa eri command promptissa proxyn, molemmat antoivat saman osoitteen.
Selvittelin, ja ilmeisesti Windowsissa on ihan ”ominaisuus”, että samaan porttiin voi laittaa monta palvelinta samaan aikaan, jos SO_REUSEADDR on käytössä. Päivitin KilpailuProxya, ja nyt pitäisi tulla eri portti.
Timmmo kirjoitti:
Testisivu voisi näyttää älyjen ajankäytön
Päivitin KilpailuProxya, ja nyt pitäisi näkyä ajankäyttö ja muistinkäyttö myös Windowsissa Pythonilla.
TapaniS kirjoitti:
... Ehkä en nyt sitten julkaisekkaan toisen polven versiota TaS2. Se ei vielä ole valmis, mutta siinä tullee jo isompiakin palikoita laudalle ...
No niin ... TaS2 on valmistunut! Siinä laudalle tulee jo kahden ruudun mittaisia palikoita! Yllätys oli kuitenkin suuri, sillä se ei pärjännytkään TaS1 -versiolle! Vaikka aluetta vallataan enemmän, siihen ei sitten kuitenkaan mahdu yhtä paljon blokkeja!
Kehittely jatkuu ja TaS3 on jo ideointivaiheessa. Kolmen pituiset blokit varmaan jo muuttavat kuvion hiukan toisenlaiseksi ...
Metabolix kirjoitti:
Katsotaan, saanko jossain vaiheessa [KilpailuProxyn] Python-versioon myös Windowsissa toimivat mittarit ja C#-versioon Linuxissa toimivat, mutta ei kannata pidättää hengitystä kummankaan suhteen.
Nyt molempien KilpailuProxyn versioiden pitäisi näyttää kohtuullisen hyvin tietoja sekä Linuxissa että Windowsissa.
TapaniS kirjoitti:
Vaikka aluetta vallataan enemmän, siihen ei sitten kuitenkaan mahdu yhtä paljon blokkeja!
Tämä onkin suuri haaste pelissä: Isot palat tukkivat myös oman alueen helposti, joten ne pitää osata sijoitella fiksusti. Kannattaa vähintäänkin tunnistaa alueet, joihin vastustaja ei enää pääse, jotta saa täytettyä ne pikkupaloilla. Oma tuntuma on, että isoista paloista yksi saattaa olla tässä pelissä erityisen helppokäyttöinen, mutta katsotaan, miltä tulokset näyttävät.
No niin ... TaS3 on valmistunut ja se pukkaa jo kolmen ruudun kokoisia laattoja kentälle! Jälki on jo aika tehokkaan tuntuista! Aikaisemmat versiot eivät enää pärjää lainkaan. Tätä olisi jo mukava testata muitakin ohjelmia vastaan, mutta onnistuuko tällaisen kokeiluareenan muodostaminen? Vai paljastuuko lähdekoodit, jos tämmöistä yritetään?
TapaniS kirjoitti:
Tätä olisi jo mukava testata muitakin ohjelmia vastaan, mutta onnistuuko tällaisen kokeiluareenan muodostaminen?
Koska kilpailun säännöissä ei ole sovittu yhteisestä testauksesta tai välieristä, en ala omin päin järjestää yleistä testikierrosta saapuneilla ohjelmilla (eikä niitä monta olekaan). Voin kuitenkin antaa oman Kiusa-tekoälyni Windows-binäärinä ladattavaksi. Toimii myös Winellä. Muutin sen verran, että ei tarvitse datatiedostoa (tai siis data on ohjelmassa mukana). Jos joku jaksaa tuon disassembloida ja tulkita, on varmaan saavutetun hyödyn ansainnut.
Win-security herjasi, että lataus ei onnistu kokonaan, mutta ainakin lähti käyntiin.
Testipenkissä ...
kiusa kukistui! TaS4 jyrää!
Hauska kisa ja testisysteemit toimivat hyvin. Kiitos tästä järjestäjille.
Peli on hyvin haasteellinen botille jo suuren siirtomäärän takia, ja nelinpeli tekee siitä vieläkin kinkkisemmän. Lähetin nyt mukaan karvalakkibotin joka valitsee parhaan siirron yksinkertaisella heuristiikalla. Jos aikaa riittää niin tarkoitus olisi vielä koodata jotain älykkäämpää.
Montako älyä on nyt mukana kilpailussa?
On ihan mukavan oloinen kilpailuaihe! Jos suinkin aikaa riittää, niin minäkin laitan jonkun viritelmän kisaan. Tässä riittäis kyllä pohdittavaa pitemmäksikin aikaa. Näitä kisoja kun on niin harvakseltaan, (ymmärrettävästä syystä), niin voisko kisa-aikoja pidentää vastaavasti? Tätä kilpailua ei tietty kannata pitkittää, kun säännöt on jo laadittu.
Timmmo kirjoitti:
Montako älyä on nyt mukana kilpailussa?
7 kpl + esimerkki.
johku90 kirjoitti:
Näitä kisoja kun on niin harvakseltaan, (ymmärrettävästä syystä), niin voisko kisa-aikoja pidentää vastaavasti?
Yritän pitää kisoja useammin. :) Pitempää kilpailua voisi myös miettiä ehkä sellaisessa muodossa, että tekoälyistä saisi enemmän vlipalautetta. Jos on vain lopussa turnaus kovin pitkän ajan jälkeen, kisasta häviää helposti mielenkiinto.
Ah. Oma ohjelmointiputka-aktiivisuus alkaa olla aika alhaista. Melkein meni koko kilpailu ohi, kun ei tullut huomattua tätä ennen kuin tällä viikolla.
Mielenkiintoinen aihe, koska useamman kuin kahden pelaajan pelit ovat paljon monimutkaisempia mallintaa. Lisäksi jälleen kerran ensiluokkaiset testausalustat.
Tein kaksi tekoälyä nyt lauantaina – puhtaaksikirjoitus venyi kyllä hieman tarpeettoman paljon sunnuntain puolelle. Toinen on mielestäni ihan kohtalainen, toinen enemmän sellainen viihteellinen olento.
Vielä on muutama päivä aikaa, ja mukaan mahtuu hyvin ainakin nopealla tekoälyllä.
Nyt on hyvä aika ehdottaa kiinnostavia tilastoja tulossivua varten. Saa myös toteuttaa niitä tilastoja, jos haluaa: ottelut on tallennettu yksitellen juuri siinä JSON-muodossa, jossa testaussivukin ne lopuksi näyttää, ja lista ottelutiedostoista voidaan myös tallentaa johonkin (esim. ottelulista.txt).
L2-K2 kirjoitti:
Melkein meni koko kilpailu ohi, kun ei tullut huomattua tätä ennen kuin tällä viikolla.
Täytyy varmaan ensi kerralla lähettää vanhoille kilpailijoille sähköpostiin tieto kisoista, ettei jää huomaamatta.
Kilpailu on päättynyt!
Kisassa on mukana 12 tekoälyä, aakkosjärjestyksessä ebola, ion, Kiusa, kotivalo, kuolio, oskuruner, Pl0kk3r, raid, rnd, Spindel, Suisto ja TaS4. Kiitos kaikille osallistujille jo tässä vaiheessa.
Useimmat ohjelmat ovat melko nopeita, joten voidaan pelata kaikki neljän eri tekoälyn ottelut, joita tulee 12*11*10*9 eli 11880. Tulokset saadaan ensi viikon kuluessa.
Tulokset on julkaistu, ja tekoälyjä voi testata netissä!
11880 ottelua on pelattu, ja tulokset on julkaistu. Kilpailun voitti Sisuaski tekoälyllään ebola. Onneksi olkoon!
Käänsin kaikki tekoälyt JavaScriptiksi, ja päivitetyllä testaussivulla voi nyt pelata kaikkia tekoälyjä vastaan tai laittaa ne pelaamaan keskenään.
Idea JavaScript-käännöksestä tuli vasta kilpailuajan päätyttyä. Jotta käännös JavaScriptiksi onnistui, muutamaan tekoälyyn täytyi tehdä vähäisiä korjauksia kohtiin, joissa oli – säännöistä huolimatta – ajoympäristöstä riippuvaista vaihtelua. Muutokset olivat merkityksettömiä ohjelmien idean ja kisan lopputuloksen kannalta, ja niistä on tarkemmin ilmoitettu osallistujille henkilökohtaisesti. Ensi kerralla huomioin nämäkin ongelmakohdat ajoissa. :)
Tällä viikolla on pidetty sivupalkissa myös äänestystä seuraavan kisan ajankohdasta, ja näyttäisi, että kisa on aikaisintaan huhtikuussa, luultavasti vasta toukokuussa. Aiheita pohdittiinkin jo aiemmassa keskustelussa, ja varmasti sieltä nyt jokin sopiva idea löytyy.
Kiitokset vielä kisan järjestäjille! Vähän jäi kyllä hampaankoloon, kum tajusin, että omassa logiikassa oli paha virhe. Kasvatin oman laatan kokoa aina edellisen ruudun perään, jonka johdosta T-laatta jäi kokonaan hyödyntämättä!
Vaikeusastetta tulisi huomattavasti lisää, jos vastustajan laatan viereen saisi laittaa oman laatan, kuten Blokus-lautapelissä voidaan pelata. Lisäksi suurempi lauta antaisi enemmän mahdollisuuksia suunnitella hiukan pidemmälle. No ehkä tässä oli tarkoituksella hiukan helpompi lähtötilanne osallistumisriman alentamiseksi. Ja kultajyvät erottuivat tavallisista jyvistä hyvin näinkin!
Onnittelut voittajille!
Metabolix kirjoitti:
(04.02.2018 14:40:00): Tulokset on julkaistu, ja tekoälyjä voi testata...
Hyvin näköjään kääntyivät javascriptiksi tekoälyt, kun myös tuo aloitusvuorossa olevan raidin tyhmä bugi muilla kuin 25 ruudun laudoilla kääntyi nätisti mukaan... ei sillä, kilpailussa käytettävillä 25 ruudun laudalla se vapaiden ruutujen kirjanpito toimii täysin oikein (ja korjaus ei ole montaa merkkiä koodia).
Oli kieltämättä todella mielenkiintoinen kilpailu, ja hieman yllätyin miten hyvin oma tekoäly pärjäsi (etenkin kun huomioi, että se on koodattu oleellisesti yhdessä lauantai-ilta–sunnuntai-aamuyössä).
Hämmentävää tässä kilpailussa on myös se, että (matalahko) syvyyshaku tuntui tuottavan huonompia tuloksia kuin tuo täysin sokkona pelaaminen. Pieni syvyyshaku sai aikaan tekoälyn, joka ns. kaivoi verta nenästään kaikilta muita laudalla olijoilta...
[Syvyyshakeva versioni hävisi rumasti ykköstekoälylle 3+ pelaajan laudoilla, mutta voitti järjestään myös minut kaksipelissa (ja nöyryytti toki raidia vaikka sille olisi antanut tasoitusta). Tosin se hakuversio ei aina ”ihan” pysynyt tuossa 30 sekunnin aikarajassa, ja silti hävisi lähes kaikki 3+ pelaajan pelit niin ihan syystä se jäi pöytälaatikkoon...]
Kiitos hauskasta kisasta!
Hämmentävää, kuinka hyvin pärjäsi ennustamatta siirtoja. Katselin muutamia eri matsikombinaatioita, ja oli hassua, miten muut välillä tekivät siistejä suuria alueita pikkulaatoilla, kun oma älyni roiski menemään. Ehkä tosiaan vaikutti myös se, että voiton suuruudella ei ole väliä, vaan pelkkä sijoitus ratkaisee pisteet.
Neljän pelaajan mittelö kerrallaan toi mukavaa pohdintaa. Loppujen lopuksi oma ohjelmani ei tosin edes huomioinut sitä.
TapaniS: Aluksi jäi itseltäkin huomioimatta tuo T-pala, mutta huomasin ja korjasin sen. Sitten julkaistiinkin lista kaikista laatoista, ja päätin siirtyä siihen. Omalla menetelmällä nimittäin tuli käytyä läpi paljon samoja laattoja.
Paljonko otteluiden ajoon meni aikaa?
Olisi mielenkiintosta nähdä tarkempia tilastoja otteluista, mm. montako voittoa ja muita sijoja kullakin älyllä oli. Keskeytyikö mikään ottelu älyn virheeseen?
Mielenkiintoinen kilpailu tämä kyllä oli. Näin jälkiviisaana on hyvä todeta että omasta älystä tuli hieman liian hidas, koska en miettinyt softan rakennetta tarpeeksi huolellisesti. Tuli mm. käytettyä liikaa Javan olio-ominaisuuksia, kun yksinkertaisemmilla rakenteilla (mm. taulukot) olisi samat asiat tehnyt nopeammin. Myös turhia debuggaus-olioita tuli luotua. Alkuvaiheen nopeusongelmia selvitellessäni älyn pidemmälle kehittäminen jäi, ja koko projekti alkoi tuntua hieman liian työläältä, joten äly jäi hieman keskeneräiseksi. Vastustajia olisi pitänyt häiritä aktiivisemmin, ja myöskin yrittää muodostaa suljettuja alueita.
Kiitoksia järjestäjälle ja onnea voittajalle. Ja olisi kiva jos näitä kilpailuita olisi jatkossa hieman useammin, vaikka 2-3 kertaa / vuosi. :)
TapaniS kirjoitti:
Vaikeusastetta tulisi huomattavasti lisää, jos vastustajan laatan viereen saisi laittaa oman laatan, kuten Blokus-lautapelissä voidaan pelata.
Kuvittelin vielä suunnitteluvaiheessa, että laattojen vapaa muotoilu olisi helpompaa kuin jonkin vakiovalikoiman käyttö ja siis laskisi osallistumiskynnystä. Jos tällaisia laattoja saisi laittaa myös vastustajan viereen, voisi täyttää koko vastustajan nurkan kaikki välit, jolloin pelistä tulisi aika outo. Jälkiviisaana voin todeta, että sääntöjen valinta ei auttanut toivotulla tavalla ja Blokus-säännöt olisivat sopineet varmaan aivan hyvin.
L2-K2 kirjoitti:
Hyvin näköjään kääntyivät javascriptiksi tekoälyt, kun myös tuo aloitusvuorossa olevan raidin tyhmä bugi muilla kuin 25 ruudun laudoilla kääntyi nätisti mukaan...
Mikähän bugi? Ainakin aloituspalan valinnan olet erikseen selittänyt koodissa, joten se ei varmaan ole bugi.
Tegu kirjoitti:
Sitten julkaistiinkin lista kaikista laatoista
Tämänkin syynä saattoi olla itse havaittu vaikeus uniikkien laattojen nopeassa generoimisessa. :)
Timmmo kirjoitti:
Paljonko otteluiden ajoon meni aikaa?
Vaikea sanoa tarkkaan, kun ajoin otteluita useassa erässä ja osittain moneen kertaan (mm. tekoälyjen muutosten vuoksi), mutta lopputuloksista voidaan laskea ajankäytöksi noin sekunti per tekoäly per ottelu, jolloin kokonaisaika olisi noin 14–15 tuntia.
Timmmo kirjoitti:
Olisi mielenkiintosta nähdä tarkempia tilastoja otteluista, mm. montako voittoa ja muita sijoja kullakin älyllä oli.
Lisäsin tämän tilaston.
Timmmo kirjoitti:
Keskeytyikö mikään ottelu älyn virheeseen?
Testausohjelmasta puuttui virheiden raportointi, kun virheen tehnyt tekoäly vain pudotettiin pelistä. Tarkastin nyt putoamistilanteet erillisellä ohjelmalla ja tein listan niistä, joissa olisi ollut vielä laillinen siirto. Pl0kk3r putosi 307 kertaa ja raid putosi 22 kertaa. Testasin pari peliä noista, ja nähtävästi kyseiset ohjelmat tosiaan tekevät virheellisiä siirtoja aiempien laattojen päälle. Pl0kkerin virhe näkyy esimerkiksi pelissä Kiusa–Pl0kk3r–Suisto–Spindel, ja raidin virhe näkyy pelissä Kiusa–ebola–oskuruner–raid.
Timmmo kirjoitti:
Ja olisi kiva jos näitä kilpailuita olisi jatkossa hieman useammin, vaikka 2-3 kertaa / vuosi. :)
Yritetään. :D
Metabolix kirjoitti:
L2-K2 kirjoitti:
Hyvin näköjään kääntyivät javascriptiksi tekoälyt, kun myös tuo aloitusvuorossa olevan raidin tyhmä bugi muilla kuin 25 ruudun laudoilla kääntyi nätisti mukaan...
Mikähän bugi? Ainakin aloituspalan valinnan olet erikseen selittänyt koodissa, joten se ei varmaan ole bugi.
Ihan oma klassinen koodausvirhe: jos tekoäly on ensimmäisenä vuorossa ja kenttä ei ole 25 ruudun levyinen, niin se kirjaa itselleen sallituksi siirroksi kaikki kulmat. Sitten, heti kun loppupeli alkaa, se tekee laittoman siirron jo pelattuun ruutuun.
Linkin kuvassa oranssi ”raid” hieman unohtaa pelata... https://imgur.com/a/7LyKM
Korjaus olisi se, että aloitustekoäly pelaisi muilla kuin 25 ruudun kentillä sen (sen joka tapauksessa pelaaman) 1 × 1 -palan samalla tavoin kuin miten se pelaa tuon avaus neljän suoransa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.