![]() |
![]() |
|||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
Tabuľka 1 – jednoduchý slovník Z tabuľky 1 napríklad zistíme, že pre význam obj1 existujú dve slová: PUA a LOPA, pričom slovo PUA bolo v jazykovej hre použité 20-krát, z toho 10-krát úspešne. 2.4.7.2 Neurónová sieť Aby sme mohli prejsť k zložitejším jazykom, akými sú
napríklad štrukturované jazyky, je potrebná aj zmena reprezentácie slovníka.
Asociačná tabuľka pre zložitejšie jazyky nepostačuje. Môžeme však k tejto
tabuľke priradiť iné pomocné mechanizmy, v ktorých by sme si pamätali štruktúru
jazyka. Jednou z ďalších možných reprezentácií sú neurónové siete [25,28,40,41]. V [28] boli na rozpoznávanie aj generovanie slov použité
rekurentné neurónové siete. Obrázok 13 – model jazykovej hry pomocou neurónových sietí Obrázok je uvedený v [28] Na [Obrázok 13 – model jazykovej hry pomocou neurónových sietí] je znázornený model jazykovej hry, ktorý bol použitý v [28]. Rozprávač dostal ako vstup význam. Významy mali v tomto experimente preddefinovanú štruktúru. Agent zvolený význam pomocou rekurentnej neurónovej siete zakódoval do reťazca, teda pomenoval ho. Ďalší agent – poslucháč dostal reťazec od rozprávača a ten dal ho na vstup svojej rekurentnej neurónovej siete. V poslucháčovi prebehne učenie jeho neurónovej siete, ktoré má za úlohu priblížiť rozpoznávanie reťazca, ktorý pomenúva význam k samotnému významu. V jazyku, ktorý si vytvoria rekurentné neurónové siete, zostane zachovaná štruktúra významov. [Obrázok 14 – vytvorené slovníky modelu s neurónovými sieťami] vľavo predstavuje vytvárané slová neurónovou sieťou na začiatku simulácie a vpravo po prebehnutí simulácie. V [28] sa po analýze jazyka, ktorý vznikol pomocou neurónových sietí, ukázalo, že v jazyku ostala zachovaná štruktúra, s akou boli vytvorené významy pre komunikáciu agentov.
Obrázok
14 – vytvorené slovníky modelu s neurónovými sieťami Obrázok je z [28] Jednoduchú analýzu jazyka vytvoreného neurónovými sieťami zobrazuje [Obrázok 15 – analýza jazyka neurónových sietí]. Z analýzy vidno, že neurónové siete používali pre niektoré štruktúry významu rovnaké pomenovania (sufixy).
Obrázok
15 – analýza jazyka neurónových sietí Významy boli skladané zo slov z prvého riadku a prvého stĺpca. Pre každý význam v tabuľke je analýza jeho pomenovania. [28] 2.4.8 Spoľahlivosť komunikácie agentov Pri experimentoch sa väčšinou neuvažuje strata alebo zašumenie komunikácie agentov pri jazykovej hre. Dôvodom býva jednoduchosť experimentu. Zašumenie komunikácie agentov je jednou zo zaujímavých vlastností systému a približuje experiment k reálnym podmienkam. Pod zašumením komunikácie sa najčastejšie rozumie zmena prenášanej informácie medzi agentmi, keď hrajú jazykovú hru. Mierny šum môže mať pozitívny prínos do dynamických systémov [13, 15]. Je zdrojom variácií tam, kde chýba genetická mutácia. Pri jazykových hrách sa ukázalo, že slovník emerguje aj v zašumenom prostredí, pri zašumení, ktoré predstavovalo až 10% komunikácie. Vzhľadom na tieto výsledky nie je až také nutné pri každom experimente používať v prostredí šum. Výsledky experimentov nebývajú veľmi rozdielne vzhľadom na kvalitu prenosu (samozrejme iba do určitej miery zašumenia). Dôležitou časťou experimentov sú výsledky a ich korektná interpretácia. Nastavovaním parametrov sa dajú získať rôzne výsledky pri rovnakých simuláciách. Jednou zo základných mier je percentuálna úspešnosť jazykových hier. Keďže jazykové hry prebiehajú v kolách a v jednom kole prebehne jedna jazyková hra (nemusí to byť ale pravidlo), treba sa pozerať na túto mieru po viacerých hrách, napr. 20. Tak sa dá získať percentuálna úspešnosť jazykových hier. Od veľkosti tohto okna bude závisieť, nakoľko presne budeme pozorovať výkyvy úspešnosti hier. Vysokú úspešnosť hier môžeme špecifikovať ako bod, keď má populácia agentov vytvorený spoločný slovník. Ale nemusí to byť pravda [7,31]. Treba si uvedomiť, že agent môže mať k jednému významu viac slov a fakt, že s iným agentom úspešne komunikuje, ešte neznamená že ich preferované slová sú rovnaké. To znamená, že i napriek vysokej miere úspešnosti hier, sa medzi agentmi nemusel vytvoriť rovnaký slovník. 2.5.2 Koherencia a lokálna koherencia Koherencia [31] je mierou, podľa ktorej môžeme povedať, či existuje medzi agentmi rovnaký jazyk – jednotný slovník. Koherencia je tým väčšia, čím viac agentov používa tie isté slová pre významy. Preferované slová významov sa stávajú globálne v populácii agentov. Koherenciu počítame tak, že pre každý význam vyberieme jeho najpreferovanejšie slovo spomedzi všetkých agentov a vyjadríme percentuálne zastúpenie tohto slova pre daný význam spomedzi ostatných slov. Takto dostaneme koherenciu pre jeden význam. Z priemeru všetkých koherencií pre jednotlivé významy dostaneme celkovú koherenciu. Dôležitá miera podobná koherencii je lokálna koherencia. Pri priestorových experimentoch a lokálnych jazykových hrách, sa vytvárajú slovníky v malých komunitách, podľa rozloženia agentov v priestore. V takomto prípade je globálna koherencia veľmi nízka, ale lokálne koherencie pre jednotlivé skupiny sú vysoké. Taktiež úspešnosť hier môže byť vysoká. Agenty sa prispôsobia s viacjazyčnými slovníkmi (bilingvalizmus), ktoré obsahujú preferované slová v rámci komunity a slová, ktoré sa používajú pri dorozumievaní sa s agentom z inej komunity. V [7] bola použitá miera na sledovanie zhody slovníkov
medzi skupinami agentov. V prípade, keď sa vytvárajú skupinky s vlastnými
jazykmi, táto miera bola použitá na zistenie podobnosti slovníkov dvoch skupín.
Podobnosť bola určovaná medzi dvoma skupinami a zisťovala, koľko preferovaných
slov prvej skupiny sa vyskytuje u druhej skupiny a naopak. Koherencia by mohla nastať aj v prípade, keď sa pre každý význam používa jedno slovo. Na sledovanie takéhoto správania sa používa miera špecifity [26] slovníka. Táto miera určuje rozmanitosť používaných slov pre jednotlivé významy. Keď pre každý význam existuje iné slovo, špecificita je 1 (alebo 100%). Špecificita sa dá vyjadriť ako jednoduchý pomer počtu preferovaných slov a počtu významov. Pre každý agent môžeme spočítať jeho špecificitu slovníka. Priemer zo všetkých mier špecificity slovníkov je globálna špecificita. Neistota klasifikovania [26] je veľmi podobná koherencii. Sleduje, s akou pravdepodobnosťou bude agent v jazykovej hre úspešný pre daný význam. Miera vyjadruje, koľko iných agentov používa rovnaké slová. Keď je koherencia 1, neistota klasifikovania je 0; sú to doplňujúce sa pravdepodobnosti. Táto miera má však zmysel skôr lokálny než globálny. Popri samotných výsledkoch experimentu je dôležité vedieť, za akých nastavení daný experiment prebiehal. Pri simuláciách s rôznymi nastaveniami parametrov sa získavajú poznatky o závislosti výsledkov na parametroch a tiež o závislosti nastavení iných parametrov, aby bol experiment úspešný. Táto kapitola popisuje iba niektoré základné parametre z definície 1 a z jednoduchých experimentov. 2.6.1 Obmedzenie slov slovníka Tento parameter určuje, koľko slov si agent môže zapamätať. Pri niektorých simuláciách je potrebný aj parameter pre minimálny počet slov v slovníku. Kapacita slovníka ovplyvňuje výsledný jazyk agentov. Ak je slov veľmi málo (menej než významov), v slovníku sa vytvoria homonymá. Pri veľkom počte možných slov narastá čas konvergencie globálneho slovníka. Počet krokov simulácie je dôležitý pre jej úspešnosť. Tento parameter závisí napríklad na počte agentov v prostredí. Keďže sa v každom kroku udeje jedna jazyková hra, s narastajúcim počtom agentov je nutné robiť veľa krokov simulácií, aby sa dostavili požadované výsledky. 2.6.3 Vytvorenie a absorpcia nového slova Ak agent pri jazykovej hre nemá, resp. nepozná použité slovo pre význam, môže si ho vytvoriť podľa pravdepodobnosti vytvárania slov, resp. prijať ho za svoje podľa pravdepodobnosti absorpcie slov. Pokiaľ sú oba parametre nízke, potrvá dlhšie, kým si agenty vyrobia slovníky. Ak je nízka iba pravdepodobnosť pre vytváranie nových slov, budú slovníky agentov oveľa viac podobné, lebo agenty budú mať tendenciu slová radšej prijať, než si vytvoriť nové. Ak je nízka pravdepodobnosť prijatia slov, spoločný slovník sa bude vytvárať ťažko a pomaly, lebo agenty nebudú mať tendenciu prijať cudzie slová. Ak počas simulácie vstupujú agenty do prostredia a začleňujú sa do jazykovej hry, treba počítať so spomalením vytvárania globálneho jazyka. Každý nový agent má prázdny slovník, preto je komunikácia s ním spočiatku neúspešná a taktiež to negatívne prispieva ku globálnej koherencii. Pravdepodobnosť vstupu agenta určuje možný prírastok v každom kroku simulácie. Ak agenty pribúdajú rýchlo, možnosť na vytvorenie spoločného slovníka klesá. Naopak, pri pomalom pribúdaní agentov sa nové agenty stihnú prispôsobiť existujúcej komunite a tak prispieť do formovania globálneho jazyka. Pri odchode agenta je situácia trochu iná ako pri príchode, ale nie celkom opačná. Odchod agenta môže mať pozitívny vplyv na vytvorenie spoločného slovníka, keď patril medzi agenty, ktoré nepoužívali iba preferované slová – slová podľa globálneho slovníka. V prípade, že odíde agent, ktorý prispieval na formovanie globálneho jazyka v plnej miere a jeho slovník bol s globálnym rovnaký (čo sa preferovaných slov týka), spomalí to formovanie globálneho slovníka. Menší počet agentov však na druhej strane urýchli proces formovania tohto slovníka. Táto kapitola opisujeme nami vytvorený program ELGE – jeho komponenty, štruktúru, beh. Vysvetľujeme, ako fungujú hlavné časti programu, ako sa v ňom dá realizovať experiment a tiež ako je možné program rozšíriť pre ďalšie experimenty. Kapitola netvorí referenčnú príručku programu, predstavuje skôr rýchleho sprievodcu v oboznamovaní sa s programom a vo vytváraní experimentov. Podrobná príručka je[1] k dispozícii priamo s programom. Pri experimentoch s agentmi, ktoré hrajú jazykové hry, sa dá postupovať rýchlo dopredu a je potrebné takémuto postupu prispôsobiť aj prostredie. Dobré prostredie by malo poskytovať veľkú variabilnosť a nastaviteľnosť experimentu na užívateľskej úrovni, zároveň by malo byť dostatočne otvorené, by sa dalo jednoducho rozširovať aj programátorskými prostriedkami. Existujúce produkty, ktoré boli priamo vytvorené na experimenty s jazykovými hrami, nie sú verejne dostupné. Dostupné existujúce prostredia zas nevyhovujú celkom našim potrebám. Preto jedným z cieľov tejto diplomovej práce bolo navrhnúť a naprogramovať prostredie s vyššie uvedenými vlastnosťami, ktoré bude slúžiť ako nástroj na realizáciu experimentov s jazykovými hrami. Z inštitútu Sony Computer Science Laboratory Paris, priamo od priekopníkov experimentov s jazykovými hrami pochádza asi jedno z prvých prostredí nazývané BABEL. Hoci sa nám podarilo nadviazať internetovú komunikáciu priamo s autorom prostredia Angusom McIntyre [16], nedostali sme uvedené prostredie k dispozícii. Toto prostredie je napísané v programovacom jazyku LISP. Ako alternatíva k BABELu vzniklo ďalšie prostredie LEMMinS, ktoré bolo implementované v programovacom jazyku Java. LEMMinS pochádza z laboratória vo Francúzsku, Laboratoire Dynamique Du Langage – Université Lumière Lyon 2. Žiaľ, ani k tomuto prostrediu sme sa nedostali. Iné simulačné prostredia ako RePast [18], Swarm [19] a AScape [20] sú navzájom veľmi podobné. Umožňujú robiť ľubovoľné multi–agentové simulácie. RePast a Swarm sú open source projekty, pričom RePast a AScape sú vytvorené v Jave, Swarm v C++. Veľkou nevýhodou týchto prostredí je, že žiadne z nich neumožňuje uložiť simuláciu v ľubovoľnom simulačnom kroku a neskôr si ju z uložených dát nahrať a pokračovať v nej. Taktiež modely vytvorené v týchto prostrediach sú málo nastaviteľné, napríklad pridávanie a odoberanie agentov z modelu sa nedá realizovať jednoducho a väčšinou musí byť zakomponované priamo v modeli. V našom programe sme sa snažili uvedené nedostatky odstrániť. Prostredie sa skladá z troch samostatných častí, ktoré medzi sebou spolupracujú a z jednej hlavnej riadiacej časti.
Obrázok 16 – základná štruktúra prostredia Základné tri časti prostredia sú svet, monitorovanie a užívateľské rozhranie. Všetky zastrešuje hlavná riadiaca časť. Každá časť má svoju úlohu a je čo najviac oddelená od ostatných častí. Svet je jadrom samotnej simulácie. Zahŕňa v sebe agenty, ktoré sa počas simulácie dostávajú k slovu. Jednotlivé agenty sú oživované v postupnosti, ktorá závisí od implementácie a nastavení parametrov sveta. Svet spolu s agentmi a ich obsahom tvorí stavový priestor. Jednotlivé kroky simulácií sa dajú vyjadriť presným stavom sveta a jeho komponentov. Monitorovanie slúži na získavanie údajov z prostredia. Systém monitorovania sa skladá z troch samostatných častí: monitorov, grafov a ukladača. Ukladač má na starosti samotné uloženie dát. Podľa jeho implementácie sa dáta môžu ukladať do súborov, databáz a pod. Ukladač zodpovedá za to, ako sa majú dáta ukladať. Aké dáta sa majú ukladať, definujú monitory. Monitory sme navrhli ako samostatné prvky prostredia (čo najviac nezávislé od sveta), čím sme docielili vyššiu univerzálnosť prostredia. Monitory sú znovupoužiteľné, dajú sa použiť vo všetkých experimentoch, pri ktorých sa sleduje rovnaký obsah, na aký boli vytvorené. Grafy slúžia na prezeranie výsledkov, dáta čerpajú z ukladača, nie z monitorov.
Obrázok 17 – tok dát pri monitorovaní Užívateľské rozhranie síce využíva všetky časti programu, ale zvyšok systému je od neho nezávislý. Samotný experiment by po nastavení mohol prebehnúť aj bez neho. Užívateľské rozhranie slúži na nastavenie parametrov experimentu, jeho komfortné spustenie a sledovanie. Riadiaci program začleňuje v sebe jednotlivé experimenty ako projekty. Naraz môžeme vytvárať a spúšťať viac projektov. Každý projekt má vlastné nastavenia a bežiace simulácie sa navzájom neovplyvňujú. Jeden projekt môže byť v riadiacom programe otvorený len raz. Projekt zahŕňa všetko potrebné pre beh simulácie. Jeho súčasťou je jeden svet (model), ktorý používateľ zvolí pri vytváraní projektu a nedá sa už zmeniť. Ak v prostredí neexistuje žiaden použiteľný svet (nebol vytvorený), nedá sa vytvoriť ani nový projekt. Pred spustením simulácie je potrebné nastaviť nasledovné: · Agenty, ktoré sa stávajú súčasťou sveta · Monitory, ktoré čerpajú informácie z celého projektu a posúvajú dáta v každom kroku simulácie ukladaču · Grafy, ktoré umožňujú priebežné sledovanie dát Treba pripomenúť, že monitory a grafy nie sú podstatné pre samotný beh simulácie, ale manipulujú s dátami, ktoré sú v každej simulácii veľmi dôležité. Ak systém neobsahuje svet, prípadne agenty, či monitory, ktoré by vyhovovali nášmu experimentu, musíme si ich dorobiť. Tomu sa budeme venovať v kapitole 3.7 Rozšírenie prostredia pre jazykové hry. Po nastavení parametrov experimentu môže používateľ prejsť k samotným simuláciám. Nová simulácia vznikne vždy, keď sa spustí beh simulácie po obnovení (resete) experimentu alebo pri prvom spustení. Obnovenie modelu znamená nastavenie dát na ich počiatočné hodnoty, ktoré sa v priebehu simulácie postupne menili. Simuláciu je možné v ľubovoľnom kroku prerušiť a uložiť. Taktiež je možné zmeniť počas simulácie všetky nastavovateľné parametre a potom v nej pokračovať už so zmenami. Pre každú simuláciu sú dáta ukladané samostatne pod novým menom. Dáta jednotlivých simulácií sa dajú prezerať a exportovať, aby mohli byť použité v iných programoch. Prostredie je pripravované na prírastok nových svetov, agentov a monitorov. Z tohoto dôvodu je nutné, aby prostredie vedelo vždy ponúknuť používateľovi pri výbere všetky prítomné implementácie uvedených entít. To zabezpečujú zberne. Zberne slúžia na uchovávanie všetkých doposiaľ implementovaných entít (svetov, agentov a monitorov). Pre každý typ entity je vyhradená samostatná zberňa. 3.5 Inštalácia a počiatočná konfigurácia prostredia Skôr, ako začneme robiť konkrétne experimenty, je nutné, aby sme mali pripravené prostredie. Inštrukcie na inštaláciu a spustenie je možné nájsť aj v súbore priloženom spolu s programom. Pri inštalácii postupujeme nasledovne: a) Adresár s programom nakopírujeme na zvolené miesto alebo program rozbalíme do zvoleného adresára. b) Pokiaľ nemáme v systéme k dispozícii interpreter javy[2] alebo je starší ako minimálne potrebná verzia, treba ho nainštalovať. Najnižšia podporovaná verzia je 1.4. c) Po úspešnom nainštalovaní interpretra javy je možné spustiť prostredie dávkovým súborom. Podľa operačného systému treba zvoliť pre OS Windows run.bat alebo pre UNIX systémy run.sh z adresára, do ktorého sme nakopírovali prostredie. d) Ak prostredie nenabehne, treba skontrolovať body inštalácie a) a b). e) Pri prvom spustení si prostredie vypýta adresár, kde sa budú ukladať vytvárané projekty. Je potrebné zadať existujúci adresár. Okno úspešne spusteného programu zobrazuje Obrázok 18 – hlavné okno programu.
Obrázok
18 – hlavné okno programu Ďalším krokom pri prvom spustení programu je nastavenie zberní. Zberne treba nastaviť zvlášť pre svety, agenty a monitory. V menu hlavného programu Konfigurácia si treba vyvolať konfigurácie pre jednotlivé zberne (viď Obrázok 19 – zberňa agentov).
Pokiaľ zberne ešte neboli nastavené, mali by byť prázdne. Rýchlu konfiguráciu prevedieme stlačením tlačidla Vyhľadaj. Štandardne by program po vyhľadaní mal v zberni pre svet obsahovať položku s názvom SimpleWorld, v zberni pre agenty by sa mali nachádzať položky s názvami SimpleAgent, AgentGenerator a AgentRemover a v zberni pre monitory položky s názvami WorldMonitor, WorldRatioMonitor, CoherenceMonitor a GroupCoherenceMonitor. Táto časť popisuje postup, ako si nastaviť a spustiť niekoľko predpripravených experimentov. Experimenty sme zámerne zvolili tak, aby demonštrovali niektoré príznaky jazykovej hry popísané v kapitole 2.4 Príznaky experimentov.
Editor projektu je hlavné okno pre experiment a jeho beh. Skladá sa z dvoch hlavných častí: Prvú tvoria záložky, v ktorých je možné nastavovať parametre potrebné pre beh experimentu. Sú to zoznamy agentov, monitorov, grafov, dát simulácií, parametrov sveta a parametrov projektu. Každá záložka disponuje vlastnými prvkami na ovládanie. Druhou časťou editora projektu sú prvky na ovládanie a
sledovanie simulácie. Položka Krok
zobrazuje, v ktorom kroku sa simulácia momentálne nachádza a v zátvorke sa
počas behu simulácie zobrazuje, koľko krokov ešte simulácia pobeží. Simuláciu
je možné odštartovať, prípadne v nej pokračovať stlačením tlačidla V menu editora projektu môžeme projekt uložiť, uložiť pod novým menom alebo zatvoriť. Pri konfigurácii experimentu potrebujeme vedieť, ako pridávať do sveta agenty. Pridávanie môžeme realizovať viacerými spôsobmi. Agenty môžeme pridávať manuálne pomocou kontrolných prvkov zoznamu v záložke Agenty editora projektu. Druhou možnosťou je použitie generátorov. Generátory sú špecializované agenty, ktoré v prostredí plnia špeciálne funkcie a nepodieľajú sa na jazykových hrách. V prostredí sú dva pripravené generátory. Jeden slúži na pridávanie nových agentov do sveta, druhý na ich vyhadzovanie. Pri simulácii sa generátormi pridané resp. odobraté agenty pridajú resp. odoberú vždy na začiatku ďalšieho kroku simulácie. Najprv si popíšeme vlastnosti generátora, ktorý pridáva agenty. V zberni agentov existuje pod položkou s názvom AgentGenerator. Popis jeho parametrov: ·
AgentTemplate – tu treba nastaviť agent, ktorý bude
generátor pridávať do sveta. Agent sa vyberá zo zberne. ·
GenCycleType – určuje, ako často bude generátor
počas simulácie generovať nových agentov. Parameter môže nadobúdať jednu z
hodnôt: o Tick period – generovanie prebehne v každom GenPeriod kroku o Every tick – generovanie prebehne v každom kroku simulácie o First tick – generovanie prebehne iba na začiatku simulácie, v 1. kroku o Exact tick – generovanie prebehne iba raz, v kroku GenPeriod o No gen. – neprebehne žiadne generovanie ·
GenPeriod – slúži na určenie periódy alebo
presného kroku generovania ·
GenProb – pravdepodobnosť vygenerovania
agenta, hodnota z intervalu <0,1> ·
InOneStep – označuje, koľko agentov sa má
generovať v jednom generovacom kroku. Skutočný počet agentov, ktoré pribudnú do
sveta, závisí od pravdepodobnosti GenProb. ·
MaxAgents – určuje, koľko agentov môže daný
generátor v priebehu celej simulácie vygenerovať. Pre hodnotu –1 nie je počet
agentov obmedzený. Nasledujúce dva
parametre majú význam iba pre svety, ktoré podporujejú rozmiestnenie agentov v
priestore. V takom prípade si generátor od svetu vyžiada náhodnú pozíciu pre
pridávaný agent. ·
RndPosition – určuje typ generovania náhodnej
pozície, nadobúda jednu z hodnôt: o around agent – vygeneruje náhodnú pozíciu v okolí samotného generátora v maximálnej vzdialenosti RndRadius o rnd on map – vygeneruje pozíciu náhodne v celom priestore o fix position – nastaví pozíciu agenta zhodnú s pozíciou generátora. Pokiaľ to svet umožňuje, všetky agenty budú v jednom bode. · RndRadius – určuje maximálnu vzdialenosť agenta od generátora Keďže generátor je tiež agent, v prostredí s ním manipulujeme rovnako ako s agentmi, t.j. musíme ho vložiť do zberne agentov a patrične nastaviť. Ďalej si ukážeme, ako nastavovať grafy. Pridávanie, mazanie, editovanie a zobrazovanie grafov sa deje pomocou kontrolných prvkov v editore projektu v záložke Grafy. Pri pridávaní a editovaní grafu je potrebné sa oboznámiť s možnosťami nastavenia, ktoré poskytuje editor grafu (viď Obrázok 23 – konfigurácia grafu). Pri nastavovaní grafu treba určiť: · hodnoty, ktoré chceme zobrazovať · typ grafu · názov grafu a osí X,Y · okno pre zobrazovanie dát Implementovali sme štyri typy grafov. Prvý typ je čiarový graf. Os Y predstavuje rozsah hodnôt zobrazovaných dát. V prípade, že graf bude zobrazovať viac dát, mali by mať približne rovnaký rozsah hodnôt. Os X grafu predstavuje počet krokov simulácie. Jeden graf môže zobrazovať viac dát súčasne. Pre každé dáta je vykreslená jedna čiara. Čiary sú navzájom odlíšené farebne (napr. viď Obrázok 28 – koherencia a úspešnosť hier v spoločenstvách). Druhý typ grafu (DA – dual axis) je tiež čiarový graf. Tento graf slúži na zobrazovanie viacerých dát, ktoré nemajú rovnaký rozsah hodnôt. Graf vytvorí os Y na oboch stranách grafu, pričom na jednu nanesie rozsah hodnôt prvých dát a na druhú rozsah hodnôt ostatných dát (napr. viď Obrázok 4 – úspešnosť hier a veľkosť populácie).
Koláčový graf a sĺpcový graf zobrazujú hodnoty dát v poslednom kroku simulácie. Oba grafy majú význam iba pri porovnávaní na sebe závislých alebo podobných dátach (viď Obrázok 21 – ukážka koláčového grafu a Obrázok 22 – ukážka stĺpcového grafu). Okno je hodnota, ktorá určuje, po koľkých krokoch sa majú zobrazovať hodnoty dát. Napríklad, pre hodnotu 1 bude zobrazený každý krok simulácie. Hodnota 10 znamená, že bude zobrazený každý desiaty krok simulácie. Pre koláčový a stĺpcový graf nemá tento parameter význam.
Obrázok 23 – konfigurácia grafu Samotný graf vyvoláme z editora projektu v záložke Grafy jeho označením v zozname grafov stlačením tlačidla U/S (Ukáž/Skry). Ako názov napovedá, rovnakým tlačidlom môžeme okno grafu skryť.
Obrázok 24 – ukážka grafu a jeho menu[3] Výzor grafu môžeme upravovať z jeho vlastného menu, ktoré vyvoláme stlačením pravého tlačidla myši[4] v okne grafu (viď Obrázok 24 – ukážka grafu a jeho menu). Graf ponúka možnosti ako tlač, uloženie do súboru, zmenu farieb, nadpisov a podobne. Po stručnom oboznámení sa s ovládaním programu, prejdime k prvému experimentu. Pripravený svet SimpleWorld a agent SimpleAgent spĺňajú definíciu 1. Pomocou tejto implementácie si prejdeme niektoré simulácie, ktorých výsledky sme mali možnosť vidieť pri popisoch vlastností experimentov. V zberni agentov si pre položku SimpleAgent vytvoríme jednu šablónu, ktorej môžeme zmeniť meno podľa uváženia. V editore zvolíme záložku Agenty a pridáme do zoznamu agentov zo zberne agentov jeden AgentGenerator. Pre pridaný generátor nastavíme parametre nasledovne: · AgentTemplate – zo zberne zvolíme našu preddefinovanú šablónu SimpleAgent · GenCycleType – nastavíme na First tick– agentov chceme generovať iba na začiatku simulácie · GenProb – nastavíme na 1 (100% pravdepodobnosť, že sa agent vytvorí) · InOneStep – zadáme 20 (toľko agentov chceme mať v simulácii) Ostatné položky nás teraz nezaujímajú. Ak sme vyplnili všetko v poriadku, môžeme vyskúšať spustiť simuláciu. Spustíme ju na 300 rokov. Ak bol generátor nastavený správne, do zoznamu agentov pribudlo ďalších 20 agentov. Každý s rovnakým menom, ale rôznym ID. Môžeme si prezrieť ich slovníky (v zozname agentov treba označiť ľubovoľný agent, editovať ho a potom editovať jeho parameter Lexikon). Keďže už prebehli jazykové hry, niektoré slovníky by už nemali byť prázdne. Dáme obnoviť simuláciu a vymažeme vygenerovaných agentov. (V nastaveniach pre svet je parameter RemoveAgent. Ak je nastavený na remove generated, tak pri obnove sa zo zoznamu agentov vymažú všetky agenty, ktoré boli vygenerované). Predošlá simulácia prebehla "nasucho", lebo žiadne dáta sme neukladali a ani žiadne nezobrazovali, a tak sme nemohli sledovať jej priebeh. Teraz nastavíme monitory a grafy tak, aby sme mohli priebeh simulácie pozorovať. Ako prvé musíme nastaviť zberňu pre monitory, ak ešte nie je (viď 3.5 Inštalácia a počiatočná konfigurácia prostredia). Zberňa monitorov by mala obsahovať položku s názvom WorldRatioMonitor. Tento monitor sleduje dva ľubovoľné parametre sveta a dáva ich do pomeru po X krokoch. To znamená že pre parametre monitoru MonitoredProperty (MP), RatioProperty (RP) a Window (X) je v krokových intervaloch po X pre interval (K,K+X) hodnota vrátená monitorom vypočítaná ako: výsledok
= Monitor nastavíme tak, aby sme sledovali mieru úspešnosti hier (viď 2.5.1 Úspešnosť hier). Keďže v každom kroku prebehne len jedna hra medzi dvoma agentmi, na graf by sa táto udalosť nanášala takmer zbytočne, lebo skoky medzi 0 a 1 nie sú až také zaujímavé. Preto tento monitor dáva parametre do pomeru podľa zvoleného počtu krokov. Svet poskytuje na zistenie úspešnosti a počtu hier dva parametre: lastGameCount a lastSucGameCount. V editore projektu v záložke Monitory pridáme do zberne monitorov WorldRatioMonitor, ktorému nastavíme parametre podľa [Obrázok 25 – nastavenie monitoru WorldRatioMonitor pre mieru úspešnosť hier].
Obrázok 25 – nastavenie monitoru WorldRatioMonitor pre mieru úspešnosť hier Tu si treba dať pozor, lebo ak zadáme názvy položiek nesprávne, monitor nebude správne fungovať a dáta sa nebudú zberať. Pri názve položky treba zachovať veľké a malé písmená. Náš pridaný monitor sleduje úspešnosť jazykových hier pre každých 20 krokov simulácie. Ďalším krokom je nastavenie grafu. V záložke Grafy editora projektu pridáme graf pomocou tlačidla Pridaj. Zobrazí sa nám editor grafu. Graf nazveme "Úspešnosť hier". Do zoznamu Zdroje dát vložíme položku s názvom lastSucGameCountRlastGameCount, ktorú by nám systém mal dať k dispozícii potom, čo sme pridali monitor. (Každá implementácia monitoru zodpovedá za to, ako budú pomenované zdroje dát, ktoré daný monitor bude dávať k dispozícii. V tomto prípade si monitor vytvoril názov podľa oboch parametrov, ktoré monitoruje a oddelil ich písmenom 'R'.) Po nastavení monitoru a grafu môžeme spustiť druhú simuláciu. Tentoraz ale budeme mať k dispozícii aj jej priebežné výsledky – počas behu simulácie by sme mali vidieť zmeny v dátach. Výsledný graf by mal po 10000 krokoch simulácie vyzerať ako [Obrázok 3 – úspešnosť hier]. Graf na obrázku používa grafové okno o veľkosti 10, zobrazované údaje nie sú nahusto. Môžeme tak nastaviť aj náš graf a v editore grafu zmeniť položku Okno na 10. Zmeny sa po potvrdení editovaného grafu prejavia hneď. (Pokiaľ nenastane obnovenie simulácie, nazbierané dáta zostanú grafom prístupné.) Simuláciu môžeme opakovať pre rôzne počty agentov, prípadne môžeme vyskúšať niektorým agentom nastaviť rôzne parametre, a tak sledovať závislosť úspešnosti hier na zmenených parametroch. 3.6.5 Druhý experiment – otvorenosť systému Druhý experiment je pokračovaním prvého. V predošlom experimente bola jazyková hra uzavretá. Do systému neprichádzali a ani z neho neodchádzali agenty (nerátame fakt, že sme si ich v prvom kroku simulácie dali vygenerovať). Aby sme si vyskúšali jazykovú hru v otvorenom prostredí (viď kapitolu 2.4.3.2 Otvorené systémy), stačí spraviť len pár zmien. Do zoznamu agentov v editore projektu pridáme ďalší generátor agentov, ale nastavíme ho trochu inak: · AgentTemplate – zo zberne zvolíme preddefinovanú šablónu SimpleAgent. · GenCycleType – nastavíme na Every tick. Budeme generovať agentov v každom kroku. · GenProb – zvolíme 0,00025. Nechceme, aby agenty pribúdali príliš rýchlo. · InOneStep – zvolíme 1. V každom kroku sa vygeneruje maximálne jeden agent. Aby sme mohli sledovať vývoj miery úspešnosti hier v závislosti na pribúdaní agentov, budeme musieť do systému pridať ďalší monitor. Tentoraz nám poslúži preddefinovaný monitor s názvom WorldMonitor, ktorý by sa mal tiež nachádzať v zberni monitorov. V záložke Monitory editora projektu pridáme nový monitor, ktorý má v zberni názov WorldMonitor. Tento monitor sme navrhli tak, aby zaznamenával ľubovolný parameter sveta. Zoznam parametrov sveta s ich aktuálnymi hodnotami sa nachádza v záložke Par.sveta editora projektu. V našom príklade chceme sledovať počet agentov, preto parameter MonitoredProperty nastavíme na agentCount (viď Obrázok 26 – nastavenie monitoru WorldMonitor).
Obrázok 26 – nastavenie monitoru WorldMonitor Ďalej treba upraviť graf. Do pôvodného grafu z prvého experimentu pridáme do zoznamu Zdroje dát ďalšiu položku s názvom agentCount. Rozsah hodnôt, ktoré chceme zobrazovať bude ale dosť odlišný. Zatiaľ, čo počet agentov môže narásť na veľké prirodzené číslo, úspešnosť hier sa pohybuje medzi hodnotami 0 a 1 (resp. 0 až 100%). Na zobrazenie výsledkov bude preto vhodnejší typ grafu DA[5] čiarový graf. Prírastok nových agentov by sme chceli vyskúšať až potom, čo miera úspešnosti hier dosiahne okolie maxima. Preto najprv nastavíme nový generátor, aby negeneroval agenty (parametru GenCycleType priradíme hodnotu No gen.). Spustíme simuláciu a počkáme, kým sa miera úspešnosti hier neustáli v okolí 100%. Potom prestavíme generátor tak, aby začal generovať nové agenty a necháme bežať simuláciu na ďalších rádovo 40000 krokov. Výsledok simulácie by mal byť porovnateľný s výsledkom na [Obrázok 4 – úspešnosť hier a veľkosť populácie]. Graf na obrázku bol ešte trochu upravený – pre agentCount sme nastavili rozsah hodnôt manuálne s maximom na 50. Pre ďalšiu simuláciu zmeníme len parameter GenProb nového generátora – zvýšime pravdepodobnosť vygenerovania nového agenta z hodnoty 0,00025 na 0,001. Experiment obnovíme a spustíme na 50000 krokov. Výsledky by sa mali priblížiť k [Obrázok 5 – úspešnosť hier a veľkosť populácie 2]. Na simuláciu ďalších výsledkov z kapitoly 2.4.3.2 Otvorené systémy budeme potrebovať ďalší generátor – AgentRemover. Tento generátor bude zodpovedný za vyhadzovanie agentov zo sveta. V editore projektu pridáme do zoznamu agentov AgentRemover, ktorý má niekoľko analogických parametrov ako AgentGenerator. Rozdielne parametre sú: ·
MinAgents
– koľko agentov musí minimálne zostať vo svete. AgentRemover vyhodí agent, iba ak svet
obsahuje viac agentov než je stanovené minimum. · ToRemove – koľko agentov môže generátor vyhodiť počas celej simulácie. Hodnota –1 znamená neobmedzený počet agentov. AgentRemover nevyhadzuje systémové agenty, medzi ktoré patria aj generátory. Nastavíme prvý generátor, ktorý vygeneruje na začiatku simulácie 20 agentov. Druhý generátor, ktorý v predchádzajúcej simulácii generoval v každom kroku nové agenty, vypneme. A napokon, novému generátoru AgentRemover nastavíme tieto hodnoty: · MinAgents – 6. (3 agenty – generátory + minimálne 3 agenty hrajúce jazykovú hru) · ToRemove – necháme –1 · GenCycleType – nastavíme na Every tick. · GenProb – nastavíme dosť veľkú pravdepodobnosť – okolo 0,002. Nastavenie grafu nebudeme meniť. Obnovíme a spustíme ďalšiu simuláciu. Tentoraz bude stačiť omnoho menej krokov, aby sa úspešnosť hier ustálila na maxime 100%. Ak však chceme získať podobné výsledky ako [Obrázok 6 – úspešnosť hier a veľkosť populácie 3], musíme nechať simuláciu bežať 25000 krokov. 3.6.6 Tretí experiment – spoločenstvá Posledný ukážkový experiment je podobný priestorovej hre z kapitoly [2.4.4.2 Priestorové hry]. Agenty vygenerujeme tak, aby boli rozmiestnené v priestore po skupinkách. Na to ale budeme potrebovať viac šablón v zberni agentov. Vytvoríme si preto tri šablóny položky SimpleAgent a v každej šablóne nastavíme v parametri Group inú skupinu pre agenta. Skupiny pomenujeme a, b a c. Pre každú skupinu pridáme do zoznamu agentov jeden generátor – AgentGenerator, ktorému nastavíme tieto vlastnosti: ·
AgentTemplate – pre jednotlivé generátory nastavíme
pripravené šablóny zo zberne agentov so skupinou a, b
a c. ·
GenCycleType – nastavíme na First tick, – agenty sa vygenerujú na začiatku
·
InOneStep – nastavíme na 10, v každej skupine
chceme 10 agentov. ·
GenProb – nastavíme na 1 (100%
pravdepodobnosť). ·
Position – každému generátoru nastavíme inú
pozíciu. V našom prípade je svet dvojrozmerný, môžeme preto použiť napr.
pozície [20,20], [50,80] a [80,40]. ·
RndPosition – nastavíme na around agent –generovanie agentov okolo
generátora. ·
RndRadius –
nastavíme 30 – maximálna vzdialenosť agentov od generátora.
Obrázok 27 – agenty v priestore po skupinkách 30 agentov v priestore v 3 skupinkách Ak budeme simuláciu krokovať, po druhom kroku by mala reprezentácia sveta vyzerať podobne ako [Obrázok 27 – agenty v priestore po skupinkách]. V takto pripravenom svete je možné hrať priestorové hry, pokiaľ je nato svet pripravený. SimpleWorld v každom kroku podľa definície jazykovej hry vyberie dvoch hráčov a medzi nimi prebehne jazyková hra. Na ovplyvnenie výberu hráčov svet poskytuje parameter s názvom SAgentChoose (v záložke editora projektu Par. sveta). Parameter SAgentChoose určuje, ako sa bude vyberať druhý hráč. Zatiaľ, čo prvý hráč je vybraný vždy náhodne, druhý hráč sa môže vybrať:
Pre experiment si teraz nastavíme SAgentChoose na by group. Keďže každá skupinka agentov je vygenerovaná jedným generátorom, ktorý používa jednu šablónu, agenty budú komunikovať spolu len v rámci skupín, čo má veľmi podobný dopad na priebeh simulácie ako komunikovanie podľa vzdialenosti. Vo svete by mala nastať známa situácia popísaná v kapitole [2.4.4.2 Priestorové hry]. Môžeme skontrolovať slovníky agentov z dvoch rôznych skupín. Situáciu tiež môžeme podrobnejšie sledovať pridaním monitoru koherencie. Tento monitor netreba nijak zvlášť nastavovať, stačí ho pridať do zoznamu monitorov. Obnovíme simuláciu a spustíme ďalší beh. Na pozorovanie vývoja hry si vytvoríme graf s koherenciou a úspešnosťou hier. Výsledky priebehu zobrazuje [Obrázok 28 – koherencia a úspešnosť hier v spoločenstvách]. Ako na obrázku vidno, úspešnosť hier je vysoká, ale globálna koherencia nie je, lebo agenty komunikujú len v rámci spoločenstva, a tak jazyky každého zo spoločenstiev sú odlišné.
Obrázok 28 – koherencia a úspešnosť hier v spoločenstvách Spodnejšia čiara v grafe je koherencia. Prestavíme parameter SAgentChoose na random. Odteraz budú medzi sebou komunikovať všetky agenty bez rozdielu. Simuláciu neobnovujeme, ale pokračujeme v nej ďalších 30000 krokov. Na výsledkoch (viď Obrázok 29 – koherencia a úspešnosť hier v spoločenstvách 2) je zjavne vidieť zmenu, ktorá nastala v komunikácii medzi agentmi. Koherencia začala stúpať, čo spôsobili globálne interakcie.
Obrázok 29 – koherencia a úspešnosť hier v spoločenstvách 2 Spodnejšia čiara v grafe je koherencia. V kroku 10000 začali prebiehať globálne interakcie medzi agentmi. Na sledovanie priebehu experimentu pridáme monitory koherencie pre každé spoločenstvo agentov. Monitor nájdeme pod názvom GroupCoherenceMonitor v zberni monitorov. Výsledky simulácie sú znázornené na [Obrázok 30 – koherencia a lokálne koherencie spoločenstiev].
Obrázok 30 – koherencia a lokálne koherencie spoločenstiev Najspodnejšia čiara je globálna koherencia. Čiara s najväčším zlomom v kroku 5000 je úspešnosť hier. Ostatné predstavujú lokálne koherencie spoločenstiev. V bode 5000 krokoch začali globálne interakcie medzi agentmi. 3.7 Rozšírenie prostredia pre jazykové hry Táto kapitola sa zaoberá rozšírením programu pre ďalšie experimenty. Nepopisujeme možnosti rozširovania užívateľského rozhrania alebo systémových častí programu, ale rozširovanie svetov, agentov a monitorov, ktoré musí používateľ zmeniť, ak chce realizovať iné typy experimentov. Na rozširovanie prostredia je nutné ovládať aspoň základy objektového programovania. Taktiež je potrebné oboznámiť sa s programovacím jazykom Java [42] (jeho technológiou JavaBeans) a jeho prostredím na tvorbu aplikácií. Rozširovateľ by mal taktiež vedieť niečo o problematike jazykových hier a podrobnejšie sa oboznámiť s našim prostredím pre jazykové hry. Skôr, ako prejdeme ku konkrétnym postupom a zásadám rozširovania prostredia, oboznámime sa s objektovým modelom základných častí programu (viď Obrázok 31 – objektový model rozšíriteľných častí programu)
Obrázok 31 – objektový model rozšíriteľných častí programu Základnou triedou je trieda Agent. Metódy triedy Agent sme navrhli vychádzajúc z predpokladu, že inštancie triedy Agent majú byť použité v multi-agentovom prostredí.. Trieda definuje metódu life, pomocou ktorej sú inštancie triedy v multi-agentovom prostredí obsluhované. Metóda life volá tri ďalšie metódy, ktoré predstavujú životný cyklus agenta. Sú to metódy sense, memorize a chooseAction volané v tomto poradí. Trieda AgentContainer[6] rozširuje triedu Agent. Inštancia triedy AgentContainer predstavuje multi-agentové prostredie, lebo môže obsahovať v sebe agenty (objekty triedy Agent) a v cykle ich obsluhovať. AgentContainer obsluhuje agenty v metóde agentsLife, ktorú volá zo svojej metódy life. Takže krok simulácie v inštancii AgentContainer predstavuje jedno volanie metódy life. Postupnosť obsluhy jednotlivých agentov závisí na konkrétnej implementácii. Štandardne sú agenty obsluhované v postupnosti, v akej boli do AgentContainer-a pridané. Na udržovanie zoznamu agentov používa AgentContainer inštanciu triedy AgentRepresentation[7].
Obrázok 32 – komunikácia agentov Aby sme zachovali ideu multi–agentového prostredia, agenty by medzi sebou nemali komunikovať priamo ale prostredníctvom samotného prostredia. Preto má trieda Agent podporu pre komunikáciu cez agentúry – inštancie triedy Agency (viď Obrázok 32 – komunikácia agentov). Komunikáciu cez agentúry používajú agenty aj na komunikáciu so svetom. AgentContainer zaručuje, že všetky agenty obsiahnuté v ňom majú rovnakú agentúru, a tak sa môžu cez ňu dorozumievať. Pri komunikácii agentov cez agentúru sa na prenos informácií používa objekt triedy Situation. Táto trieda je jednoduchá asociačná tabuľka a má za úlohu uchovávať dvojice kľúč – hodnota. Komunikujúce agenty musia vedieť, aké kľúče môžu očakávať a aké typy hodnôt uchovávajú. Triedy WorldAgent a World sú podtriedy AgentContainer-a. Hoci sú obe odvodené z rovnakej triedy, každá plní inú funkciu. Projekt (viď 3.4 Základy prostredia) pracuje s inštanciou triedy World, ktorú používa ako multi-agentové prostredie na simuláciu agentov. Trieda World pracuje s objektmi triedy WorldAgent. Na vytváranie nových experimentov potrebujeme nové svety a nové agenty, ktoré definujeme ako podtriedy tried WorldAgent a World. Na vytváranie nového monitora definujeme podtrediu triedy AbstractMonitor. V práci boli pre simulácie použité implementácie SimpleAgent a SimpleWorld, ktoré sme vytvorili podľa definície 1. Pre agenty, svety a monitory platia pri rozširovaní určité zásady a mechanizmy, ktoré treba dodržiavať a ktoré si popíšeme. Pri každom pravidle je popísané, pre ktoré entity platí. Obnova (reset) – platí pre agenty, svety a monitory Pri obnove simulácie (viď 3.4 Základy prostredia) je volaná metóda restart. Ak pribudli nejaké nastavenia do objektu, ktoré treba pri obnove simulácie nastaviť na pôvodné hodnoty, treba predefinovať túto metódu a urobiť v nej patričné nastavenia. V metóde restart je dobré volať aj jej rodičovskú verziu. Nastavovateľné parametre – platí pre agenty, svety a monitory Ak chceme, aby mal agent, svet alebo monitor nejaký parameter nastaviteľný z užívateľského rozhrania, je potrebné definovať dve metódy. Jednu na získanie parametru, druhú na jeho nastavenie. Deklarácia metódy slúžiacej na získavanie parametra musí vyzerať takto: public <TypParametra> get<MenoParametra>() Pre nastavovanie parametra je deklarácia metódy nasledovná: public void
set<MenoParametra>(<TypParametra> param) <MenoParametra> nahradíme zvoleným menom parametra a <TypParametra> nahradíme zvoleným typom parametra. Ak má byť parameter určený iba na čítanie, netreba vytvárať metódu na zapisovanie. Komunikácia – platí pre svety a agenty Ak chceme vytvoriť slušnú komunikáciu medzi agentmi a medzi agentom a svetom, musíme zadefinovať príslušné metódy. V komunikácii agentov prvý agent kladie otázku a druhý agent odpovedá. Hlavným parametrom komunikácie je názov otázky. Metódy na kladenie otázky sú už definované v triede Agent a netreba ich implementovať. Sú to tri metódy ask, každá s inými parametrami. Pri kladení otázky môže prvý agent použiť tieto formy: ask( "mojaotazka" ); ask( "mojaotazka", mojeparametrekotazke ); ask( cielovy_agent, "mojaotazka", mojeparametrekotazke ); Aby agent vedel odpovedať napríklad na otázku mojaotazka musí deklarovať metódu v tvare: public Situation getAnswer_mojaotazka(Agent agent, Object params). Metóda je povinná vrátiť objekt triedy Situation. Je to jednoduchý ukladač párov hodnôt. Každý, kto chce komunikovať, musí vedieť, aké parametre môže pri otázke poslať a čo môže očakávať vo vrátenej situácii. Informácie o tom, aké parametre otázka očakáva a aké hodnoty vie vrátiť by mali byť pripísané pri každej implementácií takejto metódy. Napríklad, trieda World vie odpovedať na otázky sense, addAgent, delAgent a iné. Ku každej otázke očakáva určité parametre a dáva určité odpovede (viď dokumentáciu API na CD). Životný cyklus – len svety a agenty Ak chceme zmeniť správanie sa agenta alebo sveta počas simulácie, musíme predefinovať jednu z metód jeho životného cyklu (viď 3.7.1 Potrebné znalosti). Môžme predefinovať hlavnú metódu life (čo sa neodporúča), alebo niektorú z troch metód sense, memorize a chooseAction. Názvy metód napovedajú, za aké akcie metódy zodpovedajú. Metóda sense má aj štandartnú implementáciu, v ktorej zisťuje aktuálny stav prostredia pomocou otázkovej metódy ask("sense") a získané informácie o stave prostredia ukladá do premenej actualSituation, ktorá je prístupná aj podtriedam. Zmena reprezentácie priestoru – len svety AgentContainer si udržuje zoznam agentov v inštancii triedy AgentRepresentation. Táto trieda sa tiež používa ako reprezentácia priestoru, v ktorom sú agenty uložené. Podľa implementácie to môže byť napríklad mriežka, kocka, orientovaný graf a iné. Definované sú dve reprezentácie priestoru: VectorRepresentation a MatrixRepresentation ako potomkovia triedy AgentRepresentation. Prvá trieda nedefinuje žiadny priestor, agenty sú akoby nahádzané v taške, zatiaľ čo druhá trieda definuje dvojrozmerný priestor. Trieda World používa inštanciu triedy VectorRepresentation. Ak chceme zmeniť triedu pre reprezentáciu priestoru, zavoláme v konštruktore[8] sveta metódu setRepresentation. Napríklad:
setRepresentation(new MatrixRepresentation(200, 200)); Zmena zobrazovania reprezentácie priestoru – len svety Reprezentáciu priestoru je možné zobrazovať na obrazovku. Ku každej triede predstavujúcej reprezentáciu prostredia si musíme vytvoriť jej zobrazovač. Napríklad k triede MatrixRepresentation existuje zobrazovač s názvom Display2DWorld. Zobrazovač musí byť podtriedou triedy WorldDisplay. Podobne ako reprezentáciu prostredia, aj zobrazovač nastavíme v konštruktore sveta, tentoraz pomocou metódy setDisplay. Napríklad: setDisplay(new Display2DWorld()); Príklad zobrazovača, ktorý vykresľuje reprezentáciu triedy MatrixRepresentation na obrazovku možno vidieť na [Obrázok 27 – agenty v priestore po skupinkách]. Inicializácia – len svety Metóda init triedy World sa volá po vytvorení nového projektu a má slúžiť na počiatočnú inicializáciu sveta. Nie je volaná pri otvorení uloženého projektu. Ak potrebujeme pri inicializácii spraviť vlastné nastavenia, môžeme túto metódu predefinovať. V metóde init je dobrým zvykom volať rodičovskú verziu metódy. Vytvorenie aktuálnej situácie prostredia – len svety Trieda World má predefinovanú komunikačnú metódu s názvom getAnswer_sense. Pomocou tejto metódy vie odpovedať agentom, ktorí sa pýtajú na aktuálnu situáciu. V tejto metóde svet volá metódu createSituationForAgent(Agent agent, Params params), ktorá má vytvoriť aktuálnu situáciu, v akej sa agent nachádza. Táto metóda dostane dva parametre: agenta, ktorý si pýta stav prostredia a parametre, ktoré posiela. Pre vytvorenie vlastných situácií stačí predefinovať danú metódu. Odporúča sa zachovať situáciu vytvorenú predkom a iba ju rozšíriť. Meno a popis – len monitory Pre meno monitora treba predefinovať metódu getMonitorName a getFullName. Prvá metóda by mala vrátiť jednoduché meno monitora, napríklad MonitorVzdialenosti, zatiaľ čo druhá metóda by mala vrátiť obšírnejšie pomenovanie. Napríklad rozšírené o názov zdroja dát, kam sa budú monitorované hodnoty ukladať – MonitorVzdialenosti_vzdialenost. Taktiež je dobré predefinovať metódu getDescription, ktorá by mala vrátiť stručný popis monitora. Získavanie hodnôt z monitora – len monitory Aby plnil monitor svoju funkciu, je potrebné predefinovať dve metódy. Pri simulácii si ukladač od monitora vypýta názvy zdrojov dát, kam chce ukladať hodnoty pomocou metódy getIdentifiers. Metóda musí vracať pole identifikátorov, názvov zdrojov dát. Potom si ukladač vypýta od monitora dáta pomocou metódy getValues, ktorá vracia pole objektov. Každá položka v poli objektov by mala prislúchať jednému identifikátoru z poľa identifikátorov. Obnova štruktúr – len monitory Pre rozširovanie monitora sa odporúča použiť triedu AbstractMonitor, ktorá definuje užitočné metódy. Napríklad, ak si potrebujeme uchovávať vypočítané dáta, ktoré závisia na agentoch vo svete, môžeme použiť metódu updateVectors, ktorá je volaná vždy, keď do systému príde agent alebo z neho odíde. Urobíme si jednoduchý príklad rozšírenia prostredia, pričom využijeme už existujúcu implementáciu jazykovej hry. V našom rozšírení sa budú agenty vo svete pohybovať a jazykovú hru budú môcť hrať iba agenty ktoré budú vedľa seba dosť blízko. Nebudeme uvádzať kompletný kód príkladu, iba niektoré jeho časti. Celý príklad je priložený na CD diplomovej práce. Na písanie programu v jave môžeme použiť jedno z existujúcich prostredí s užívateľským rozhraním [44,45], alebo si môžeme vystačiť s obyčajným textovým editorom a kompilátorom javy. Vytvoríme si adresár, kde si uložíme náš príklad. Napríklad
adresár work.
Objekty, ktoré budeme editovať by sme radi umiestnili do balíka[9]
org.fmfiuk.elge.extended
a preto si v adresári work
musíme vytvoriť podadresárovú štruktúru org/fmfiuk/elge/extended. V súbore MoveWorld.java začneme definíciou balíka a hlavičky triedy MoveWorld. package org.fmfiuk.elge.extended; /** hlavné
importy[10] */ public class
MoveWorld extends SimpleWorld { /** tu pride telo programu */ } Aby sme rozšírili možnosti výberu druhého agenta pri jazykovej hre, rozšírime definíciu z triedy SimpleWorld. SimpleWorld používa na zistenie druhého agenta metódu chooseSecondAgent. V tejto metóde používa parameter agentChoose, aby zistil akým spôsobom má agent vybrať. Premenná agentChoose je typu ComboInteger, čo umožňuje do nej vložiť preddefinované dvojice názov – hodnota. Preto si pridáme v konštruktori triedy MoveWorld do tejto premennej náš typ výberu druhého agenta a predefinujeme metódu chooseSecondAgent: /** Creates a
new instance of MoveWorld */ public
MoveWorld() { agentChoose.add(BY_RADIUS); //BY_RADIUS ==
"by radius"; } public GameAgent chooseSecondAgent(GameAgent first) { if (agentChoose.toString().equals(BY_RADIUS)) { return chooseAgentByRadius(first); } else return super.chooseSecondAgent(first); } Naša metóda chooseAgentByRadius vyberá agenta podľa nastavenia maximálnej vzdialenosti. Ak chceme aby bol tento parameter nastavovateľný v užívateľskom rozhraní, vytvoríme dvojicu metód podľa pravidiel: public double getMaxAgentDistance() { return maxD; } public void setMaxAgentDistance(double max) { maxD = max; } Takto pribudne v editore projektu v záložke Par. sveta parameter s názvom MaxAgentDistance. Pre pohyb agentov vytvoríme komunikačnú metódu, s názvom relativeMove: public Situation getAnswer_relativeMove(Agent agent, Object params) { ... if (agent instanceof MoveableAgent && params instanceof Point) { //tuto treba zmenit poziciu agenta } //vrat situaciu agentovi ... } Z hľadiska tvorby multi–agentového prostredia nie je dobré, aby si agent menil pozíciu sám. Preto sme vytvorili komunikačnú metódu relativeMove a zariadili, že agent si môže meniť polohu kladením otázky ask s menom otázky relativeMove a s parametrom typu Point. Príklad ukazuje volanie metódy relativeMove s parametrom typu Point, ktorý hovorí že sa chcem pohnúť o jeden bod doľava a o jeden bod hore. ask("relativeMove", new Point(-1,1)); Ak bude možné agent presunúť na požadovanú pozíciu, presunie sa tam. Posunutie agenta zabezpečuje trieda reprezentácie priestoru, v tomto prípade MatrixRepresentation. Samotný agent je už prispôsobený na pohyb. V súbore MoveAgent.java (podobne ako pri definovaní sveta) začneme s balíkom a deklaráciou triedy. package org.fmfiuk.elge.extended; /** hlavné
importy */ public class
MoveAgent extends SimpleAgent { /** tu pride telo programu */ } Agent chceme rozšíriť o dva nastaviteľné parametre: pravdepodobnosť pohybu a maximálny možný krok pohybu. Pre oba parametre vytvoríme požadovanú dvojicu metód: public void
setMaxMoveStep(int step) { this.maxMoveStep = step; } public int
getMaxMoveStep() { return maxMoveStep; } public void
setMoveProb(double prob) { this.moveProb = prob; } public double
getMoveProb() { return moveProb; } Ešte musíme definovať, kedy sa má agent pohybovať. To
zabezpečíme pomocou životného cyklu agenta. Nebudeme predefinovávať metódu life,
ale metódu chooseAction,
v ktorej pomocou opytovacej metódy a otázky typu relativeMove zariadime, aby agent spravil
pohyb (pokiaľ to svet dovolí): public void chooseAction() { if (Math.random() <=
moveProb) {
ask(MoveWorld.ASK_TO_MOVE, new
Point(Engine.getRandomNumber(–maxMoveStep, maxMoveStep),
Engine.getRandomNumber(–maxMoveStep, maxMoveStep))); } } Pohyb agenta je naozaj jednoduchý. Najprv si podľa
pravdepodobnosti zistíme, či sa chceme
pohybovať. Potom povieme svetu, že sa chceme pohnúť. Zavoláme teda metódu ask s
typom otázky na pohybu (konštanta pre názov otázky je zadefinovaná v
triede MoveWorld) a potrebným parametrom. Vytvoríme
náhodné relatívne súradnice podľa nastaveného maximálneho kroku do ľubovoľnej
strany. Vytvorené triedy skompilujeme a celú adresárovú štruktúru
počnúc adresárom org
skopírujeme do adresára extends,
ktorý sa nachádza v inštalačnom adresári prostredia. Takto zaručíme, že
prostredie bude mať k nášmu rozšíreniu prístup. V programe vyvoláme okno pre nastavenie zberne svetov z menu Nastavenia/Zberna svetov. Náše nové rozšírenie program asi automaticky nenájde a tak musíme pomocou tlačidla Pridať (viď Obrázok 19 – zberňa agentov) zadať celú cestu k svetu MoveWorld – org.fmfiuk.elge.extended.MoveWorld. Tlačidlom Načítať by sa v stĺpci Nahrané mala pre náš svet MoveWorld nastaviť potvrdzujúca hodnota (fajka). Ak sa tak nestane, znamená to, že implementácia triedy MoveWorld nebola nájdená. Buď sme zadali zlé meno, alebo sme nezaradili správne súbory implementácie nášho príkladu do adresára extends. Ak sa svet podarilo načítať, treba ešte nastaviť zberňu agentov (teraz by už automatické hľadanie malo fungovať). V zberni agentov pridáme položku org.fmfiuk.elge.extended.MoveAgent. Po nastavení zberní môžeme vytvoriť nový projekt. Ako svet určíme MoveWorld. Do zoznamu agentov pridáme generátor, ktorý bude generovať agenty typu MoveAgent. V záložke editora projektu Par. sveta nastavíme parameter chooseSAgent na hodnotu by radius. Pohyb agentov počas simulácie môžeme sledovať na zobrazovači reprezentácie priestoru, ktorý zobrazíme pomocou tlačidla U/S. Cieľom diplomovej práce bolo informovať o výskume evolúcie jazyka pomocou jazykových hier a naprogramovať prostredie pre experimentovanie v tejto oblasti. Veríme, že prehľad, ktorý sme v práci vytvorili, umožní čitateľom jednoducho a rýchlo preniknúť do problematiky jazykových hier a vzbudí v nich záujem o experimentovanie v tejto oblasti. Dúfame, že k experimentom ich bude motivovať aj náš implementovaný program. Poskytnutý prehľad by taktiež mohol byť dobrou základňou pre jeho elektronickú verziu, ktorá by sa s postupom času mohla rozširovať o nové experimenty a referencie na články v tejto oblasti. Nebolo našim zámerom podať vyčerpávajúci prehľad všetkých existujúcich prác, ale túto vlastnosť by mohla mať navrhnutá elektronická verzia prehľadu. Druhým cieľom bola implementácia prostredia pre experimenty s jazykovými hrami a návody na jeho použitie a rozšírenie. Prostredie sa nám podarilo implementovať podľa našich predstáv a požiadaviek. Či je prostredie dostatočne prepracované, sa ukáže až pri jeho používaní inými záujemcami, ktorí môžu pozitívne prispieť svojimi pripomienkami a návrhmi. Prostredie plánujeme ďalej udržiavať a rozširovať pre nové experimenty, z tohoto dôvodu sme program sprístupnili pod open–source[11] licenciou a dávame si za cieľ mimo diplomovej práce udržiavať elektronický portál k tomuto prostrediu ako i samotné prostredie na adrese http://elge.sourceforge.net.
1
Wittgenstein, L.:
Philosophical Investigations.
2
Shawver, L.: On Wittgenstein's Concept of a Language
Game, http://www.california.com/~rathbone/word.htm
3
Shawver, L.: Commentary on Wittgenstein's Philosophical
Investigations,
4
Nowak, M. A., Komarova, N.
L., Niyogi, P.: Computational and evolutionary aspects of
language, http://www.ptb.ias.edu/nowak
5
Nowak, M. A., Krakauer, D. C.: The
evolution of language, Proc. Natl. Acad. Sci. USA, Vol. 96, pp. 8028–8033, July 1999,
Evolution
6
Steels, L.: The
spontaneous self–organization of an adaptive language, In Muggleton, S., editor, Machine Intelligence 15, Oxford University Press.
7
Steels, L., McIntyre, A.:
Spatially Distributed Naming Games, Advances in complex systems, 1(4),
January 1999
8
Steels, L.: The
synthetic modeling of language origins, Evolution of Communication Journal, 1(1):1–34 1997
9
Steels, L.:
Synthesising the origins of language and meaning using co–evolution, self–organization
and level formation, In Hurford, J.
and Knight, C. and Studdert–Kennedy, M., editor,
Approaches to the Evolution of Language: Social and Cognitive bases, Edinburgh University Press.
10
Steels, L.: Constructing
and Sharing Perceptual Distinctions. In: van Someren, M. and G.
Widmer (eds.), 1997
11
Steels, L.: Perceptually grounded
meaning creation, 1996
12
Steels, L.: The Talking Heads Experiment,
13
Steels, L., Kaplan,
F.: Stochasticity as a source of innovation in language games. In C. Adami, R.
Belew, H. Kitano, and C. Taylor, editors, Proceedings of Artificial Life VI,
Los Angeles, June. MIT Press, 1998
14
Steels, L., Kaplan, F.: AIBO's first
words: The social learning of language and meaning. Evolution of Communication, 2002
15
Steels, L., et al.: Crucial factors in
the origins of word-meaning, in A. Wray, ed., The Transition to Language. Oxford
(UK): Oxford University Press, 2002
16
McIntyre, A.:
17
Marsico, E., Coupé, C.,
Pellegrino, F.: Evaluating
the influence of language contact on lexical changes, http://www.infres.enst.fr/confs/evolang/actes/_actes46.html
18
The University of Chicago's
Social Science Research Computing, RePast, http://repast.sourceforge.net,
19
Santa Fe Institute, Swarm, http://www.swarm.org,
20
AScape,
http://www.brook.edu/dybdocroot/es/dynamics/models/ascape/
21
Smith, K., Brighton, H., Kirby, S.: Language Evolution in a Multi–agent Model: the cultural emergence of
compositional structure, 2002
22
Smith, A.D.M.: Establishing Communication Systems without
Explicit Meaning Transmission. In J. Kelemen and P. Sosík,
Prague: Springer, 2001
23
Kirby, S.: Natural
Language from Artificial Life, in Artificial Life, 2002
24
Kirby, S.:
Learning, Bottlenecks and the Evolution of Recursive Syntax.,
in Linguistic Evolution through Language
Acquisition: Formal and Computational Models edited by Ted Briscoe.
Cambridge University Press, in Press, 1999
25
Hurford, J. R: Expression/induction models of language evolution:
dimensions and issues, in Briscoe, Ted, Eds. Linguistic
Evolution through Language Acquisition: Formal and Computational Models.
Cambridge University Press., 2002
26
De Jong, E. D.: Autonomous Formation of Concepts and
Communication, PhD thesis, Vrije Universiteit
Brussel,
27
De Jong, E. D., V,
P.: How should a robot
discriminate between objects? A comparison between two methods, in Proceedings of the Fifth
International Conference on Simulation of Adaptive Behavior SAB '98.
Cambridge (MA): MIT Press, 1998
28
Batali, J.: Computational simulations of the
emergence of grammar. In Hurford, J. R.,
Studdert–Kennedy, M. and Knight C., editors, Approaches to the Evolution of Language – Social and
Cognitive Bases, 1998
29
Takáč,
M.: Emergencia lingvistických
fenoménov v jazykových hrách, Internet
Distance Education Program Cognitive
Sciences, 2001.
30
Takáč,
M.: Model prototypovej konceptualizácie
sveta s komunikáciou, internal technical report UI FMFI
31
KaplanA New Approach to
Class Formation in Multi–Agent Simulations of Language Evolution., in Demazeau, Y., editor, Proceedings of the third international conference on multi–agent
systems (ICMAS 98),
32
Kaplan, F.: Talking AIBO:
First experimentation of verbal interactions with an autonomous four-legged
robot, in: A.
Nijholt, D. Heylen, K. Jokinen, eds., Learning to Behave: Interacting
agents CELE-TWENTE Workshop on Language Technology. 2000
33
Gärdenfors,
P.: Language and the Evolution of Cognition,
in: V. Rialle and D. Fisette (eds.): Penser
l'esprit: Des sciences de la cognition? une philosophie cognitive, Presses
Universitaires de Grenoble, Grenoble, 1996. 34 Chomsky, N.: Rules and Representations. Columbia University Press, 1980. 35 Chomsky, N.: Knowledge of Language: its Nature, Origin and Use. Praeger, 1986. 36 Pinker, S.: The Language Instinct: How the Mind Creates Language. New York: HarperCollins, 1994 37 Oliphant, M., Batali. J.: Learning and the emergence of coordinated communication. The newsletter of the Center for Research in Language, 11(1), 1997 38 Prigogine, I, Stengers, I.: Order Out Of Chaos. Bantam Books, New York, 1984 39 Brighton, H.: Compositional Syntax from Cultural Transmission. Artificial Life, 8(1), 2002 40 Cangelosi, A. and Parisi, D.: The emergence of a language in an evolving population of neural networks. Connection Science, 1998
41
Berthouze, L., Pic M.: Emergence
of language in interactive systems, in
Proceedings of IEEE International Conference on Systems, Man, and Cybernetics,
Tucson (USA), 2001
42
Sun Microsystems,
Inc. The Java Tutorial – A practical guide for programmers, http://java.sun.com/docs/books/tutorial/index.html
43
Umelý život, http://alife.tuke.sk [1] referenčná príručka k programu je pri zverejňovaní tohto textu ešte v štádiu vývoja [2] java je registrovaná obchodná značka firmy Sun Microsystems, Inc v Spojených štátoch a v ostatných krajinách. http://java.sun.com [3] Dokumentáciu ku knižnici JFreeChart môžete nájsť na http://www.jfree.org/jfreechart/ [4] Rôzne OS môžu používať iné tlačidlá, prípadne iné mechanizmy na vyvolanie takzvaného popup menu. [5] Dual Axis [6] Triedy, ktoré zahrňujú správu iných objektov sa často nazývajú kontajnery. [7] Keďže v Jave je jednoduché dedenie, teda objekt môže mať iba jedného rodiča, existuje v nej rozhranie (interface). Rozhranie je len definíciou, niečo ako abstraktná trieda, neobsahuje žiadnu implementáciu. Triedy v javy môžu implementovať ľubovoľný počet rozhraní. AgentRepresentation je v skutočnosti rozhranie. [8] konštruktor objektu sa zavolá vždy pri vytvorení objektu. [9] balík (package) v jave
rozdeľuje triedy do logickejších štruktúr. Pri programovaní by súbory mali byť
uložené v potadresároch zodpovedajúcim názvu balíku. Napríklad pre balík
elge.engine má všetky definované triedy uložené v adresári /elge/engine/ [10] netreba zabudnúť, že pre každú triedu, ktorú chceme použiť, musíme špecifikovať, kde ju má kompilátor hľadať. Buď v programe budeme písať celú cestu k triede, napríklad elge.examples.simple.SimpleWorld, alebo použijeme kľúčové slovo import a zadáme cesty, ktoré má kompilátor prehľadávať. Napríklad import elge.examples.simple.*; [11] http://www.opensource.org |
||||||||||||||||||