Önálló labor dokumentáció Emocionális ágensek szimulációja Dűne MAS Sziroczák Richárd
[email protected]
Konzulens: dr. Dobrowiecki Tadeusz
A végleges program letölthető az alábbi címről: http://aigroup.mit.bme.hu/node/265 Tartalom: A feladat célja, alapok Specifikáció Implementálás, használati utasítás Ágens fejlesztőknek Dokumentáció A feladat célja Létezik az emberek világában egy olyan fogalom, hogy emocionális állapot. Ennek a felderítését, megmagyarázását, összefüggéseinek feltérképezését a téma szakembereire bízzuk. A mi szempontunkból a hatásai fontosak. Egy ember emocionális állapota “látható”, “érezhető” más emberek számára. Ez az érzékelés nagyságrendekkel gyorsabb, mint az emberi élőszavas kommunikáció. Ránézésre megállapíthatjuk valakiről, hogy ő frusztrált, boldog vagy mérges. Ezzel a mi hozzáállásunk megváltozik az adott egyénhez. Egészen máshogy kommunikálunk, egyes témákat fel sem hozunk, ha úgy érezzük nem helyén való a másik ember állapotát szem előtt tartva. Megemlítendő még az, hogy leginkább a saját állapotunk befolyásol minket. Nem végezzük el a feladatot, mert fáradtak vagyunk, kapkodunk, mert idegesek vagyunk, elröpül az idő, ha az ember jókedvvel teszi a dolgát. Sok minden beleérthető az emocionális ágensek, gépek témakörébe. Le kell szögezni, hogy nem cél “ember szimulátort” írni, aki nyűgös lesz a monoton, ismétlődő vagy veszélyes taszkok elvégzésekor. Mindenképpen hatékonyság, termelésnövekedést várunk el. Ennek egy fajtája, ha az emberrel képes hatékonyabban kommunikálni. Bár ez távlati cél lehet az iparban, mi nem ezzel fogunk foglalkozni. Mi csakis gép-gép kapcsolatban gondolkodunk. Gépek, ágensek közötti kommunikáció, gépekre, ágensekre jellemző emocionális állapotokkal, mely bár az emberi közösségből merít ötletet, gyökeresen különbözőnek kell lennie. Azt szeretnénk, ha az ágenseknek is lenne egy belső állapotuk, amely • Hatékonyabbá teheti a kommunikációt • Befolyásolhatja a belső döntéshozatalt • Mások állapotát tudjuk érzékelni Tehát kimondhatjuk, hogy az a célunk, hogy teszteljük, javít e egy ágensközösség teljesítményén egy ilyen emocionális rendszer bevezetése.
Specifikáció A cél érdekében készítünk egy ágens közösséget, mely egy feladaton dolgozik. Megvizsgáljuk, hogy az adott feladat elvégzésében milyen segítséget nyújt, ha az ágens
közösséget felruházunk egy emóciós rendszerrel. Ezért több ágensközösséget írunk, melyek eltérő rendszereket használnak. Keretprobléma Az ötlet már alapjában véve egy könyvből jött, amit olvastam. Frank Herbert: A Dűne című sci-fi novellájában megfest egy sivatag bolygót (Arrakis – Dűne), melyen egy Fűszer nevű anyagot takarítanak be, amin nagyjából az egész galaxis áll vagy bukik. Ezt a munkát épületnyi betakarító gépek végzik a sivatagban, a homokból leszűrve az értékes anyagot. A bolygón többek között élnek hatalmas, több kilométer nagyságú homokférgek, melyek például megeszik az óvatlan utazót a homokon és később fény derül a Fűszerrel való kapcsolatukra. Szeretném ezt a világot áthozni, alapnak tekinteni a feladat során. Azért is, mert egyrészt nagyon nagy hangulata van, ami jót tehet a munkamorálnak és érdekes lehet majd bemutatni a kész állapotot. Másrészt egy konkrét probléma, világ (még ha kitalált is), és nagyon sok feladatot gyorsan le lehet képezni innen oda vagy fordítva. A könyv, triologia, illetve egyéb részek nagyon jók, csak ajánlani tudom. http://en.wikipedia.org/wiki/Dune_(novel) Ennek a világnak a modelljét fogjuk szimulálni (JASON platformon). Azt vizsgáljuk különösképpen, hogy lehet megvalósítani másmilyen kommunikációt, metakommunikációt, illetve ezek mennyire válnak be. Ezen belül is egy emóciós modellt, mely nem emberi emóciók implementálása, hanem ebben a környezetben, erre a feladatra egy ágensek számára tervezett modell. Modell specifikációja Résztvevők Környezet, GUI, logger, Bázis ágens (Base), Betakarító ágens (Harvester), Homokféreg ágens (Sandworm) Környezet Számon tartja az ágensek pozícióját a térképen (X,Y). Más ágensekről, terepelemekről tájékoztatást ad minden körben mindenkinek (az adott szenzortávon belül). A térkép négyzetekre van osztva (0,0) pont a bal felső ÉNy sarok, a legtávolabbi csúcs a (100,100) jobb alsó DK. Minden négyzet egy területet reprezentál. Egy területnek nyolc szomszédja van. Egy mozgáspontért ezekbe lehet eljutni. Egy terület rendelkezhet tulajdonságokkal: • Alapértelmezett: sivatag (mindenki mozoghat rajta) A sivatagos területeken található fűszer. • Szilárd (Homokférgek nem mehetnek rajta) • Sziklás (Homokféreg és betakarító sem mehet rajta) Egy ágens egy területen tartózkodik, ha (X,Y) koordinátái ide mutatnak. Egy területen bármennyi ágens tartózkodhat. GUI Grafikusan nyomon követhetők az események.
Meg lesz jelenítve a térkép, a felosztott mezőkkel. Színkód alapján leolvasható lesz a területek tulajdonsága. Az egyes ágensek láthatóak és nyomon követhetőek lesznek. Egy kontrollal meg lehet majd állítani, újraindítani. Logger Plain textbe kiírja a futási eseményeket további analizálás céljából. Bázis ágens A bázis ágens feladata hogy felvásároljon fűszert és eladjon üzemanyagot mindenkinek, így fenntartva egy körforgást. Cserélni lehet vele, ha egy területen állnak. • Fűszert vesz fix áron (100 pénz/fűszer) • Üzemanyagot elad fix áron (1 pénz/üzemanyag) • Kapacitása, tankja végtelen • Helye, árlistája ismert mindenkinek • Sebessége nincs, nem változik. Paraméterek: • Helyzet (0,0 pont) Homokféreg ágens Feladata, hogy megegye a túlzottan vakmerő vagy csak az útjába kerülő ágenseket. • Csak sivatagban mozoghat • Random mozgást végez, ha nincs más célja • A betakarítót meg akarja enni, ha észleli. • Szenzor távolságban hallja a betakarítókat • Kommunikációs szenzor távolságban hallja a kommunikáló betakarítót • Sebessége van. • Nincs fogyasztása • Fűszert generál rá jellemző időnként. (ciklus) Paraméterek: • Helyzet (int,int) • Sebesség(int), szenzortáv(int) • Kommunikációs szenzortáv(int) • Fűszer generálás periódusideje (int) Betakarító ágens A feladat fő szereplője. Fűszert gyűjt, kikerüli a homokférgeket, kereskedik másokkal vagy a bázissal. Üzemanyagot kell vennie. Kommunikálnia és emóciókat figyelnie kell a hatékonyabb működésért. Cselekvéseit megválaszthatja, tervezheti. Fő cselekvések (egy órajelenként): • Mozgás. Minden megtett területváltásért üzemanyaggal fizet. Maximum a sebességnyi területet mehet. • Betakarítás. Ha olyan mezőn áll, ahol fűszer van, választhatja a betakarítás opciót. Ekkor nem mozog, viszont begyűjti a területről a fűszert a saját tárolójába. Egy mozgásnyi fogyasztást von le. • Árucsere más betakarítókkal vagy bázissal. Előtte meg kell egyezni, egy területen kell álljanak. Ekkor lerakhatnak árut a környezetbe és ha fel tudnak venni annyit, amennyit várnak cserébe, akkor elkönyvelik és megtörténik a csere.
Egyéb cselekvések (bármennyi egy körben): • Környezet észlelése (Megkapja érzetként) • Emóció észlelése (Megkapja érzetként) • Üzenet fogadása, kiértékelése • Üzenet küldése • Terv készítése, belső változók módosítása Paraméterek: • Helyzet (int,int) • Kapacitás - maximum fűszer teherbírás (int) • Üzemanyagtartály - maximum benzin teherbírás (int) • Fogyasztás - benzin/órajel/1 terület (double) • Sebesség – terület/órajel (int) • Szenzor távolság (int) • Feldolgozó képesség – fűszer/órajel (int) • Személyiség (hosszú távú emocionális állapot) Belső változók: • Aktuális fűszer • Aktuális benzin • Aktuális pénz • Aktuális rövid távú terv (primary goal) Emocionális állapot: “A” rendszer – Feladat specifikus 1. Féregjel (homokféreg közelsége) 2. Fűszerjel (fűszer közelsége) 3. Benzin kell 4. Fűszer kell “B” rendszer általános 1. Félelem (homokféreg közelsége, apadó tank) 2. Boldogság (tele tank, tele raktér, fűszer közelsége) 3. Együttműködési, kommunikációs szándék
Implementálás, használati útmutató map.java Használhatósági okokból írtam egy térkép és bemeneti paraméter generáló programot. Ennek a kimenete egy plain text file, amit az ágenskörnyezetnek adunk bemenetként. Útmutató: 1. Hozzunk létre egy kép filet (pl msPaint) Itt könnyedén megrajzolhatjuk pixelenként. 2. Ügyeljünk, hogy csak az alábbi színeket használjuk:
Reprezentáció Sivatag Sziklás Járhatatlan Fűszer (kevés 1-10) Fűszer (sok 5-15)
Szín (alapértelmezett msPint) Színkód (R, G, B) sárga 255,255,0 barna 128,128,0 fekete 0,0,0 piros 128,0,0 élénk piros 255,0,0
3. Mentsük el .gif formátumban. 4. Állítsuk be az alábbi paramétereket értelem szerint a programban int N=??; // map height – A kép magassága (pixel) int M=??; // map width – A kép szélessége (pixel) File Infile = new File("??.gif"); // Create in a image editor --ex. msPaint – Ide írjuk az imént elmentett képet elérési úttal. (ha nem írunk utat, akkor az adott direktoriban keresi) String Outfile = new String("??.txt"); // Output file. Rewrites old! – Írjuk ide a kimeneti file nevét 5. A térképet, az egyes ágensek statisztikáit kedvünk szerint módosítsuk egy szövegszerkesztőben, ügyelve arra, hogy a formázást ne bántsuk. DuneEnv.java Jason platformon implementáltam a környezetet. ( Jason egy shareware, java alapú multi ágens szimulációs platform. Az ágenseknél az AgentSpeak szabványt valósítja meg. További infók, letöltés: http://jason.sourceforge.net/ ) Fontos: állítsuk be a következő paramétereket. public static final int GSize = ??; – Térkép méret. public static final int AgentN = ??; – Ágensek száma public static final int SandwormN = ??; – Homokférgek száma public static final String Input ="??.txt"; – Input file. A környezet három részre tagolódik: Environment: Az ágensekkel való kommunikációért felelős réteg. Nagy mértékben a Jason utaításkészletét használja. Model: Tulajdonképpen egy adatbáis és logika. Paraméterek beolvasása itt történik View: A létező GridWorldViewet egészítettem ki megfelelő funkciókkal, hogy a megjelenítést megoldjam dune.mas2j Futtatható file. Itt adjuk meg a résztvevő ágenseket. Használati utasítás a kommentben. harvesterX.asl
Ilyen névvel találhatók meg az AgentSpeak nyelven írt ágensek. X a sorszám.
Ágens fejlesztőknek Ez a fejezet azoknak szól, akik felveszik a fonalat és hasznosítanák a rendszert. Az ágenseket nevezzük a harvesterX.asl konvencióval. Növekvő folyamatos sorrendben 0..K, K+1..N legyenek a gyűjtögetők, majd a homokférgek. Ezt a mas2j fájlban is rögzíteni kell. El kell készíteni a bemeneti filet, itt adhatunk statisztikákat az ágenseink. A környezeti osztályban be kell állítani a statikus változókat (bemeneti fájl, ágensek száma) a leírás szerint. Az ágens érzetek 1. Minden körben biztosan érkező érzetek •
pos (int ag, int x, int y) Az ágens azonosító száma és pozíciója.
•
emo (double em0, double em1, double em2...) Az ágens emocionális állapota az előző kör végén. Emlékeztető, lehet az ágens oldalon is tárolni.
•
newRandom (int c, int x, int y, int dx, int dy) Egy köteg random szám. Hasznos lehet felderítésnél, szituációk eldöntésénél. c, x, y nulla és 99 közötti számok. dx és dy -k és +k közötti számok, ahol k az adott ágens sebessége.
•
step (int n) A legutolsó érzet (hogy a többi már a tudásbázisban legyen addigra). Tipikusan e köré érdemes építeni a logikát. Minden lépésben egy jön, ez az órajel. n a számláló.
2. Esetfüggő érzetek •
fuelEmpty Kifogyott az üzemanyagtank. (Ez után megsemmisülés általában)
•
fuelCritical Kevés az üzemanyag (40% alatt)
•
spiceFull Tele a raktér.
•
spice (int x, int y, „aSee”) xy koordinátákban fűszert látunk.
•
rock (int x, int y, „aSee”) xy koordinátában sziklás területet látunk.
•
•
•
impassable (int x, int y, „aSee”) xy koordinátában áthatolhatatlan területet látunk. Megjegyzés. A sivatagot onnan tudjuk, hogy nem szikla és nem járhatatlan. Csak sivatagban lehet fűszer. agent (int id, int x, int y, double oem0, double oem1, double oem2...) xy koordinátában egy másik gyűjtögető ágenst látunk a megfelelő sorszámmal (id) és a következő emocionális állapottal. sandworm (int id, int x, int y) xy koordinátában egy homokférget látunk a megfelelő sorszámmal (id)
Az ágens cselekvésk listája •
move_towards (int x, int y, double speed, double em0, double em1, double em2...)* Mozogjon x,y pobt fele speed sebességgel. Ha speed nagyobb, mint az ágens maximális sebessége, akkor csak az utóbbival fog haladni.
•
stay (double em0, double em1, double em2...)* A kör kihagyása, nem megyünk sehova. Üzenetváltásnál pl ezt érdemes, hogy ne hagyják el egymás hatótávját.
•
harvest (double em0, double em1, double em2...)* Az elfoglalt területről betakarít. Csak akkor hatásos, ha van fűszer a mezőn. Ha több ágens van a mezőn, a beérkezési sorrend dönt. 1*fogyasztás az ára.
•
tradeBase Kereskedelem a bázissal. A fűszert eladja, üzemanyagot vesz. A profitot megkapja pénznek. Csakis itt lemehet negatívba a pénze (kölcsön).
•
destroyed Az ágens megsemmisül, és újraépítik a bázison. Rakterét elveszti, kap egy tele tankot. -1000 hasznossággal büntetjük ezt.
•
ask_random Ha valamilyen szempontból még véletlen számra, vagy újrainicializálásra van szükség.
Minden stepre kötelező egy akciót választani. Ha nem választunk, a környezet nem megy tovább (deadlock! Legalább egy stay legyen) Ha többet választunk, csak az első kérül kiértékelésre. Az ágenseknek kötelezően megvalósítandó viselkedések +step(_) : fuelEmpty <- destroyed. És +step(_) : sandworm(_,X,Y) & pos(_,X,Y) <- destroyed. Erősen ajánlott továbbá, a legvégére betenni, hogy elkerüljük az egész környezet blokkolását. +step(_) : true <- stay.
Az emóciókat a *jelölt feladatoknál lehet megadni. Ezt abszolút skálán kell megadni, tehát nem csak a változást. (Tipikusan Régi_érték + változás ) Ha [0,100] kívülre kerül az új érték akkor normálva lesz. Ha nem adjuk meg, nem változik az állapotunk. A többi funkcionalitást már a tervezőnek kell megoldania. Tekintsék meg a kész ágenseket, jó kiinduló pont lehet. Egy ágens hasznossága a betakarított fűszer * 100 – az elfogyasztott üzemanyag. (Ezt a money változóban tároljuk) Újraszámítódik, ha az ágens sikeresen visszatér a bázisra. Ha egymással kereskednek ott pénz is gazdát cserél, így adva értelmet a hasznosságnak itt.
Dokumentáció A kész program működőképes és még sok irányba továbbfejleszthető. Egy gyors áttekintés a specifikációban megfogalmazott célokról. Sikeresen megvalósított funkcionalitások: • Bemenet template készítő segédprogram • Text editorral változtatható bemeneti fájl, programot módosítani, újrafordítani ne kelljen • Grafikus felület, melyen nyomon követhető, áttekinthető a futás • Naplózó, melyen láthatunk minden fontos eseményt, visszakereshetünk • A probléma modelljének megvalósítása (fogyasztás, fűszergyűjtés, féreg nem mehet sziklára stb.) • Emocionális állapotok bevezetése • Homokféreg ágens, bázis megírása • Több ágenscsoport írása, tesztelése • Ezeken emocionális modell tesztelése További fejlesztési lehetőségek, melyek még nem valósultak meg: • Ágensek szigorúbb szinkronizálása (soros léptetés. N+1 ágens csakis N után jöhet) • Kereskedelem más ágensekkel • Jobb útkereső algoritmus (a járhatatlan területek hatékonyabb kikerülésére) Az elkészített ágensekkel működés közben figyelhetünk meg egy multi ágens rendszert, mely implementál egy emocionális modellt. Összefoglalva egy eléggé jó környezetet sikerült létrehozni, amellyel sokféle ágens szervezetet lehet tesztelni. Egy belső állapota lehet az ágenseknek, amely segítheti, befolyásolhatja a belső döntéshozatali rendszerüket. Ezt az állapotot a szenzortávukon belül leolvashatják a többi ágensről. A környezeti osztály segíti, amely másolatot tárol ezekről az állapotokról, majd érzet formájában küldi az ágenseknek. A környezeti osztályban beállíthatjuk az emocionális állapot dimenzióinak számát, és ezek után az ágensekben 0,1,2.. alapján hivatkozhatunk rájuk. Így a jelentést az ágensek a környezettől függetlenül képesek megfogalmazni, több különböző rendszer is futhat a környezet módosítása nélkül. Ez fontos szempont volt a tervezésnél.
Egy konkrét rendszert létrehoztam, mely három dimenzióból állt: • Félelem – A homokféreg és a félő ágensek váltják ki. • Boldogság – A fűszer látványa, betakarítása, tele raktér és tele tank váltja ki. • Kooperációs hajlam – Abban az esetben, ha bajban vagyunk vagy tanácstalanul felderítünk, megnő ez a szám. Ha kéznél lévő dolgunk van, csökken. Felhasználva ezeket a plusz információkat egymásról, és a saját hosszú távú állapotról jobb döntést tudtunk hozni bizonyos helyeken. Határozott fejlődést láttam az ágens szervezet teljesítményében. A két legmarkánsabb terület a homokféreg elől menekülés, és a felderítésnél mutatkozott meg. Összességében ki kell jelenteni, hogy az emocionális modell használható, képes a hatékonyságot növelni, ezért a jövő kutatási irányai között lehet. Megvalósítása is lehetséges, például ebben a szimulációban, egy féléves tanulói munkához és egy PC teljesítményéhez mérten. Így bizonyosságot szereztünk az elméletünk helyességének ezen a gyakorlati példán keresztül.