Prírodou inšpirované algoritmy

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

Späť ku kurzom triedy
Obsah
Prostredie, jazyk, adresovanie
Inštrukcie, adresovacie módy a operátory



Ostatné kapitoly
LEE
Framsticks
EINSTein
Nerve garden
Poly World
Simulácia evolúcie rozhodovania
Nornovia
Creatures 3
Primordial Life
Core War
Desktop Garp
Tierra
Avida


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


Inštrukcie, adresovacie módy a operátory

Tu je zoznam inštrukcii používaných v Redcode:

  • DAT - dáta (zabíja proces)
  • MOV - pohyb (kopíruje dáta z jednej adresy na druhú)
  • ADD - sčítanie (sčítava dve čísla)
  • SUB - odčítanie (odčítava dve čísla)
  • MUL - násobenie (násobí dve čísla)
  • DIV - delenie (delí dve čísla)
  • MOD - modulo (vypočíta zvyšok po delení)
  • JMP - skok (pokračuje vo vykonávaní s inej adresy)
  • JMZ - skok ak je nula (testuje číslo a skočí ak je ono 0)
  • JMN - skok ak nie je nula (testuje číslo a skočí ak nie je ono 0)
  • DJN - decrementuje a skok ak nie je nula (odčíta 1 a ak výsledok je 0, tak skočí)
  • SPL - rozdeliť (druhý začína proces na inej adrese)
  • CMP - porovnaj (rovnaké ako SEQ)
  • SEQ - preskoč ak je rovné (porovná 2 inštrukcie a ak sa rovnajú, tak preskočí nasledujúcu)
  • SNE - preskoč ak nie je rovné (porovná 2 inštrukcie a ak sa nerovnajú, tak preskočí nasledujúcu)
  • SLT - preskoč ak je menšie ako (porovná 2 inštrukcie, a ak 1. < 2., tak preskoč nasledujúcu)
  • LDP - prečítaj z p-miesta (vyberie číslo so súkromného odkladacieho priestoru)
  • STP - ulož na p-miesto (uloží číslo do súkromného odkladacieho priestoru)
  • NOP - žiadna operácia (nerob nič)

DAT inštrukcia nie je vykonateľná. Ak ju MARS nájde, program, ktorému inštrukcia patrí, sa vyhlási za porazeného.

Autori sa ďalej pohrávali s myšlienkou vložiť extra inštrukcie, ktoré urobia opravovanie a ochranu trochu jednoduchšími. Napr: Pomocou inštrukcie PCT A (protected), ktorá ochráni inštrukciu na adrese A pokiaľ nebude vykonaná. Otázkou zostáva, nakoľko môže byť zraniteľnosť programu redukovaná zneužívaním týchto inštrukcií.

S útočným použitím tejto inštrukcie prišli nezávisle na sebe Stephen Peter z Timaru, Nový Zeland a Mark A. Durham z Winston-Salem, N.C.. Program TRAP-DWARF kladie bomby ako jeho predchodca DWARF, ale každú ešte ochráni proti prepísaniu. To znamená, že nepozorný nepriateľský program môže spadnúť do tejto pasce pri zapisovaní sa do novej arény. Zapísanie inštrukcie na adresu, kde je chránená nula bude neúspešné. Neskôr, ak nový program bude chcieť vykonať inštrukciu z tejto adresy, tak zomrie, pretože nula nie je vykonateľná inštrukcia.

Robert Norton navrhol, aby každá strana v Core War súbojoch mala dovolené vykonanie viac ako jednej inštrukcie. Tak pribudla inštrukcia SPL A (split) . Ak vykonávanie dosiahne tento bod, rozdelí sa do dvoch častí. Prvá sa nachádza vždy hneď za inštrukciou SPL a druhá začína od adresy A. To znamená, že každý Core War hráč môže mať niekoľko nezávislých programov bežiacich na raz. Preto je potrebné zadefinovať, ako bude MARS prideľovať tieto inštrukcie.

Dá sa to ilustrovať na dvoch hráčoch, kde prvý má programy A1-A3 a druhý B1 a B2. Programy sa budú striedať po jednej inštrukcií. Tak vznikne postupnosť A1 B1 A2 B2 A3 atď.

Najjednoduchší program, ktorý využíva túto inštrukciu je IMP GUN:

SPL 2, JMP -1, MOV 0 1

SPL 2 hovorí, že budú dva prúdy vykonávania programu. Prvý prúd je vykonanie inštrukcie JMP -1, ktorá skočí na SPL 2 a druhý prúd je vykonanie inštrukcie MOV 0 1, ktorá uvedie do pohybu klasický Imp. Takto bude vznikať stále rastúca armáda Impov. Na prvý pohľad sa môže zdať, že neexistuje žiadna obrana proti tejto armáde, ale jedna existuje:

IMP PIT(stomper): MOV #0 -1, JMP -1

Je to jednoduchý program, ktorý sa väčšinou spustí cez inštrukciu SPL A vo väčších programoch na ochranu slabého miesta. Imp Pit zapíše na adresu pred sebou nulu, ktorou rozpráši prichádzajúci Imp Gun.



Tu sú operátory používané v Redcode:

Adresovacie módy od roky 1994:

  • #    okamžitý
  • $     priamy ($ môžeme vypustiť)
  • *     A-pole nepriamo
  • @     B-pole nepriamo
  • {     A- pole nepriamo s predekrementom
  • <     B- pole nepriamo s predekrementom
  • }     A- pole nepriamo s postinkrementom
  • >     B- pole nepriamo s postinkrementom

Priamy mód: MOV 3 100 hovorí, že sa skopíruje obsah adresy 3 na adresu 100. Nepriamy mód: MOV @3 100, hovorí, že sa skopíruje obsah adresy, ktorú sa nájde na adrese 3, na adresu 100. Okamžitý mód: MOV #3 100, hovorí, že sa uloží číslo 3 na adresu 100.

Tu sú operátory používané v Redcode:

Aritmetické:

  • -   odčítanie ( alebo negácia)
  • *   A-pole nepriamo
  • @   B-pole nepriamo
  • /   delenie
  • %   modulo (zvyšok)

Porovnania:

  • ==   rovné
  • !=   nie je rovné
  • <   menšie ako
  • >   väčšie ako
  • <=   rovné alebo menšie ako
  • >=   rovné alebo väčšie ako

Logické:

  • &&   a zároveň
  • ||   alebo
  • !   nie

Niektoré preddefinované konštanty od štandardu '94:

  • CORESIZE -   veľkosť jadra (štandardne 8000)
  • PSPACESIZE --   veľkosť P-miesta (def. 500)
  • MAXCYCLES -   počet cyklov pokiaľ sa nezadefinujú (80000)
  • MAXPROCESSES -   max veľkosť zásobníka (8000)
  • WARRIORS -   počet programov v jadre (2)
  • MAXLENGTH -   max dĺžka programu (100)
  • CURLINE -   počet skompilovaných inštrukcií (1 - MAXLENGTH)
  • MINDISTANCE -   minimálna vzdialenosť medzi warriormi (100)
  • VERSION --   verzia pMARS (vynásobená x100) (80)

Hore
Kontakt: Marek Bundzel