Muutama sekunti sitten alkoi Ohjelmointiputkan historian kahdeksas kilpailu:
https://www.ohjelmointiputka.net/kilpa.php?
Tällä kertaa aiheessa on hieman urheilumieltä, nimittäin tehtävänä on ohjelmoida tekoäly hippaleikkiin. Tekoälyn pitää osata ohjata niin hippoja kuin pakenijoitakin: pakeneva tekoäly ryöstää hipalta yhden pisteen jokaisella siirrolla.
Kilpailu päättyy kuukauden kuluttua, tammikuun 12. päivän iltana kello 21.21., vaikka aiemminkin saa toki ilmoittautua. Kilpailusta voi kysellä ja keskustella tässä aiheessa. Tervetuloa mukaan!
Pitääpä yrittää osallistua tuohon.
Ensimmäisenä pistää silmään hippa.in rakenne jossa rivinvaihto on erotettu vain #13 merkillä. Notepad ei muotoa tue ja luulen että Delphi 7/pascal kieli ylipäätään tekee siihen #13#10 kun käytetään perinteistä writeln() tahi tekstiluokkaa. Onko molemmat muodot sallittuja tuomariohjelmalle vai pitääkö kikkailla oma tekstipötkö? :p
Ja toiseks, onko H alkuiset lueteltu aina ennen P alkusia per kierroksen tieto vai voiko ne olla sekaisin?
(edit2: tarkemmin ajateltuna, kyllä ne voivat olla sekaisin)
Luulen että Pascal tekee oletuksena niin vain Windows-ympäristössä.
User137 kirjoitti:
Ensimmäisenä pistää silmään hippa.in rakenne jossa rivinvaihto on erotettu vain #13 merkillä. Notepad ei muotoa tue ja luulen että Delphi 7/pascal kieli ylipäätään tekee siihen #13#10 kun käytetään perinteistä writeln() tahi tekstiluokkaa. Onko molemmat muodot sallittuja tuomariohjelmalle vai pitääkö kikkailla oma tekstipötkö? :p
Molemmat muodot sallitaan, ja Grez arvelee yllä aivan oikein. Esimerkkitiedostoon on tietenkin Linuxissa päätynyt UNIX-rivinvaihto (#10 itse asiassa).
Testaan kaikki lähetetyt ohjelmat myös nopeasti käsin, ja jos jokin tällainen pikkuseikka aiheuttaa ongelmia, voin tarvittaessa laittaa testiohjelman käyttämään Windowsin rivinvaihtoja.
User137 kirjoitti:
Ja toiseks, onko H alkuiset lueteltu aina ennen P alkusia per kierroksen tieto vai voiko ne olla sekaisin?
Voivat olla sekaisin. Pelaajien numerot määräytyvät tiedoston rivien mukaan, ja niitä ei pelin aikana muuteta. Näin voidaan tarvittaessa seurata jokaisen pelaajan liikettä erikseen, jolloin myös oman muistitiedoston käyttö tulee järkevämmäksi. Jos siis pelaaja 10 saadaan kiinni, muuttuu rivin 10 alun kirjaimeksi H, vaikka tätä ennen olisi monta P:tä.
Juu voishan tota yrittää... :D
Säännöt kirjoitti:
Joka kierroksella saa pysyä paikallaan tai liikkua johonkin viereisistä ruuduista.
Onko viereinen ruutu vain sivu- tai pystysuunnassa viereinen vai myös kulmittain viereinen?
Mahdolliset liikeet ovat +x, -x, +y, -y tai 0!
Gwaur kirjoitti:
Onko viereinen ruutu vain sivu- tai pystysuunnassa viereinen vai myös kulmittain viereinen?
Viereisiä ruutuja ovat vain ensin mainitsemasi. Tämähän tosiaan selviää myös liikekomennoista, joita ei ole kuin neljään suuntaan.
Pitääkö se kilpailusofta kirjaa noista pelaajista, ettei ne mene sekaisin.
Siis niiden pelaajien id-numeroista?
Edit: typoja...
vehkis91 kirjoitti:
Pitääkö se kilpailusofta kirjaa noista pelaajista, ettei ne mene sekaisin.
Johan tässä äsken aiheesta kysyttiin, ja nyt säännöissäkin mainitaan, että ne pysyvät järjestyksessä. Ei siihen kovin kummoista kirjanpitoa tarvita. Kerro toki, jos ne voisivat mielestäsi mennä vielä jollakin muulla tavalla "sekaisin".
Juu, sekosin vaan.. :D
Miten käy tilanteessa, jossa hippa ja pakenija ovat aluksi vierekkäisissä ruuduissa ja sitten liikkuvat kumpikin toistensa suuntaan, eli kulkevat toistensa läpi?
En löytänyt säännöistä muuta kriteeriä kiinni jäämiselle kuin hipan kanssa samaan ruutuun joutuminen, joten jääkö tässä kohtaa pakenija siis vapaaksi?
Sisuaski kirjoitti:
Miten käy tilanteessa, jossa hippa ja pakenija — — kulkevat toistensa läpi? — — Jääkö tässä kohtaa pakenija siis vapaaksi?
Kyllä, säännöt on tältä osin laadittu kirjaimellisesti. Ratkaisu toisaalta yksinkertaistaa logiikkaa huomattavasti ja toisaalta myös simuloi hieman todellisen leikin täpäriä tilanteita. Ruudukkohan on kuitenkin aika kömpelö pelikenttä. Jokainen miettiköön sitten tykönään, millaisia tilanteita tämä sääntö voi aiheuttaa. ;)
Kai tuohon voisi jonkinlaisen ohjelman koittaa väkertää. Katsoo nyt mitä saa aikaiseksi. Miksei muuten tuossa ladattavassa testiohjelmassa ole käytetyn ajan mittausta mukana? Nopeastihan siihen kyllä itsekin jonkinlaisen muokkaa.
Pisti silmään
"Pakenevan tekoälyn pistemäärä on sen tekemien siirtojen summa, eli mitä pitempään ja mitä useammalla pelaajalla sen onnistuu paeta, sitä enemmän pisteitä kertyy."
Eli jos tekoäly pakenee, mutta se pysyy vain paikallaan kierroksella kertyykö tästä pisteitä vai luetaanko tätäkin sano tarkasti jolloin kannattaa pysyä koko ajan liikkeessä.
teksturi kirjoitti:
Eli jos tekoäly pakenee, mutta se pysyy vain paikallaan kierroksella kertyykö tästä pisteitä vai luetaanko tätäkin sano tarkasti jolloin kannattaa pysyä koko ajan liikkeessä.
Myös paikallaan pysyminen lasketaan siirroksi. Tästä onkin jo maininta sääntöjen tarkennuksissa:
lainaus:
Pakeneva tekoäly saa pisteitä myös niistä siirroista, joilla sen pelaajat pysyvät paikallaan tai jäävät kiinni. Ottelun kokonaispistemäärä saadaan siis laskemalla
hippa.txt
:n P-alkuiset rivit lopputilannetta edeltäviltä kierroksilta.
Toinen kysymys liittyy aikaan. Jos ohjelma on ehtinyt kirjata liikkeensä liike.txt tiedostoon, mutta ohjelma ei ole lopettanut toimintaansa sekunttiin kuluessa niin häviääkö tällöin omatekoäly vai saako sekuntin käyttää aina loppuun ja ohjelma tapetaan sen jälkeen. Tämä olisi mielestäni mukavampaa jolloin ei tarvitsisi tutkia aikaa erikseen omalla ohjelmalla.
teksturi kirjoitti:
Toinen kysymys liittyy aikaan. Jos ohjelma on ehtinyt kirjata liikkeensä liike.txt tiedostoon, mutta ohjelma ei ole lopettanut toimintaansa sekunttiin kuluessa niin — —
Ajan loputtua ohjelma sammutetaan väkisin, ja liiketiedostosta luetaan ne rivit, jotka sinne on ajoissa kirjoitettu. Tässä kannattaa huomioida ohjelman tekemä puskurointi (kaikkea ei välttämättä kirjoiteta heti kirjoituskomennon jälkeen), eli jonkinlaista flush
-funktiota kannattaa varmuuden vuoksi aina välillä kutsua.
Hei,
Kilpailun testiympäristössä oli python 2.6, kilpailuun osallistuessani haluaisin kuitenkin käyttää python 3.0 joka ei ole yhteensopiva 2.x kanssa. Onko mahdollista saada 3.0 lisätyksi?
tkok kirjoitti:
Onko mahdollista saada Python 3.0 lisätyksi?
Nyt sekin on asennettu. Onkin kiinnostavaa nähdä, kuinka nopeasti tuosta tulee "python" ja 2.6:sta "python2".
lainaus:
8 ≤ K ≤ L ≤ 100
Onko korkeuden pakko olla leveyttä pienempi tai sama, vai pitäisikö ohjeessa lukea että 8 ≤ K, L ≤ 100? Tuntuu vähän tyhmältä säännöltä!
petrinm kirjoitti:
Onko korkeuden pakko olla leveyttä pienempi tai sama, vai pitäisikö ohjeessa lukea että 8 ≤ K, L ≤ 100?
Kyllä tässä sääntöjen mukaan toimitaan. Voit toki vapaasti tehdä ohjelmasi tukemaan myös isompia kokoja, ei se ketään haittaa.
petrinm kirjoitti:
Tuntuu vähän tyhmältä säännöltä!
Mitä koet tämän säännön vuoksi menettäväsi? Tällähän ei ole mitään merkitystä sen paremmin ohjelmoinnin kuin kilpailunkaan kannalta, koska vaikka korkeus olisi suurempi, siitä saisi pienemmän kääntämällä tilannetta 90 astetta.
Kuvaruudunkin leveys on yleensä korkeutta suurempi, joten näin muotoiltuja pelejä on parempi katsella. Ehdottamasi kirjoitusasu oli myös Antin mielestä tulkittavissa kierosti niin, että kyseessä olisi kaksi erillistä ehtoa.
Metabolix kirjoitti:
Jotta kilpailu olisi tasapuolisempi erilaisissa olosuhteissa menestyville tekoälyille, pyritään turnauksia pelaamaan ainakin kaksi. Lopullisiin tuloksiin eri turnausten pistemääriä painotetaan niin, että myös pienistä pelitilanteista saa kohtuullisesti pisteitä suhteessa isompiin.
Säännöt olivat hyvin yksiselitteiset, mutta koska kilpailussa menestytään pisteytyksen mukaan, mielestäni olisi kohtuullista vastata seuraaviin kysymyksiin.
Tarkoittaako "erilaiset olosuhteet" vain ja ainoastaan erikokoisia kenttiä (8x8 ... 100x100) sekä erilaisia hippojen ja pakenijoitten määriä?
Miten pieni pelitilanne eroaa isommasta pelitilanteesta? Hipan ja pakenijan välisen etäisyyden mukaanko?
Kai jokaisessa pelissä vastakkaiset tekoäly pelaavat vuorollaa sekä hippaa, että pakenijaa samasta alkutilanteesta? Tällöin ainakin voidaan tarkasti ja tasapuolisesti saada selville kyseisten tekoälyjen paremmuus kyseisessä pelitilanteessa laskemalla omat hippa ja pakenijapisteet yhteen. Kyseisten pelien välillä kannattaa tietenkin muistit nollata, jotta toiseen peliin ei jompi kumpi teköäly saa etua.
pipo kirjoitti:
Tarkoittaako "erilaiset olosuhteet" vain ja ainoastaan erikokoisia kenttiä (8x8 ... 100x100) sekä erilaisia hippojen ja pakenijoitten määriä?
Kyllä, ja tietenkin alkuasetelmaa.
pipo kirjoitti:
Miten pieni pelitilanne eroaa isommasta pelitilanteesta? Hipan ja pakenijan välisen etäisyyden mukaanko?
Lähinnä teoreettisten maksimipisteiden ja keskimääräisten pisteiden mukaan. Nämä tietenkin riippuvat olennaisesti juuri mainitsemistasi asioista. Katsotaanpa muutamaa ääriesimerkkiä:
Tällaisia ongelmatilanteita siis pyritään tasaamaan. Esimerkit ovat toki liioiteltuja, ja tavoitteena olisi saada testitapauksista mielekkäitä eli sellaisia, että mahdollisimman suuri osa peleistä päättyisi hippojen "voittoon". Toisen päättymistavan onkin vain tarkoitus estää pelien venyminen liian pitkiksi tapauksissa, joissa pakenija on ylivoimainen. Aivan suurimmat pelaajamäärät ja kenttäkoot ovat mukana lähinnä siltä varalta, että tehtävä osoittautuu odotettua helpommaksi ja pienemmät arvot eivät tuota selkeitä tuloksia. On vaikea arvioida etukäteen, miten hyviä tekoälyjä kilpailuun osallistuu.
Varsinaisen turnauksen lisäksi saatan testata älyjen toimintaa muutamassa erikoisessa alkutilanteessa mielenkiintoisia tilastoja varten. :)
FooBat kirjoitti:
Kai jokaisessa pelissä vastakkaiset tekoäly pelaavat vuorollaa sekä hippaa, että pakenijaa samasta alkutilanteesta?
Kyllä, turnaus käydään perinteisellä kaavalla. Myös muisti nollataan aina.
jokaiselle valitulle alkutilanteelle T: jokaiselle hippaälylle H: jokaiselle pakenijaälylle P: nollaa muistit ja pelaa tilanne T hipalla H ja pakenijalla P
Jos loppupisteisiin jää paljon tasatilanteita, pelataan vielä lisää kierroksia jollakin pienehköllä alkutilanteella.
Tuo testiohjelma ei taida millään lailla käsitellä muisti.dat tiedostoa. (Esim nimetä tilapäisesti toiseksi) Siinähän menee meinaan sekaisin hipan ja pakenijan muistit.
Ratkaisumalleja ongelmaan on monia varmasti, en edes mainitse, ja samalla pitäis pitää huoli ettei vastustajan äly pääse sabotoimaan toista. Jollain pitäs kuitenkin testata. Graafinen olis kaikkein paras siihen että näkee asetelman itse. Toki sen voi jättää koodaajan ittensä vastuullekin :p
Jokaisella älyllä tulee luultavasti olemaan omat kansiot jolloin muistit eivät voi mennä sekaisin. Jos menet muiden älyjen kansioihin sinut luultavasti tullaan diskaamaan.
User137 kirjoitti:
Tuo testiohjelma ei taida millään lailla käsitellä muisti.dat tiedostoa.
Ei niin. Siinähän ihan erikseen mainitaan, että se ei ole lopullinen testiohjelma eikä huolehdi tuosta.
Lopullisessa testijärjestelyssä älyt ovat omissa hakemistoissaan ja ne aina ottelun ajaksi kopioidaan RAM-levylle, jottei kovalevyä tarvitsisi turhaan rasittaa jatkuvalla kirjoittamisella ja lukemisella. Linuxissa on myös välineet estää älyä koskemasta muuhun kuin sallittuihin tiedostoihin ja sallitulla tavalla.
User137 kirjoitti:
Jollain pitäs kuitenkin testata. Graafinen olis kaikkein paras siihen että näkee asetelman itse. Toki sen voi jättää koodaajan ittensä vastuullekin :p
Tuolla testiohjelmalla onnistuu kyllä testaaminen. Voit vaikka antaa ajokomennoksi "hippa.bat" ja kirjoittaa sinne nuo vaihtoon tarvittavat komennot:
move muisti-H.dat muisti.dat tekoaly move muisti.dat muisti-H.dat
Toinen vaihtoehto on laittaa oma tekoäly testausvaiheessa käyttämään eri tiedostonimeä sen mukaan, onko se hippana vai pakenijana.
Ottelun kulkua voi katsella jälkikäteen paketissa olevalla JavaScript-sivulla. Toki tuohon valmiiseen testiohjelmaan voisi pienellä vaivalla lisätä vaikka ASCII-tulostuksen, katsotaan, jos tämä jossain vaiheessa ilmestyisi.
Saattaisi muuten olla tulosten kannalta mielenkiintoisempaa, jos kaksi tekoälyä pelaisi useamman pelin keskenään ilman muistin nollausta. Tämä toisi tekoälyyn paremmin vastustajan pelitavan oppimisen mukaan. Yhdessä pelissä ei oppimisella ole paljon vaikutusta.
Tyyliin
jokaiselle hippaälylle H: jokaiselle pakenijaälylle P: nollaa muistit jokaiselle valitulle alkutilanteelle T: pelaa tilanne T hipalla H ja pakenijalla P
Jostain syystä tuo testaus softa ei toimi... :S Tulee vaan "Ohjelma on suorittanut..." Johtuiskohan vistasta?
FooBat kirjoitti:
Yhdessä pelissä ei oppimisella ole paljon vaikutusta.
Pelien määrällä ei pitäisi olla merkitystä vaan siirtojen, ja tällöinkin kyse on vain aiempien tilanteiden tuntemisesta, joten samaan tulokseen päästäisiin ilmankin muistitiedostoa antamalla käyttöön vanhat hippa.txt:t. Tietenkin jos pelattaisiin sama peli kymmenen kertaa peräkkäin, päästäisiin ehkä useammin samantapaisiin tilanteisiin. Voi toki olla, että minulta on jäänyt jotain huomaamatta asiassa, joten kuulisin mielelläni lisää perusteluja väitteelle.
Onneksi maailma ei kaadu tähän kilpailuun, vaan jos osallistujia riittää, vastaavanlaisia ideoita voidaan keksiä jatkossa lisää ja kehittää palautteen mukaan. :)
vehkis91 kirjoitti:
Jostain syystä tuo testaus softa ei toimi... :S Tulee vaan "Ohjelma on suorittanut..." Johtuiskohan vistasta?
On suorittanut mitä? Muistaakseni käytät C++:aa, joten voit vaikka yrittää kääntää ohjelman itse. Paketti on myös päivittynyt jo kertaalleen, joten varmista, että käytät uusinta versiota.
Juu, latasin uusimman version niin toimii. :D
Metabolix kirjoitti:
FooBat kirjoitti:
Yhdessä pelissä ei oppimisella ole paljon vaikutusta.
Pelien määrällä ei pitäisi olla merkitystä vaan siirtojen, ja tällöinkin kyse on vain aiempien tilanteiden tuntemisesta, joten samaan tulokseen päästäisiin ilmankin muistitiedostoa antamalla käyttöön vanhat hippa.txt:t. Tietenkin jos pelattaisiin sama peli kymmenen kertaa peräkkäin, päästäisiin ehkä useammin samantapaisiin tilanteisiin. Voi toki olla, että minulta on jäänyt jotain huomaamatta asiassa, joten kuulisin mielelläni lisää perusteluja väitteelle.
Oma ajatukseni vaan oli, että perus liikkuminen pelissä on melko yksinkertainen ongelma ja oppimisella on käytännössä merkitystä vain tilanteissa, joissa joudutaan tekemään 'kivi-paperi-sakset'-tyyppinen arvaus, eli pysytäänkö pakenijalla paikoillaan olettaen, että hippa myös pysyy paikoillaan (ja odottaa vahvistuksia) vai paetaanko hipan suuntaan olettaen hippa siirtyy pakenijan ruutuun. Tälläisiä tilanteita tulee yhdessä pelissä maksimissaan suunnilleen pakenijoiden määrä ja ensimmäinen tällainen arvaus voi ratkaista pelin. Tällaisessä tilanteessa edellisistä peleistä saatu tieto vastustajan pelityylistä (hyökkäävä, varmisteleva) voi merkittävästi muuttaa pistetulosta.
Päädyin vähän samanlaiseen järkeilyyn kuin FooBat. Vastustajan arvioimisella opitun perusteella voi olla pelissä aika keskeinen rooli. Toisaalta en itse pidä (etenkään takaa-ajajan) liikkumista mitenkään simppelinä ongelmana... :)
Voinko ohjelmoida Fortranilla?
Saako gfortran nimisen kääntäjän asennettua testikoneelle?
http://gcc.gnu.org/wiki/GFortran
Co kirjoitti:
Voinko ohjelmoida Fortranilla?
Aina on kiva saada harvinaisempiakin kieliä mukaan. Lisäsin kielilistaan Fortranin ja Objective-C:n, molempia kääntää GCC 4.3.2. Asensin samalla vauhdilla myös Haskell-kääntäjän (GHC 6.8.2).
Onko mahdollista, että asennat roadsendin ja käännät sille tarkoitetut php-tiedostot binääreiksi? ks. http://www.roadsend.com/home/index.php
tesmu kirjoitti:
Onko mahdollista, että asennat roadsendin ja käännät sille tarkoitetut php-tiedostot binääreiksi?
Kyllä se näköjään kääntyi ja käynnistyi. Ehkä se siis toimii.
Olisiko mahdollista, että esim mini.txt:iin koordinaattien lisäksi kirjoitettaisiin samalle riville pelaajan ID (esim H1 H2 H3 tai H 1 H 2 jne jne) ?Helpottaisi parsimista huomattavasti kuin se, että jokainen on omalla rivillään ja ID tulee sen perusteella missä järjestyksessä ne on.
Ei formaattia tässä vaiheessa lähdetä muuttamaan, eikä tuollaista muutenkaan olisi järkeä lisätä. Mikä rivinumerossa on niin vaikeaa? Nehän vastaavat PHP:ssä suoraan esimerkiksi file
-funktion palauttaman taulukon indeksejä tai rivi kerrallaan luettaessa silmukassa laskurin arvoa.
Olen tuossa itse yritellyt tehdä omaa testaajaa Delphillä, ainoana ongelmana vaan Runtime errorit kun tiedostoja availlaan samanaikaisesti. En huomannut eroja siihen vanhan ristinollakisan testaajaan mutta siinä tiedostoihin ei kirjoitettu kuin 1 rivi mikä oli paljon nopeampaa. Kuitenkin TImage:en 100x100 pikselin tulostaminen on hyvin helppoa.
Välillä looppaan tätä jotta lukuoikeutta yritän tarkistaa:
function FileExists2(FileName: string): Boolean; var F: file; begin {$I-} AssignFile(F, FileName); FileMode:=0; // Set file access to read only Reset(F); CloseFile(F); {$I+} result:=(IOResult=0) and (fileexists(filename)); end;
Muoks: Toimii näköjään kun laitan pakotetun 100ms viiveen siitä kun liike.txt löytyy... kauheeta purkkaa.
User137 kirjoitti:
Muoks: Toimii näköjään kun laitan pakotetun 100ms viiveen siitä kun liike.txt löytyy... kauheeta purkkaa.
Purkkaa ohjelmassasi taitaa itse asiassa olla se, että ylipäänsä joudut tuollaiseen tilanteeseen. :) Äly pitää ajaa komennolla, joka ilmoittaa, kun on ohjelma lopettanut. Mitään ongelmia ei tällä tavalla pitäisi olla.
Lähetin juuri oman PHP:llä tehdyn bottini kisaan. Se on hyvin yksinkertainen, mutta kyllä se nyt jonkun voittaa (tai sitten ei :D).
Ohjelman suorituksessa menee omalla koneellani noin 0.01 sekuntia (mittasin timellä), joten ei tekoälyni ainakaan liikaa jää miettimään.
Onko tässä tarkoituksena siis tehdä kaksi erillistä ohjelmaa hipalle ja pakenijalle?
Edit: Mitenköhän php-tiedoston testaus onnistuu?
Yksi ohjelma joka sisältää kaksi tekoälyä. Ohjelman on pääteltä tiedostojen perusteella, onko sen toimittava hippana vai pakenijana.
jo123 kirjoitti:
Edit: Mitenköhän php-tiedoston testaus onnistuu?
Esimerkiksi antamalla testauskomennoksi php aly.php
tai C:\ohjelmat\php5\php.exe aly.php
tms. eli saman komennon, jolla muutenkin saisit php-skriptin ajettua komentorivillä.
Joulun iloksi tuli myös hippakilpailun testausohjelmasta uusi versio, joka hallinnoi muisti.dat-tiedostoja ja tulostaa pelitilanteen yksinkertaisena ASCII-grafiikkana. Lisäksi ohjelmalla voi pelata itse tekoälyään vastaan antamalla jommankumman älyn ajokomennoksi viivan (-
).
Tämä oli todella hyödyllinen lisäys, siis tuo että voi itse pelata tekoälyä vastaan!! :D:D KIITOS! :D:D:D
Edit: Ainakin huomasin, että toi mun äly on "niljakas".. :D:D
Niin ja ekaa vastausta lähetettäessä kauan sitten mailisysteemi palautti postin koska sisälsi exe:n. Onneksi sentään Delphikoodi käänty freepascalilla.
Olen tavannut sähköpostipalvelimia jotka hylkää exe:n takia vaikka se olisi zippitiedostossa jonka tiedostopääte on uudelleennimetty ja pakattu vielä toisen uudelleennimetyn zipin sisään...
User137 kirjoitti:
Niin ja ekaa vastausta lähetettäessä kauan sitten mailisysteemi palautti postin koska sisälsi exe:n.
Kiitos, että kerroit asiasta, en nimittäin ollut tästä tietoinen. Ongelma on nyt korjattu.
User137 kirjoitti:
Onneksi sentään Delphikoodi käänty freepascalilla.
Natiivi Linux-käännös saattaa myös toimia nopeammin kuin winellä ajettava Windows-ohjelma. Ei sillä, että tekoälylläsi olisi tämän suhteen mitään hätää. :)
Se ei vissiin sitten haittaa, jos teen ohjelmani QuickBasicilla, kuten mainitsit kilpailusivulla, vai mitä? (Mun piti alunperin tehdä se Visual Basicilla mutta tuli eräs pikku ongelma vastaan.)
Päätin vain varmistaa..
Eihän se minua haittaa, mutta sinua saattaa haitatakin, kun DOSBox vastaa vain noin sadasosaa todellisista tehoista. :) Kannattaa ehkä kokeilla FreeBASICia, joka on pääpiirteittäin yhteensopiva QB:n kanssa ja jota voi sitten Linuxissakin kääntää.
Kokeilin FreeBASICia, mutta se heitti erroria mm. DEFINT A-Z -käskystä ja aika monesta muustakin, niin että päätin sitten luopua siitä.
Juhko kirjoitti:
Kokeilin FreeBASICia, mutta se heitti erroria mm. DEFINT A-Z -käskystä
Et tainnut kokeilla erityistä QB-tilaa?
fbc koe.bas -lang qb
Joo, nyt sain toimimaan. Kiitti.
En kuitenkaan ole varma, toimiiko ohjelma lopullisessa testiohjelmassa. Se nimittäin tarkistaa hippa.txt -tiedoston 2. ensimmäiseltä riviltä, ohjaako se hippoja, pakenijoita, vai sekä että. Jommallakummalla rivillä täytyy siis lukea ohjelman nimi ("Jeppe") täsmälleen oikein. Eli käviskös jos lähetän käännetyn ohjelman sulle sähköpostiin ja katsotaan, että toimiiko?
Nimi lukee siinä muodossa, kuin sen ilmoittautumisviestissä ilmoitat. Jos ohjelma toimii omalla koneellasi oikeanlaisella tiedostolla, on hyvin erikoista, jos se ei toimi testitilanteessa. Ilmoittautumisen yhteydessä kyllä tarkistan myös ohjelman toimivuuden ja kerron siitä.
Kuinka ajattelit toimia, jos ohjaat molempia? O_o Et sinä niitä samalla kertaa voi ohjata kuitenkaan. Tällaisessa ottelussa luultavasti täytyy toisen tekoälyn nimi vaihtaa tiedostosta aina toisen siirron ajaksi.
Tässä vaiheessa voin jo melko varmasti sanoa, että tuo julkinen testausohjelma on myös kilpailussa käytössä suunnilleen nykymuodossaan.
Siis: hippa.in -tiedostossa lukee "hipakkeen" ja "pinkon" tilalla kummassakin "Jeppe". Tämä lukee siis hippa.txt -tiedostossa kummallakin rivillä "Jeppe". Kun ajan testiohjelman, niin kirjoitan sekä hipaksi että pakenijaksi "Jeppe". Itse ohjelma tarkistaa kummallakin vuorolla hippa.txt -tiedostosta, lukeeko sen nimi 1. rivillä, 2. rivillä, vai molemmilla. Jos ohjelma siis ajetaan pakenijana, mutta hippa.txt-tiedoston 2. rivillä lukee "pinko", siirto jätetään tekemättä ja ohjelma lopetetaan, eli pakenijat pysyvät paikoillaan.
Minua arvellutti ainoastaan se, kun kerroit, että tekoälyt tulevat eri hakemistoihin. Halusin vain varmistuksen, että hippa.txt-tiedostot ovat sekä hipan, että pakenijan hakemistoissa samassa muodossa.
Eiköhän ne samassa muodossa ole.
EDit: mini.txt taas on eri hipalla ja pakenijalla.
En kyllä ymmärtänyt selityksestäsi taaskaan mitään. Jospa vain tekisit ohjeiden mukaan, siellähän selvästi sanotaan, että 1. rivillä on hipan nimi ja 2. rivillä pakenijan. En ymmärrä, miten mitkään hakemistot tai muut vaikuttaisivat tähän. Et myöskään nyt oikein kertonut, tuosta mainitsemastasi tapauksesta, jossa älysi ohjaa "sekä että".
En osaa selittää paremmin, enkä myöskään ymmärrä, miten muuten tuo pitäisi tehdä. Eikö nyt kävisi, että lähetän ohjelman ja lähdekoodin sähköpostiisi?
Jos ohjelmasi nimi on Jeppe niin silloin siellä hippa.txt:ssä lukee Jeppe, eikä mitään muuta. Eikä se voi tossa kilpailussa pelata itseään vastaan, joten mitä oikeen sekoot?
Kaveri halunnee testata omaa ohjelmaansa ilman, että joutuu itse pelaamaan ohjelmaansa vastaan. Helpoiten se onnistunee nimeämällä toisen hipaksi ja toisen pakenijaksi, jolloin testausohjelmalle ei tule nimien kanssa sekaannusta. Toivottavasti ymmäsrsin aloittajan ongelman oikein.
Pitikö saman EXEn ohjata sekä hippoja, että pakenijoita, vai pitikö olla yksi ohjelma, joka ohjaa hippoja ja toinen, joka ohjaa pakenijoita?
Sama exe ohjaa kumpaakin! Eli tarvitsee vain yhden ohjelman.
Okei, sitten en ymmärrä mitä olen tehnyt väärin / olenko tehnyt väärin mitään. Ja Metabolix kertoo sitten, pistänkö mailia vai en..
Jos sen älyn "tilan" tarkistaminen siitä hippa.txt:stä on noin vaikeeta, niin mikset vain tarkista mini.txt:n ensimmäisen rivin 1. Merkistä, että onko se softa hyökkäävä vai puollustava?
Se toimii yhä edelleen ihan hyvin silleen kuin mä oon tehny sen. Halusin vain varmistaa, että se toimii lopullisessa testiohjelmassa.
Juhko kirjoitti:
Pitikö saman EXEn ohjata sekä hippoja
Kyllä, vain yksi ohjelma. Ja jos kerran käytät kieltä, jota voi kääntää Linuxillakin, niin yhtään EXEä ei onneksi tarvita, vaan lähettämäsi lähdekoodi käännetään suoraan Linux-ohjelmaksi.
Jos nyt kysymyksesi on se, mitä tapahtuu, jos molemmilla riveillä lukee "Jeppe", niin katsotaanpa nyt tarkemmin: Ensinnäkin säännöissä todetaan selvästi, että hippaäly menettää sen pistemäärän, jonka pakenijaäly saa. Tämän takia itseään vastaan pelaava äly saa ottelusta joka tapauksessa nolla pistettä riippumatta siitä, montako siirtoa se ehtii tehdä. Jos ohjelma kuitenkin haluaa pelaajiaan siirrellä, se voi aivan huoletta laskea joka kerta sekä hippojen että pakenijoiden liikkeet; testiohjelma jättää huomiotta rivit, joilla tekoäly yrittää ohjata vääriä pelaajia. Muuta hävittävää ei siis ole kuin ne ylimääräiset millisekunnit, jotka kuluvat "turhaan" laskentaan.
Mikäli älyjä pelautetaan itseään vastaan, niille voidaan tarvittaessa tehdä omat hippa.txt-tiedostot, joissa vastustajalla on valenimi.
Jos tekoälysi toimii annetulla testiohjelmalla, se toimii lopullisellakin, ja jos se ei toimi annetulla testiohjelmalla, se luultavasti ei toimi lopullisella. Toki voit lähettää postia kilpailuosoitteeseen, jos asiassa on yhä jotain epäselvää.
Minkäslaisia osallistujamäärämassoja tähän mennessä on lähettänyt ohjelmansa? :p Viikko aikaa.
User137 kirjoitti:
Minkäslaisia osallistujamäärämassoja tähän mennessä on lähettänyt ohjelmansa? :p Viikko aikaa.
Tähän mennessä kolme osallistujaa on lähettänyt tekoälynsä, ja lisäksi tein itse yksinkertaisen yritelmän. Toivon, että älyjä on vielä joitakin tulossa, mutta moni taitaa jättää ilmoittautumisensa viimeiseen päivään. Toisaalta aihekin on melko vaikea, jos aikoo hyvän tekoälyn saada. Tietenkin mukavinta olisi, että kaikki osallistuisivat, vaikka tuotos jäisikin kesken; osallistujia ei varmasti ole liikaa.
Itsellänikin on ollut sen verran kiirettä, että on jäänyt tuon hipan tekeminen ajatuksen tasolle. Katsotaan olisiko tuossa viikonloppuna aikaa tehdä joku kevyt versio suunnitelmista ihan vaan osallistumisen nimissä.
Metabolix kirjoitti:
Mikäli älyjä pelautetaan itseään vastaan, niille voidaan tarvittaessa tehdä omat hippa.txt-tiedostot, joissa vastustajalla on valenimi.
Lisäsin nyt testausohjelmaan ominaisuuden tätä varten. Jos "Jeppe" nyt pelaa itseään vastaan, tiedostossa näkyy hipalle nimet "Jeppe" ja "Veppe" ja vastaavasti pakenijalle "Veppe" ja "Jeppe". Älyn oikea nimi lukee siis vain yhdellä rivillä kerrallaan, jottei tilanne ole tekoälylle epäselvä.
Metabolix kirjoitti:
User137 kirjoitti:
Minkäslaisia osallistujamäärämassoja tähän mennessä on lähettänyt ohjelmansa? :p Viikko aikaa.
Tähän mennessä kolme osallistujaa on lähettänyt tekoälynsä, ja lisäksi tein itse yksinkertaisen yritelmän. Toivon, että älyjä on vielä joitakin tulossa, mutta moni taitaa jättää ilmoittautumisensa viimeiseen päivään. Toisaalta aihekin on melko vaikea, jos aikoo hyvän tekoälyn saada. Tietenkin mukavinta olisi, että kaikki osallistuisivat, vaikka tuotos jäisikin kesken; osallistujia ei varmasti ole liikaa.
3 verrattuna niihin massoihin jotka kinusivat kilpailua aikanaan, mutta toki viime hetkenilmoittautujia toivonmukaan riittää.
Itse lähetän älyni sitten, kun saan vielä viimeiset säädöt tehtyä siihen. Uskon, että osa osallistuvista lähettää vasta viimeisenä päivänä...
Lähetin nyt ne tiedostot, mutta .exe-tiedostot piti muuttaa .muu -tiedostoksi, koska exen lähettäminen on "turvallisuusriski". Pistin myös varuilta mukaan JeppeIV-tiedostot, jotka käyttävät väärää tapaa ohjelman tyypin (hippa/pakenija) tarkistamiseen. Ok?
Juhko kirjoitti:
JeppeIV-tiedostot, jotka käyttävät väärää tapaa ohjelman tyypin (hippa/pakenija) tarkistamiseen.
Niin käyttävät, siis aivan harvinaisen väärää. Miksei se oikea tapa riittänyt? Ja binaareja ei tosiaan tarvitse turhaan lähetellä, jos sopiva kääntäjä on listalla.
vehkis91 kirjoitti:
Itse lähetän älyni sitten, kun saan vielä viimeiset säädöt tehtyä siihen.
Kannattaa kuitenkin lähettää ajoissa, ettei myöhästy tai tule muita ikäviä yllätyksiä. Ehtiihän sitä sitten viilailla.
Nonni, nyt on äly lähetetty. :P
Metabolix > Tulihan ne oikeet (Jeppe.muu ja -bas) tiedostot kuiteski perille?
Juhko kirjoitti:
Metabolix > Tulihan ne oikeet (Jeppe.muu ja -bas) tiedostot kuiteski perille?
Tulivat. Osaat ilmeisesti lähettää sähköpostia, joten mikset saman tien myös lue sitä? ;)
Sääntösivu kirjoitti:
Viestin saapumisesta lähetetään vahvistus muutaman päivän kuluessa.
Pitäisiköhän tässä vielä jotain koittaa kisaan mukaan kehitellä. Mitään en oikeastaan vielä ole saanut aikaiseksi sitä varten. Innostus koko ohjelmointitouhua kohtaan on taas ollut hyvin kateissa. Jospa silti jonkunmoisen räpellyksen vielä yrittäisi saada kasaan.
Tänään on viimeinen kilpailupäivä, joten nyt on oiva hetki kirjoitella oma tekoäly valmiiksi ja lähettää se kilpailuosoitteeseen ennen kilpailuajan päättymistä eli viimeistään kello 21.21. Jokainen osallistuja on tervetullut kilpailuun!
Onkohan tullut lisää älyjä kilpailuun? :O
vehkis91 kirjoitti:
Onkohan tullut lisää älyjä kilpailuun? :O
Minä ainakin myönnän lähettäneeni omani tänään.
Juu, Metabolix sano äsken, et ois about 13 älyä tällähetkellä.
Edit:Määrä muuttui.
Edit2:Määrä muuttui.
Tekoäly lähetetty. Saa nähdä miten pärjää :)
Hippakilpailu on nyt päättynyt, ja seuraavaksi on virallisen turnauksen vuoro. Kilpailuun osallistui kaikkiaan 15 tekoälyä. Jos lähetit tekoälyn mutta se puuttuu seuraavasta listasta, ota yhteyttä mitä pikimmin! Perille tulleet tekoälyt ovat hihPah, hipake, Hipi1, Hippa2000, HIPPAI, HippaZizzo, Jeppe, jpa, Luster, meek, MonkeyBot, plussa, tunkki, u137 ja VehkAly.
:D
Nyt vaan venaan tuloksia... :P
testataanko noi siis miten noi tekoälyt? kun en oikein tajua, miten niitä kaikkia voi suorittaa keskenään samaan aikaan??
Edit: tarkoitan siis, että kun yhden älyn suorittaa, sehän vain liikkuu yksinään, niin miten ne kaikki menevät samassa suorituksessa?
Tommittaja kirjoitti:
testataanko noi siis miten noi tekoälyt?
Ohjelma testaa ne, ja aamulla tarkistan, onko sattunut virheitä.
Tilanne ei ole sen ihmeellisempi kuin lautapeli, jossa jokainen pelaaja saa vuorollaan heittää noppaa ja siirtää nappulaansa.
Tekoälyt toimivat selkeiden sääntöjen mukaan: ne käynnistyvät, lukevat tiedostonsa, laskevat, kirjoittavat päätöksensä ja sammuvat. Ei liene tarpeen mennä turnausohjelman yksityiskohtiin, mutta pääpiirteittäin se kuitenkin toimii kuin ihminen, joka käynnistelee vuorotellen tekoälyjä, katsoo, mitä siirtoja ne ovat tehneet, ja ottelun päätyttyä vaihtaa aina uuden alkutilanteen ja uudet tekoälyt. Vaikka ajatus onkin yksinkertainen, toimivan turnausohjelman tekeminen vei huomattavasti enemmän aikaa kuin oman hippatekoälyn ohjelmointi.
aijaa ne lukee vai ohjelmaa suorittaessa samasta tiedostosta sitä tietoa?
Öö, tarkoitatko niitä älyjä vai? Vai sitä softaa mikä ajaa niitä älyjä?
Vähän liian myöhästä kysellä kilpailun jälkeen kuinka ohjelma toimii. Säännöt oli pitkät mutta varsin selkeät:
https://www.ohjelmointiputka.net/kilpa.php?
"Ohjelma käynnistetään uudestaan jokaista siirtoa varten, ja sillä on joka kerta käytössään yksi sekunti prosessoriaikaa (ks. testiympäristö) ja enintään gigatavu muistia. Se saa lukea tiedostoja hippa.txt ja mini.txt ja kirjoittaa tiedostoon liike.txt."......
millonkas noi hippakilpailun tulokset saadaan tietoon?
Hippakilpailun tulokset on julkistettu.
Voittajaksi selviytyi Otto Seiskari tekoälyllään tunkki. Onnea voittajalle ja kiitokset kaikille osallistujille!
Ja erityiskiitos kuuluu Laurille, joka vastasi kaikista kilpailun järjestelyistä!
Ohhoh, enpä olisi arvannut Jeppeni pärjäävän noinkin hyvin! :P
Onnea voittajalle!! :D
Itse en osallistunut kilpailuun, koska kiinnostus älyn loppuun saattamisesta lopahti (ja tämä tympii). Haluaisin kuitenkin tuoda esille tavan, jolla toteutin älyäni, koska se eroaa kaikista muiden käyttämistä tavoista hyvinkin paljon.
Tavoitteeni oli tehdä tekoäly, joka käyttää neuroniverkkoa eli oppivaa matemaattista verkkoa, joka toimii lähes samalla logiikalla kuin ihmisaivot; satoja neuroneja(hermosoluja) kiinnittynyt tosiinsa synapseilla jne. Neuronit ovat jaettuna normaaleihin neuroneihin sekä syöte- ja tuloneuroneihin ja näiden välillä suoritetaan normaalia kertolaskua kunnes saadaan jokin tulos tuloneuroneihin. Sitten verkkoa opetetaan kertomalla sille kuinka sen tulisi käyttäytyä tietyissä tilanteissa ja toistojen jälkeen se oppii käyttäytymään oikein. En jaksa selittää nyt tästä enempää, joten lukekaa lisää googlesta, jos alkoi kiinnostaa.
Syötteenä toimi 4 lähimmän kaverin ja vastustajan sijainnin suhde sillä hetkellä käsiteltävään pelaajaan, sekä pelaajan etäisyys alueen seiniin. Tulosteena saatiin x ja y koordinaatein liikkuminen, joka sitten tulkittiin ja palautettiin. Älyn oli tarkoitus sisältää valmiiksi esiopetetut aivot sekä hipalle että pakenijalle, jotka ladattaisiin ensimmäisellä kerralla ja tallennettaisiin muisti.dat -tiedostoon. Seuraaville kerroilla äly lukisi aina muisti.dat-tiedostosta käytettävät aivot. Tämä siksi, että äly sisälsi myös joitain itseopetus algoritmeja, jotka mahdollistivat itseoppimisen pelin aikana. Algoritmeja oli mm. algoritmi, joka tarkkaili olisiko ollut mahdollista estää edellisellä kierroksella jokin menetys tai saada joku pakenija kiinni tekemällä toisin.
Älyä varten tein myös harjoitusohjelman, jonka avulla peliä pystyi seuraamaan graafisesti ja älyä pystyi myös opettamaan manuaalisesti.
Onnistuin tekemään toimivan koko pohjan tälle systeemille, mutta, kun sitä piti alkaa opettamaan, kiinnostus loppui.
Kirjoitin tämän viestin myös sen takia, että haluaisin että muisti.dat tiedosto mahdollisuus säilytettäisiin tulevaisuudessa juuri tämän tapaisten älyjen mahdollistamiseksi.
petrinm kirjoitti:
Tavoitteeni oli tehdä tekoäly, joka käyttää neuroniverkkoa — —
Suunnittelin tällaista tätä itsekin, mutta kilpailun järjestäminen ja muut asiat (työt ja loma) veivät niin paljon aikaa, etten jaksanut ruveta kehittämään aivoja.
petrinm kirjoitti:
Kirjoitin tämän viestin myös sen takia, että haluaisin että muisti.dat tiedosto mahdollisuus säilytettäisiin tulevaisuudessa juuri tämän tapaisten älyjen mahdollistamiseksi.
Kokeilun perusteella muistitiedostot kyllä pysyvät jatkossakin. Seuraavalla kerralla voisi sallia myös valmiiksi luodut muistitiedostot, jotka kopioidaan aina pelin alussa paikalleen. Kuvaamasi neuroverkkoälykin saisi siis ottaa omat aivot mukaan kilpailuun. ;) Voi olla, että jossain kilpailussa tekoäly saakin olla käynnissä ottelun alusta loppuun, jolloin erillistä muistitiedostoakaan ei tarvita.
Kaikki palaute kilpailun järjestelyistä on erittäin tervetullutta, jotta tulevista kilpailuista saadaan entistä parempia.
Oli kyllä hauska, että tällainen kilpailu jaksettiin taas järjestää, pointsit Metabolixille.
Mielestäni kilpailu poikkesi edellisistä merkittävimmin siten, että onglema jätti todella paljon liikkumavaraa ja mahdollisuuksia erilaisille toteutuksille. Tämä on sinänsä kyllä hauskaa, mutta ratkaisujen analysointi muuttuu todella vaikeaksi ja kisassa vaaditaan käytännössä aika paljon hyvää tuuria. Oma pakenijaälyni perustui aivan samaan metapallo/potentiaalikenttäideaan kuin usealla muullakin, mutta ilmeisesti maagiset vakiot osuivat paremmin kohdalleen.
Esimerkiksi väripelissä oli mielestäni aika selvää, millaisesta joukosta ratkaisua lähdetään etsimään ja simppelin, mutta kuitenkin jollain tapaa toimivan ratkaisun löytäminen oli todella helppoa. Tässä kisassa taas edes yhtään pätevän hipan koodaaminen ei ollut ihan niin simppeli ongelma. Myös hippapelin epäsymmetrinen luonne oli vähän kaksipiippuinen juttu. Turnauksen kannalta on tietty loogista, että molemmat tekoälyt piti tehdä, mutta hommaa on enemmän ja ainakin itselläni hippa ja pakenija toimivat täysin eri tavalla, joten hippana ja pakenija pelaaminen voisivat periaatteessa olla kaksi erillistä kilpailua.
Metabolix kirjoitti:
Seuraavalla kerralla voisi sallia myös valmiiksi luodut muistitiedostot, jotka kopioidaan aina pelin alussa paikalleen. Kuvaamasi neuroverkkoälykin saisi siis ottaa omat aivot mukaan kilpailuun. ;)
No eikö se nykyiselläänkin olisi onnistunut jos olisi vaan änkenyt valmiiksi opetetut aivot lähdekoodin oheen kääntymään osaksi ohjelmaa.
Erityisen mielenkiintosia pelejä tuli omalla testiohjelmalla kun laittoi 100x100 kartalla 1 hippa ja 99 pakenijaa. Sitä varten piti jo laittaa valinta hippa.txt kirjoittamisen lopettamiseen kun halusi ihan vain huvikseen pelata ne tuhannet kierrokset joita kiinniottoon meni, meni liian isoksi muuten se tiedosto. Mutta silti graafinen simulaattori saa massojen liikkeestä aika hupaisaa.
os kirjoitti:
Mielestäni kilpailu poikkesi edellisistä merkittävimmin siten, että onglema jätti todella paljon liikkumavaraa ja mahdollisuuksia erilaisille toteutuksille.
Jätän tarkkaa analysointia kaipaavat tehtävät ilomielin Datatähden tapaisiin kilpailuihin ja pyrin myös jatkossa näihin vapaamuotoisempiin tehtävänantoihin. Yhtä laaja kirjo toteutuksia oli varmasti ristinollakilpailussakin muinoin. Mielestäni näiden kilpailujen ensisijainen tarkoitus on motivoida monta ihmistä ohjelmoimaan ja ehkä opettaa jollekulle vielä jälkikäteen, millaisia konsteja tekoälyissä voi käyttää.
os kirjoitti:
Tässä kisassa taas edes yhtään pätevän hipan koodaaminen ei ollut ihan niin simppeli ongelma.
Eipä tosiaan. Yhtään erityisen "taitavaa" hippaa ei näkynyt. Jälkeen päin rupesin miettimään, olisiko ollut hyvä ratkaisu koota kaikki hipat yhdeksi rintamaksi ja ajaa pakenijoita järjestelmällisesti kulmaan. Tämäkään ei toki olisi ollut taitava tekniikka vaan vain toisenlainen "brute force".
os kirjoitti:
Turnauksen kannalta on tietty loogista, että molemmat tekoälyt piti tehdä, mutta hommaa on enemmän ja ainakin itselläni hippa ja pakenija toimivat täysin eri tavalla, joten hippana ja pakenija pelaaminen voisivat periaatteessa olla kaksi erillistä kilpailua.
Aivan totta, vaikkakin omassa älyssäni valtaosa koodista tuli käytettyä kahteen kertaan. Kunnollista kilpailua ei silti tahdo saada aikaan ilman vastustajaa, ja yksittäinen testivastustaja taas lisäisi sattuman osuutta kilpailussa (ja estäisi samalla järjestäjän oman osallistumisen).
Grez kirjoitti:
— — jos olisi vaan änkenyt valmiiksi opetetut aivot lähdekoodin oheen kääntymään osaksi ohjelmaa.
Kaikkea voi tehdä, mutta silti on aika rumaa tunkea satoja kilotavuja binaaridataa tekstimuodossa koodin sekaan.
User137 kirjoitti:
Erityisen mielenkiintosia pelejä tuli omalla testiohjelmalla kun laittoi 100x100 kartalla 1 hippa ja 99 pakenijaa.
Sellaisessa ottelussa ei vain ole mitään järkeä, koska yksi hippa ei voi koskaan saada järkevää pakenijaa kiinni: 2x2-ruudukossa H ja P voivat olla kulmittain, jolloin pakenija voi pysyä paikallaan, tai vierekkäin, jolloin pakenijan pitää liikkua siihen ruutuun, joka on hipasta katsoen kulmittain. Useamman hipan tapauksia en jaksanut tarkemmin pohtia, mutta intuitio sanoi, että kolmella saisi parhaankin pakenijan tilastollisesti lopulta kiinni, joten tein testitapaukset sen mukaan. :)
Metabolix kirjoitti:
User137 kirjoitti:
Erityisen mielenkiintosia pelejä tuli omalla testiohjelmalla kun laittoi 100x100 kartalla 1 hippa ja 99 pakenijaa.
Sellaisessa ottelussa ei vain ole mitään järkeä, koska yksi hippa ei voi koskaan saada järkevää pakenijaa kiinni: 2x2-ruudukossa H ja P voivat olla kulmittain, jolloin pakenija voi pysyä paikallaan, tai vierekkäin, jolloin pakenijan pitää liikkua siihen ruutuun, joka on hipasta katsoen kulmittain. Useamman hipan tapauksia en jaksanut tarkemmin pohtia, mutta intuitio sanoi, että kolmella saisi parhaankin pakenijan tilastollisesti lopulta kiinni, joten tein testitapaukset sen mukaan. :)
Itse päättelin, että kaksi hippaa riittää tilastollisesti. Kolmelle hipalle voisi laskea jo absoluuttisen ylärajan siirtomäärästä, joka kuluu ahdistettaessa yksi pakenija nurkkaan. Neljällä hipalla voi taas saada pakenijan kiinni varmasti pelkän seinän avulla ja viidellä hipalla keskellä kenttää. Tällaisia laskelmia voisi taas tehdä lisää useaa pakenijaa yhtäaikaa jahtaaville ryhmille. Aluksi tarkoitukseni oli toteuttaa hippa juuri kovakoodaamalla valmiiksi itse mietityt toimintaohjeet muutamalle erikokoiselle "kaappariryhmälle". Ongelmaksi olisi tällöin jäänyt vain hippojen ja pakenijoiden jakaminen tällaisiin ryhmiin optimaalisella tavalla. Jokaiselle ryhmälle voidaan laskea arvioita siitä, kuinka kauan kohteen kiinniottaminen kestää ja tämän jälkeen voidaan arvioida loppupelin kestoa vaikka vain hippojen ja pakenijoiden määrien avulla. Näin hippojen strategiasta olisi saatu algoritmiselta kannalta huomattavasti helpommin määritelty ongelma.
Lopullinen älyni perustui tällaisten ryhmien muodostuksen "automatisointiin" sillä idealla, että jokainen hippa pystyy varmasti pitämään mielivaltaisen pakenijan yhden pysty- tai vaakasuoran linjan samalla puolella. Jos samaa pakenijaa uhkaa useampi hippa eri linjoilta, pystyy joku hipoista tietyssä vaiheessa siirtämään linjaansa lähemmäksi pakenijaa, jolloin pakenija joutuu lopulta seinän tai hippojen välittömään läheisyyteen. Dedikoidusti tiettyä pakenijaa jahtaavan hipan mahdollisia järkeviä siirtoja voi muutenkin helposti rajoittaa pelkästään kohteen ja jahtaajan koordinaattierojen mukaan, jolloin jäljelle jäävien koko ryhmän siirtoyhdistelmien (ainakin yhden siirron päähän) läpikäynti alkaa olla mahdollista.
Tässä kisassa korostui myös aika lailla tuo monen pakenijan kontrolloiminen isolla massalla hippoja, mikä taas on vähän erilainen ongelma ja jäi omassakin toteutuksessani muutaman muun asian tavoin näin jälkeenpäin mietittynä vähän turhan vähälle huomiolle.
petrinm kirjoitti:
- - käyttäytymään oikein. En jaksa selittää nyt tästä enempää, joten lukekaa lisää googlesta, jos alkoi kiinnostaa.
Löytyykö aiheesta esimerkkejä suomenkielellä?
Kiitokset Metabolixille kisan järjestämisestä minunkin puolestani, vaikka en kisaan lopulta osallistunutkaan. Hienoa, että joku jaksaa järjestää.
Tuli mieleen ajatus liittyen näihin kilpailuihin, joten heitämpä sen tässä ilmaan, kun sivuaa aihetta. Mietin, että olisiko ideaa jossain kilpailussa järjestää jopa useampi kierros, jos vaan kilpailun luonteeseen sopisi. Tällöin tämänkin kaltaisessa kilpailussa saisi tietoa siitä, miten oma tuotos toimii ja sitä voisi vielä koittaa parantaa välikierrosten tuloksien perusteella. Ensimmäisen kierroksen jälkeen (jos olisi kaksi kierrosta) olisi sitten vain esim. viikko aikaa ennen lopullista kierrosta. En tiedä onko tuollaista ollut, toimisiko tuo tai olisiko siinä edes järkeä. Kunhan vain tuli mieleen.
Tuohan on ihan hyvä idea. :D
Mukava tosiaan nähdä, että mielenkiintoisia kilpailuja järjestetään. Kiitos Metabolixille ja onnittelut voittajalle. Aikeissa oli osallistua, mutta muut kiireet veivät liikaa aikaa ja energiaa.
Sen verran olin miettinyt, että olisin käyttänyt kahta hippaa per pakenija. Kumpikin olisi pyrkinyt pakenijan viereen x- ja y-suunnissa mutteivät olisi heti pyrkineet samaan ruutuun, jottei pakenija pääse pitkälle karkumatkalle juoksemalla läpi. Todennäköisemmin pakenija etenee poispäin, joten seuraavalla vuorolla taas pyrittäisiin noihin viereisiin ruutuihin. Hippa yrittäisi siirtyä samaan ruutuun paikoillaan pysyvän pakenijan kanssa hetken odottelun jälkeen. Odotteluaika pienenisi muistitiedoston avulla, jos huomattaisiin etteivät pakenijat yrittäisi juosta hipasta läpi (esim. ollessaan nurkassa).
Pakenijatekoälyssä olisin käyttänyt hajaantumista ja myöhemmin läpijuoksun yrittämistä ollessani umpikujassa. Siinäkin muistitiedosto olisi ollut apuna läpijuoksun ajoittamisessa ja suunnan valinnassa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.