Az ágensek programozása

A szimulációt és a robotágenseket működtető keretrendszer egy hagyományos Java alkalmazás formájában került megvalósításra. Az alkalmazáson belül három package található: az rescueagents tartalmazza a robotokat vezérlő ágens osztályt, a rescueframework a keretrendszer forrásfájljait, míg a world package a világot leíró fájlokat tárolja.

Az ágensek működése

Az rescueagents package MedicRobotControl és RescueRobotControl osztályaiban van lehetőség az ágensek intelligenciájának implementálására. A *RobotControl osztályok az AbstractRobotControl leszármazottjai, ahol a robotok egyedi számmal történő ellátása került implementálásra.

Az ágensek a szokásos észlelés - cselekvés modell szerint működnek: észlelik a külvilág állapotát, eseményeit, és akcióikkal befolyásolják azt.

A világ érzékelése

A robot a RobotPercepcion interfészen keresztül az alábbi függvényekkel fér hozzá a világ állapotához:

public int getTime();
Visszaadja a szimulációs idő értékét.

public ArrayList getExitCells();
Visszaadja az exit cellák listáját.

public ArrayList getUnknownCells();
Visszaadja a robotok által még fel nem derített cellák listáját.

public ArrayList getDiscoveredInjureds();
Visszaadja a már felderített sérültek listáját.

public ArrayList getRobots();
Visszaadja a robotok listáját.

A robotok egyszerű fejlesztése érdekében a keretrendszer további speciális észleléseket is biztosít:

public Path getShortestExitPath(Cell start);
Kiszámítja a legközelebbi kijárathoz vezető utat.

public Path getShortestUnknownPath(Cell start);
Kiszámítja a legközelebbi felderítetlen cellához vezető utat.

public Path getShortestInjuredPath(Cell start);
Kiszámítja a legközelebbi sérülthöz vezető utat.

A visszakapott Path objektum getFirstCell() függvénye adja a cél felé vezető út első lépését. Az úton történő elinduláshoz a visszakapott Cell objektum directionFrom(robot.getLocation()) meghívása használható. Ez a keresés elég "buta", sok információt nem vesz figyelembe az útvonaltervezés során.

Az ágensek implementálása során az itt bemutatott érzékelésekre kell támaszkodni, tehát a világot direktben reprezentáló world.Map osztályhoz nem fordulhatnak az ágensek információért! Természetesen az egyes érzékelések által visszaadott objektumok (pl. ismert sérültek listája, útvonalak, már felfedezett cellák) további lekérdezésére lehetőség van (így pl. a felfedezett sérültek állapota megismerhető).

A robot belső érzetei

A robot néhány saját belső állapotváltozóval is rendelkezik, amelyek az alábbi függvényekkel kérdezhetők le:

public Cell getLocation();
Visszaadja a cellát, amelyen a robot tartózkodik.

public boolean hasInjured();
Visszaadja, hogy a robot visz-e sérültet.

public Injured getInjured();
Visszaadja a szállított sérültet.

public boolean hasMedicine();
Visszaadja, hogy a robotnak van-e még gyógyszere.

public int getMedicine();
Visszaadja mennyi gyógyszere van még a robotnak.

Természetesen további belső állapotváltozók is létrehozhatók a kitalált megoldásnak megfelelően.

Cselekvések

A szimulátor lépésenként futtatja az ágensprogramokat. Az egyes lépésekben a RobotControl osztály step() függvényét hívja meg, amely egy Integer objektummal tér vissza. Ez a visszatérési érték az ágens cselekvése az adott lépésben. Jelentése az alábbi lehet:

A visszaadott érték alapján a szimulátor ellenőrzi, hogy az adott akció az ágens számára engedélyezet-e (lehet-e arra lépni, gyógyítani vagy felvenni), és ha igen, végrehajtja az akciót. A Medic is szállíthat sérülteket (ha éppen nem gyógyít), a Rescue azonban nem tud gyógyítani.

Az ágensprogramok más módon nem befolyásolhatják a világot, nem mozgathatják a robotokat. nem szállíthatnak vagy gyógyíthatnak sérülteket.

Útvonalkeresés

A beépített útvonalkereső "észlelések" helyett saját algoritmus is készíthető. Ennek során kívánság szerint használható a world package AStarSearch statikus osztálya, mellyel A* keresést lehet megvalósítani két cella között a robotok által ismert cellákat figyelembe véve:

public static Path AStarSearch.search(Cell start, Cell target, int maxDistance)
A* algoritmussal kiszámítja a két cella közötti legrövidebb, maximum MaxDistance hosszú utat.
A maxDistance értékét -1-re állítva nincs korlátozás a megtalált út hosszára.
Ha nem található út a két cella között, akkor a függvény NULL értékkel tér vissza.

Természetesen saját útvonalkereső algoritmus is implementálható a cellák adataira támaszkodva.

Véletlenszámok generálása

A világban történnek véletlen események, illetve az ágensprogramok is hozhatnak véletlenszerű döntéseket. Annak érdekében, hogy ezek ne befolyásolják a versenyt, illetve a fejlesztést, a keretrendszer az álvéletlen-generátort rögzített seed értékkel inicializálja (lásd Java.util.Random()). A seed értéke eltérhet a keretrendszer kiadott és értékelésre használt változatában.

A világ és a szimuláció működése

A világ működésének felfedezése alapvetően a versenyzőkre hárul. Amire felhívjuk a figyelmet:

A keretrendszer több mintaként kiadott térképet is tartalmaz. A fejlesztést érdemes a "Default" térképen kezdeni.