A játék

Az AgentGame a Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Karán a Mérnök informatikus BSc hallgatók számára a Méréstechnika és Információs Rendszerek Tanszék által tartott Mesterséges Intelligencia tárgy fakultatív házi feladata.

Az játék célja a hallgatók számára versenyzési, megmérettetési lehetőséget teremteni az előadáson elhangzott, illetve ahhoz egyéb forrásból összegyűjtött ismerek alapján létrehozott ágensek versengése által. Az AgentGame a Jason keretrendszeren belül definiál egy világot, mely világban egyszerre két hallgató ágensei által alkotott két csapat mérkőzik egymással.

A küzdelem akkor ér véget, ha (1) lejár a megadott időkeret vagy (2) kizárólag egy hallgató ágensei maradnak életképes állapotban. Az (1) esetben a mérkőzés végén összesítjük a csapatok energiáját. Az a hallgató nyer, akinek a csapata jelentősen nagyobb energiával rendelkezik. A mérkőzés döntetlen, ha a két csapat energiája a csapatok végső energia átlagának +-10%-os környezetén belül van. A győzelem az összesített versenyben 3, a döntetlen 1 pontot ér.A (2) esetben az a hallgató nyer, akinek életképes ágensei maradtak a versenyben. Életképtelennek azt az ágenst tekintjük, amelyiknek nincs elég energiája legalább egy lépés megtételéhez.

Egy hallgató legfeljebb 3 csapattal nevezhet. A versenyben részvétel feltétele, hogy a keretrendszerrel együtt kiadott Simple.asl ágenst a hallgató ágense képes legyen legyőzni. Az ilyen módon kvalifikált hallgatók minden más résztvevővel mérkőznek. A mérkőzések a tanszéki Mesterséges Intelligencia Laboratóriumban kerülnek megrendezésre egy előre meghirdetett időpontban. A pontos helyszínről és időpontról a nevező hallgatók külön értesítést kapnak. beadó rendszerben automatikusan futnak le. A mérkőzések eredményéről mindkét résztvevő értesül: , illetve a személyes beállításaiknak megfelelően további információkat is kaphatnak (játékmenet grafikon vagy akár visszajátszható játéknapló), ha ezek megosztásához mindketten hozzájárultak. a csapataik végső pontszáma mellett látják a pontok alakulását grafikonon, letölthetik ezeket az adatokat CSV formátumban, illetve a szimulátor szöveges kimeneteit is megtekinthetik. A végső eredmény a páros küzdelmek során kapott pontok összesítése alapján alakul ki.

A feladatok leadási határideje 2010. november 28. 23:59
A beadás módja: e-mailben az eredics [kukac] mit [pont] bme [pont] hu címre.

A feladatok beadási határideje: 2011. január 2. 23:59.
A beadás módja: a honlapon regisztrációt követően a beadó rendszeren keresztül a határidőig tetszőleges számú verzió beadható, melyek automatikusan megmérkőznek egymással az eredmények pedig szintén a beadó rendszerben láthatóak.

A verseny lezárulta után az eredményeket ünnepélyes keretek között hirdetjük majd ki. A díjazásról és a kiírt különdíjról itt található további információ.

Az AgentGame világának statikus elemei

A pálya: A játék egy rögzített, 50x50 cella méretű világban zajlik.

A cellák: A cellák tartalmazhatnak ennivalót és/vagy ágenst. Egy cellában egyszerre legfeljebb egy ennivaló lehet. Egy cellában egyszerre csak egy csapatba tartozó ágensek tartózkodhatnak - tehát a csapat tagjai egymásra rá tudnak lépni, idegen ágensekre azonban nem.

