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
|