Prírodou inšpirované algoritmy

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

Späť ku kurzom triedy
Obsah
Úvod
Dátové typy a klauzuly
Pravidlá, databázy a bázy pravidiel
Agenti a štruktúry
Modelovanie času, odpaľovanie pravidiel
Obrázky prostredia
Linky
O tejto kapitole



Ostatné kapitoly
Swarm
RePast
LEM
SDML
Eos
DDLab


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


Modelovanie času, odpaľovanie pravidiel

Modelovanie času

Časový úsek (time level) je zabudovaný štandardný typ v SDML. Štandarná hodnota časového úseku je eternity, čo je čas, kedy sa vykonajú všetky dopredne reťazené pravidlá (simulácia skončí). Užívateľ si môže definovať akékoľvek množstvo časových úsekov a priradiť k nim agentov. Každý časový úsek má inicializačnú a ukončovaciu bázu pravidiel. Pri aplikovaní časových úsekov sa aplikujú najprv najväčšie časové úseky a postupne sa vykonávajú pravidlá vo vnorených časových úsekoch. Napríklad najprv sa vykoná inicializácia týždňa, potom prvého dňa v týždni, ďalej pokračujú dni v týždni, týždeň sa uzavrie a inicializuje sa nový týždeň atď. Inicializačná báza pravidiel kontajnera sa vykoná pred agentmi ktorých obsahuje, ukončovacie nasledujú v opačnom poradí.

Vykonávanie (odpaľovanie - firing) pravidiel

Najčastejšie sa používa dopredné reťazenie (forward chaining) pravidiel. Dopredne reťazené previdlá sú odpaľované nachádzaním väzieb premenných, pre ktoré sú príčinné výroky pravdivé. Zároveň sa predpokladá, že aj dôsledková časť je pravdivá pre tie isté väzby premenných. Jedno pravidlo môže byť odpálené viackrát s inými väzbami premenných. Pravidlo spolu zo slovníkom väzieb sa nazýva inštancia pravidla. Odpálením jednej inštancie sa príčinná časť iného pravidla môže stať pravdivou. Takto pokračuje dopredné reťazenie, až kým každá inštancia má pravdivé príčinné aj dôsledkové časti. Väzby premenných pre príčinné klauzuly sú hľadané vyhodnocovaním týchto klauzúl. Klauzuly s primitívami sú vyhodnocované vykonaním príslušného kódu v implementačnom jazyku SDML (momentálne Smalltalk), ostatné klauzuly sú vyhodnotené vybraním z databáz. Vyhodnotenie klauzuly zisťuje podmienky, pre ktoré je pravdivá. Klauzula môže byť pravdivá niekoľkokrát, vždy pre iné väzby svojich premenných, až kým sa nevyčerpajú všetky možnosti. Pravidlá majú často zloženú príčinnú časť. Skladá sa z podklauzúl spojených primitívom AND. Ak je prvá podklauzula úspešná, vyhodnocuje sa druhá podklauzula s tými istými väzbami, výsledné väzby sú aplikované na tretiu atď.

Keď sú úspešné všetky príčinné klauzuly, pravidlo je vykonané. Po odpálení pravidla, alebo neúspechu podklauzuly, SDML vykoná backtrack a hľadá ďalšie väzby pre doteraz úspešné klauzuly. Vždy keď su všetky príčinné klauzulu úspešné, ich väzby sú aplikované na dôsledkové klauzuly. Tieto sú potom vykonané, čím sa dokončí odpálenie pravidla.

Vykonanie klauzuly najčastejšie znamená jej zapísanie do niektorej databázy. Po odpálení pravidla sa neprechádza hneď na ďalšie pravidlo. Zvyčajne je rýchlejšie vykonať backtrack a nájsť ďalšie inštancie pravidla, ako potom začínať hľadanie odznova. Poradie v akom sú inštancie odpaľované je určené čisto len efektívnosťou. Príčinné klauzuly sú vyhodnocované v poradí v akom sú zapísané v pravidle, keďže najefektívnejšie usporiadanie by bolo ťažké zisťovať automaticky. Pretože SDML je deklaratívne, zmena poradia príčinných klauzúl nemôže mať vplyv na výsledky. Niektoré primitíva nemôžu byť vyhodnotené skôr, ako je naviazaných dostatok premennýchm lebo majú nekonečne veľa riešení (sum ?a ?b 4). Takéto klauzuly sú odložené, kým nieje naviazaný dostatočný počet premenných.

Hore
Kontakt: Marek Bundzel