Az ennivaló: Az ennivaló a pályán véletlenszerű helyeken jelenik meg. Értéke határozza meg, hogy mennyit ad hozzá az őt elfogyasztó ágens energiájához. A játék kezdetén fix számú (4), de egymástól eltérő, egyenként véletlen (100-800 között kisorsolt) értékű ennivalót tartalmazó cella kerül kijelölésre. Ha egy ágens megeszi az egyik cellában található ennivalót, akkor a pálya véletlen pontján elhelyezkedő üres cellában új ennivaló jön létre a korábbitól független, újra sorsolt véletlen értékkel.
Az ágensek állapota és érzékelése

A játékban egyszerre két hallgató ágensei vesznek részt - ezek hallgatónként alkotnak egy-egy csapatot. Hallgatónként 2-5 ágens regisztrálható a rendszerben, az ágensek száma a játék során nem változik.

A játék kezdete

A játék kezdetén minden csapat összesen 20000 egység energiával rendelkezik, mely energia a csapattagok között egyenletesen kerül felosztásra - a nagyobb létszámú csapatok tehát egyenként gyengébb ágensekkel jönnek létre. A játék kezdetén a csapatok a pálya két átellenes sarkából indulnak.
Az ágensek energiája

Minden ágens rendelkezik egy nemnegatív egész értékű energiával. A legtöbb cselekvés (lásd később) energiát használ, míg az ennivaló elfogyasztása által energia nyerhető. Amennyiben egy ágens energiája nem elég egy adott cselekvés végrehajtására, akkor az adott cselekvést nem tudja végrehajtani. Ha az ágens energiája egyetlen cselekvésre sem elegendő, akkor mindaddig képtelen bármit is tenni, amíg a csapat egy másik ágensétől energiát nem kap.

A játék célja

A cél a játék, hogy az ágensek a játék végéig (20000 kör, ahol minden körben minden ágens pontosan egy cselekvést hajthat végre) életben maradjanak, és a játék végén a csapat összesített energiája a lehető legmagasabb legyen.

Az ágensek állapota

Az ágensek állapotát a következő változók írják le egyértelműen:

  • az ágens pozíciója: x és y koordináta a rácson: mypos(X,Y)
  • az ágens látási orientációja (0 = fel; 1 = jobb; 2 = le; 3 = bal): mydir(Dir)
  • az ágens energiája (nem negatív egész érték): myenergy(Energy)

Az ágensek érzékelése

Az ágensek a körülöttük elterülő világ korlátos részét érzékelik: orientációjuk függvényében mindössze az előttük elterülő 90 fokos látószögű, 10 egység sugarú látómezőből származó objektumokról (ennivaló vagy másik ágens) értesülnek.

