Prírodou inšpirované algoritmy

študijné materiály pre projekt mobilnej triedy umelej inteligencie

Späť ku kurzom triedy
Obsah
Prehľad
SimpleModel
Parametre
Pomenovania
Metódy a premenné



Ostatné kapitoly
Swarm
RePast
LEM
SDML
Eos
DDLab


Tutoriály
 Celulárne automaty
 Morfogenéza
 Simulátory
 Evolučné algoritmy
 Chaos
 Roboty
 Rôzne


SimpleModel

Simulácia napísaná pomocou RePast-u má zvyčajne aspoň dve triedy: triedu agenta, ktorá popisuje správanie sa agenta (t.j. hranie hry spoluprácou alebo zradou) a triedu modelu, ktorá koordinuje nastavovanie a beh modelu. Trieda SimpleModel je základnou pre našu triedu modelu, ktorá bude špecializovaná na naše účely. V Jave sa špecializácie dosahuje predovšetkým prostredníctvom dedenia. Trieda SimpleModel je určená aby bola nadtriedou vášho modelu. Napríklad:

import uchicago.src.sim.engine.SimpleModel; public class MyModel extends SimpleModel { ... }

V prvom riadku importujeme SimpleModel a v nasledujúcom rozšírime SimpleModel našou vlastnou triedou.

Pri písaní našej simulácie, ako bolo spomenuté vyššie, chceme opísať ako nastaviť náš model a potom chceme opísať, čo sa má stať v každom časovom kroku. SimpleModel poskytuje metódy, ktoré môžeme prekryť (angl. override) tak, aby boli špecifické pre náš model. Tieto dve metódy sú setup() a buildModel(). Použijeme ich nasledovne:

import uchicago.src.sim.engine.SimpleModel; public class MyModel extends SimpleModel { public static final int TIT_FOR_TAT = 0; public static final int ALWAYS_DEFECT = 1; private int p1Strategy = TIT_FOR_TAT; private int p2Strategy = ALWAYS_DEFECT; ... public void setup() { super.setup(); p1Strategy = TIT_FOR_TAT; p2Strategy = ALWAYS_DEFECT; } public void buildModel() { Player p1 = new Player(p1Strategy); Player p2 = new Player(p2Strategy); p1.setOpponent(p2); p2.setOpponent(p1); agentList.add(p1); agentList.add(p2); } }

Tu sme použili setup() a buildModel na špecializáciu pre naše zámery. V metóde setup najprv voláme super.setup() aby SimpleModel urobil všetky svoje nevyhnutné nastavenia a potom nastavíme hráčske stratégie. Predpokladá sa, že tieto stratégie budú môcť byť menené z ich preddefinovaných hodnôt zásahom používateľa počas behu simulácie. Metódu setup() používame na nastavovanie parametrov na štandardné hodnoty. Metóda setup() je volaná pri prvom štarte simulácie, alebo keď je zavolaná stlačením tlačidla na nástrojovej lište.

Keď metóda setup() (re)inicializuje simuláciu, použijeme metódu buildModel() na vytvorenie objektov simulácie. Toto je miesto kde by mali byť vytvorený naši agenti, pridané do zoznamu agentov. agentList je objekt typu java.util.ArrayList poskytovaný triedou SimpleModel práve na tento účel. Predpokladá sa, že trieda Player je konštruovaná z referenciou na počiatočnú stratégiu a obsahuje aj metódu setOpponent() na nastavenie referencie na protihráča.

Poradie vykonávania je také, že sa najskôr volá metóda setup() a potom buildModel(). Akokoľvek, ako bolo uvedené vyššie, metóda setup() je volaná keď je simulácia prvýkrát spustená a kedykoľvek je stlačené tlačidlo "setup". Metóda buildModel() nie je volaná pokiaľ simulácia beží, takže nie je volaná, pokiaľ sú stlačené tlačidlá "run", "step" alebo "initialize". (Viď nižšie viac informácií o tom, ktorý kód je vykonaný pri stlačení ktorého tlačidla.) Toto umožňuje používateľovi meniť parametre prostredníctvom GUI.

Teraz keď máme nastavovanie dokončené, potrebujeme definovať čo sa má stať v každom časovom kroku simulácie. SimpleModel poskytuje na to tri metódy. Zámerom je oddeliť základné správanie v metóde step() od akéhokoľvek pre- a post- spracovania. V našom príklade nepotrebujeme žiadne pre- a post- spracovanie, takže použijeme iba metódu step():


import uchicago.src.sim.engine.SimpleModel; public class MyModel extends SimpleModel { // rovnaké ako vyššie public void setup() { // rovnaké ako vyššie } public void buildModel() { // rovnaké ako vyššie } public void step() { int size = agentList.size(); for (int i = 0; i < size; i++) { Player p = (Player)agentList.get(i); p.play(); } } }

Tu v metóde step() získame každého agenta zo zoznamu agentov a pre každého z nich voláme metódu play(). Toto je obvyklé správanie sa metódy step(), ktorá iteratívne prechádza všetkými agentmi a vykonáva správanie sa každého z nich. Keď simulácia beží, je to práve metóda step(), ktorá sa vykonáva v každom časovom kroku.

Odlišná aplikácia môže vyžadovať metódy preStep() a/alebo postStep(), napríklad ak je potrebná kooperácia medzi viacerými hráčmi a každý hráč prijíma úplatok od susedných hráčov, svojich susedov naopak nahovára na najlepšiu stratégiu a adekvátne mení aj svoju stratégiu. V tomto prípade aktuálna hra môže byť definovaná v metóde step() ako tomu bolo predtým a nahováranie susedov a nastavovanie vlastnej stratégie by mohlo byť v metóde postStep().

Je tu aj alternatívne použitie metódy step() v našom modeli. Môžeme použiť autokrokovací mechanizmus. Ak sa pre toto rozhodneme, SimpleModel bude opakovane prechádzať všetkých našich agentov a volať pre každého z nich jeho metódu step(). Aby toto bolo možné, náš agent musí implementovať rozhranie Stepable. Toto rozhranie má jedinú metódu a tou je metóda step(). Pripomeňme, že tu ide o metódu step() definovanú v triede agenta, nie v triede modelu. Tento autokrokovací mechanizmus nahrádza metódu step() takú ako bola uvedená vyššie. Na použitie autokrokovacieho režimu je potrebné nastaviť premennú autoStep na hodnotu true v konštruktore modelu. Tiež je možné nastaviť premennú shuffle na hodnotu true alebo false v závislosti od toho, či chceme alebo nechceme aby boli agenti obsluhovaný v náhodnom poradí.

S použitím RePastu je možné aj komplikovanejšie správanie sa agentov, spracovanie udalostí, dynamické plánovanie, etc.

Vzťah medzi rozličnými tlačidlami nástrojovej lišty a vykonávaným kódom je nasledujúci. Keď je kliknuté na tlačidlo setup, je vykonaný kód v metóde setup(). Keď je kliknuté na tlačidlo initialize, je vykonaný kód v metóde buildModel(). Keď je kliknuté na tlačidlo step, je vykonaný kód v metóde buildModel() a potom je vykonaná sekvencia kódu uvedeného v metódach preStep(), step() a postStep(). Keď je kliknuté na tlačidlo start, je vykonaný kód v metóde buildModel() a potom je opakovane vykonávaná sekvencia kódu uvedeného v metódach preStep(), step() a postStep(), až kým nie je požívateľom stlačené tlačidlo stop

Hore
Kontakt: Marek Bundzel