Prírodou inšpirované algoritmy

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

Späť ku kurzom triedy
Obsah
Ako vytvoriť jednoduchý model?
Ako pracovať s pseudonáhodnými číslami?
Prehľad priestorov (spaces)



Ostatné kapitoly
Swarm
RePast
LEM
SDML
Eos
DDLab


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


Prehľad priestorov (spaces)

Priestory v RePast-e slúžia na dva účely. Môžu byť podkladom pre priestorových agentov ako napríklad priestor aplikácie. Tiež môžu slúžiť ako zbierka agentov ktorá definuje priestorové vzťahy agenta k iným agentom.

RePast ponúka nasledovné priestory. Pre viac informácií o nich viď API dokumentáciu. Poznamenajme, že sieťové priestory sú od ostatných odlišné.

  • Diffuse2D Diskrétna dvojrozmerná aproximácia priestoru, v ktorom môže prebiehať difúzia. Samotný priestor je toroidná mriežka, ktorej bunky sú tvorené premennými typu double.

  • Object2DGrid Diskrétna dvojrozmerná mriežka, ktorej bunky obahujú Object-y.

  • Object2DTorus Diskrétna dvojrozmerná mriežka, ktorej bunky obahujú Object-y.

  • Multi2DGrid Diskrétna dvojrozmerná mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je nedefinované.

  • OrderedMulti2DGrid Diskrétna dvojrozmerná mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je FIFO (first in, first out).

  • Multi2DTorus Diskrétna dvojrozmerná mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je nedefinované.

  • OrderedMulti2DTorus Diskrétna dvojrozmerná mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je FIFO (first in, first out).

  • Diffuse2DHexagonalDiskrétna dvojrozmerná aproximácia priestoru, v ktorom môže prebiehať difúzia. Samotný priestor je toroidná hexagonálna mriežka, ktorej bunky sú tvorené premennými typu double.

  • Object2DHexagonalGrid Diskrétna dvojrozmerná hexagonálna mriežka, ktorej bunky obahujú Object-y.

  • Object2DHexagonalTorus Diskrétna dvojrozmerná hexagonálna mriežka, ktorej bunky obahujú Object-y.

  • Multi2DHexagonalGrid Diskrétna dvojrozmerná hexagonálna mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je nedefinované.

  • OrderedMulti2DHexagonalGrid Diskrétna dvojrozmerná hexagonálna mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je FIFO (first in, first out).

  • Multi2DHexagonalTorus Diskrétna dvojrozmerná hexagonálna mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je nedefinované.

  • OrderedMulti2DHexagonalTorus Diskrétna dvojrozmerná hexagonálna mriežka, ktorej bunky môžu obsahovať viac ako jeden Object. Poradie Object-ov v každej bunke je FIFO (first in, first out).

  • RasterSpace Dvojrozmerná mriežka vyjadrujúca geografické údaje. Každá bunka môže obsahovať jeden Object. Pohyb v tomto priestore používa vzdialenosti, súradnice, alebo diskrétne polohy buniek.

Tieto priestory obsahujú metódy na vkladanie a vyberanie položiek na platných súradniciach. Tiež obsahujú metódy na obnovovanie zoznamu položiek v susedných poliach rovnako ako na získanie minimálnej a mazimálnej položky v susedstve. Čo znamená "minimum" a "maximum" je používateľsky definovateľné.

Použitie priestorov ako priestorovej zbierky agentov je skutočne jednoduché a je typicky predmetom záujmu pri vkladaní a odoberaní agentov do a z prostredia a možno pri dotazovaní sa na susedov agentov. Typickým vzorom je, keď všetky agenty sú v jednotnom priestore a majú referenciu na priestor. Napríklad v metóde buildModel() v našom modeli môžeme mať niečo ako:

Object2DGrid space = new Object2DGrid(spaceWidth, spaceHeight); for (int i = 0; i < numAgents; i++) { int x, y; do { x = Random.uniform.nextIntFromTo(0, space.getSizeX() - 1); y = Random.uniform.nextIntFromTo(0, space.getSizeY() - 1); } while (space.getObjectAt(x, y) != null); MyAgent agent = new MyAgent(x, y, space); space.putObjectAt(x, y, agent); agentList.add(agent); }

Prvý riadok vytvorí objekt typu Object2DGrid. V tomto priestore vytvorí niekoľko agentov typu MyAgent. Slučka do generuje pseudonáhodné súradnice x a y pre agenta a zapamätá si ich, ak miesto v priestore s týmito súradnicami je prázne. Potom je vytvorený agent, sú mu priradené vygenerované súradnice a referencia na priestor a je pridaný do priestoru na tieto súradnice. Poznamenajme, že pokiaľ používame jeden z Multi priestorov, nemusíme kontrolovať obsadenosť miesta kam chceme priradiť agenta, nakoľko na jednom mieste môže byť súčasne viacero agentov.

Bez ohľadu na to, aký typ prostredia použijeme, tento vzor je typický: agent má referenciu na priestor a pozná svoje vlastné súradnice. Pohyb agenta je záležitosťou zmeny interných súradníc agenta, jeho odstránenie z predchádzajúcej pozície a umiestnenie na novú. Napríklad:

space.putObjectAt(x, y, null); x = newX; y = newY; space.putObjectAt(x, y, this);

Ako môžeme vidieť, odstránenie agenta je dosiahnuté vložením hodnoty null na jeho pôvodnú pozíciu. Tento kód sa nachádza v agentovi, preto používame referenciu this na agenta, ktorého umiestňujeme. newX a newY boli nastavené mimo uvedeného výseku kódu a nenachádza sa tu ani žiadna kontrola obsadenosti miesta. Poznamenajme, že tento vzor (nastavenie hodnoty null na odstránenie, etc.) nie je pre prácu s Multi priestormi; pre bližšie informácie viď API dokumentáciu.

Hore
Kontakt: Marek Bundzel