Érzékelt körümények:

  • Az érzékelt ennivaló food(Food) formában kérdezhető le, ahol a Food lista elemei:[Távolság_az_ágenstől,Ennivaló_értéke,X_koordináta,Y_koordináta] alakú további listák.
  • Az érzékelt ágensek az előbbiekhez hasonlóan az agent(Agents)érzékelésen keresztül érhetőek el, ahol az Agents [Távolság_az_ágenstől,ID,Csapat_ID,Ágens_energiája,X,Y,Orientáció] felépítésű listákat tartalmaz.
  • Az ágens tisztában van továbbá egy virtuális idővel a time(Time) érzékelésen keresztül, mely minden lépésben növekvő értéket tartalmaz.
  • Az ágens tisztában van azzal, hogy legutóbb melyik másik ágens támadta meg. Ez az információ kezdetben üres lista, az első támadást következően a következő alakú: lastattacker([Támado_ID, Támadó_X, Támadó_Y]. Ennek alapján az AgentSpeak segítségével igény szerint akár hosszabb memóriát is felépíthet az ágens.

Az ágensek cselekvései

Ezek közül az ágensnek minden körben pontosan egyet kell végrehajtania. Amennyiben az ágens nem kíván semmit tenni, akkor a wait cselekvés végrehajtásával várakozhat.

  • Várakozás - nincs költség - wait
    Az ágens az adott körben nem tesz semmit.
  • Forgás - 2 költség - turn(direction)
    Az ágens tetszőleges, a paraméterben megadott irányba fordulhat, mely fordulás költsége 2 egység energia. Az irányokat a rendszerben mindenhol a következő kódolás azonosítja: 0 = Észak; 1 = Kelet; 2 = Dél; 3 = Nyugat. A numerikus értékek mod 4 értelmeződnek, így tehát a 4 újra Északot jelent.
  • Lépés - 5 költség - move(direction)
    Az ágens kizárólag az X-Y tengelyekkel párhuzamosan mozoghat (átlós lépés nincs), és a mozgás irányát a paraméterben megadott irány határozza meg (tehát az ágens tud oldalazni és tolatni).
  • Evés - nincs költség - eat
    Az ágens elfogyaszthatja az aktuális tartózkodási cellájában található ennivalót. Ennek a műveletnek nincs költsége, sőt az adott cellán található ennivaló értékével növekszik az adott ágens energiája. Az ennivaló elfogyasztása két okból nem automatikus a cellára lépés után: (1) lehet, hogy az ágensnek sürgősebb teendője van a cellára lépés után - például megtámadni valakit; vagy (2) lehet, hogy az ágens a cellán található ennivalót egy másik csapattársa számára foglalja - lásd alább az energiaátadás művelet során fellépő veszteséget.
  • Energiaátadás - változó költség - transfer(target, amount)
    Az ágens tetszőleges csapattársa számára átadhat energiájából, az energiaátadásnak azonban van 5%-nyi vesztesége, vagyis a másik ágens csak ennyivel csökkentett energia nyereséget könyvelhet el a művelet után. Az energiaátadás feltétele, hogy a két ágens azonos cellán tartózkodjon, illetve az adó ágenssel szemben értelemszerű elvárás, hogy elég energiával rendelkezzen. A target paraméternek a célágens numerikus azonosítóját kell megadni (amit az ágens az agent érzékelésen keresztül lát).
  • Támadás - 300 költség a támadónak / 100 veszteség a támadottnak - attack(agentId)
    Az ágens jelentős energiaköltség árán képes rálőni tetszőleges másik ágensre, aki a látóterében tartózkodik. (A támadás elsődleges célja nem a megtámadott gyengítése - ahogy az a költségeken látszik, a támadónak több energiát kell a támadásra áldoznia, mint amennyit a megtámadott veszít -, hanem a másik ellökése, eltérítése céljától.) A megcélzott ágenst az agentId azonosítja, mely az ágens rendszeren belüli numerikus azonosítója (amit az ágens az agent érzékelésen keresztül lát). Amennyiben a támadó ágens energiában gyengébb a megtámadottnál, akkor a támadás sikertelen, a másik ágenssel nem történik semmi. A támadó természetesen ebben az esetben is elveszti a támadáshoz szükséges energiát. Ellenkező esetben, ha a támadó az erősebb, akkor a megtámadott ágens a támadás irányával ellentétes irányban 10 cellányi távolságra repül el. (Az ellökött ágens távolodásának irányát a különböző akadályok - más ágensek vagy a pálya széle - befolyásolhatják. A megtámadott ágens minden esetben értesül a támadója pozíciójáról, akkor is, ha az nem volt a látóterében korábban. A támadás során a megtámadott ágens is veszít 100 egység energiát.
  • Kommunikáció - nincs költség - .send(message)
    Az ágensek a csapaton belül szabadon megoszthatnak egymással tetszőleges tudást függetlenül az őket egymástól elválasztó távolságtól a beépített kommunikációs utasítások (.send, .broadcast, stb.) segítségével.
  • Név beállítás - nincs költség - setlabel(label)
    Az ágensek beállíthatják a grafikus felületen megjelenő azonosító 1-2 karakterüket. Induláskor az ágensek numerikus azonosítója jelenik meg a grafikus felületen, melyet az ágensek a setlabel paranccsal cserélhetnek le tetszőleges értékre. Ezáltal lehetőség nyílik a különböző (forráskódú fagy feladatkört betöltő) ágensek egyértelmű azonosítására a szimuláció során.