ICP: zadání týmového projektu
UPOZORNĚNÍ:
toto je stále ještě PRACOVNÍ VERZE,
která bude upřesněna podle připomínek studentů a kolegů
Změny textu od data zadání projektu:
2007-03-04: Opraven název programu na "agents2007"
2007-04-26: Název odevzdaneho archivu bude xjmenovedouciho.{ZIP|tar.gz}
Název projektu
Simulátor agentního systému
Termín a způsob odevzdání
Termín odevzdání je uveden v IS.
Řešení zabalené ve formátu .ZIP nebo .tar.gz odevzdá vedoucí týmu do IS.
Hodnocení
Projekt je hodnocen na stupnici 0-100 procent/bodů.
Po ohodnocení dojde k přepočtu bodů na jednotlivé členy týmu podle návrhu
vedoucího týmu -- podrobnosti viz předmět IPP.
Hodnocení zahrnuje kvalitu OO návrhu, kvalitu implementace v C++, dodržování
stylu psaní programu (odsazování, kvalita komentářů, vhodné identifikátory)
a především funkčnost programu. Pokud budou ve zdrojových textech chybět
podstatné komentáře (zvláště jména autorů), bude projekt hodnocen 0b.
Podrobnosti k zadání
Implementujte jednoduchý simulátor agentního systému. Aplikace umožňuje
vytvořit scénu, umístit do ní agenty, definovat chování agentů a spustit
simulaci chování agentů. Jednotlivé objekty scény se vykreslují podle
aktuálního stavu simulace. Aplikace musí mít následující komponenty
rozhraní:
- Menu
- Ovládací tlačítka
- Scéna (plocha) s možností zoom a posouvání pokud je větší než okno
- Paleta objektů, které lze vložit na scénu
- Stavové informace
- Editor chování agentů
- Konfigurační soubor ve formátu XML
- Jednoduchý systém nápovědy – HELP
Pro vytváření menu, dialogů a dalších komponent uživatelského rozhraní
použijte toolkit wxWidgets (http://www.wxWidgets.org/) verze 2.8 (je
nainstalován v učebnách a na serveru "merlin" - prikaz wx-config-2.8).
Inspiraci můžete nalézt v podadresáři wx*/demos/life.
Požadované funkce:
- Aplikace má dva základní režimy, mezi kterými se lze přepínat:
editační (EDT) a simulační (SIM).
- Editační režim umožňuje tvorbu scény. Na scénu lze libovolně vkládat
objekty, přemisťovat objekty a editovat chování agentů.
V editačním režimu lze kdykoliv uložit/načíst scénu a její stav do/ze
souboru ve formátu XML (použijete vhodnou knihovnu),
Z editačního režimu se lze přepnout do simulačního režimu –
simulovat se bude aktuální scéna. Po přepnutí se začne scéna simulovat.
- Simulační režim.
Při simulaci se agenti pohybují po scéně a provádějí činnosti
definované v popisu jejich chování.
Simulace je řízena cyklem v časových krocích, musí být umožněno nastavení prodlevy mezi
kroky (aby byl pohyb agentů na scéně viditelný).
Například:
inicializace, vykreslení scény
while (není konec) {
pro všechny pohyblivé objekty provedeme posun, testujeme a řešíme kolize
posuneme modelový čas
vložíme čekání
vykreslení scény
}
Simulaci lze kdykoliv zastavit – přejde se do editačního režimu
(stav scény zůstává zachován po posledním kroku simulace).
Rozběhnutou simulaci je možné kdykoliv uložit a posléze se k ní
vrátit a pokračovat v simulaci.
- Aplikace má konfigurační soubor ve formátu XML (načte se při startu,
uloží při změně konfigurace). Použijte vhodnou knihovnu pro zpracování XML
(
Xerces,
eXpat,
TinyXML
nebo jinou).
Zvažte možnost několika konfiguračních souborů -- systémový (globální),
uživatelský (v $HOME) a lokální pro aktuální adresář. Postupuje se tak, že se ke globální
konfiguraci přidá lokální nebo uživatelská pokud existují. Lokální/uživatelská
konfigurace může změnit přednastavené hodnoty v globální konfiguraci. Pokud
neexistuje žádný konfigurační sobor, použijí se implicitní hodnoty
(obvykle prázdné, u help souboru nějaká předdefinovaná implicitní pozice, ...).
- Jednoduchý systém nápovědy - HELP. Podrobnější specifikace je v zadání z
předmětu IPP. Jméno a cesta k souboru s nápovědou je uloženo v konfiguraci a
při instalaci programu bude správně nastaveno. Na prohlížení nápovědy můžete
zavolat externí prohlížeč (nemusíte ho programovat).
Plocha
Scéna může obsahovat následující typy objektů (každý typ může mít různé
variace):
- Pevný objekt (např. zeď)
- Přemistitelný objekt (např. kámen, míček, ...) – objekt, který může být
přenesen agentem
- Pohyblivý objekt (agent) – aktivní objekt, který se sám posunuje po
scéně a může přemisťovat přemistitelné objekty. Implementujte alespoň dva
různé typy agentů (např. agent, který může přemisťovat předměty a agent, který
to neumí). Chování agentů je uživatelsky programovatelné (viz dále).
Chování agenta
- Chování agenta je definováno jeho reakcemi na události. Každé události
odpovídá metoda, která událost ošetřuje.
V systému uvažujte například tyto události:
- Náraz na okraj scény (toto můžete vynechat, pokud bude celá scéna vždy celá obehnána zdí)
- Náraz na pevný objekt
- Náraz na přemistitelný objekt
- Náraz na jiného agenta
- Krok simulace
- Agent umí provádět tyto základní operace:
- otočit se doleva/doprava/zpět
- vzít předmět
- odložit předmět
- udělat krok (ev. více kroků) dopředu
- při kroku může zanechávat stopu (např. 5 kroků zpět). Stopou se myslí
např. vykreslit čáru.
Uživatelsky programovatelný agent – jeho chování (reakce na
události) je popsáno uživatelem speciálním jazykem. Editor chování umožní
popis činnosti agenta
jednoduchým skriptovacím jazykem
obsahujícím alespoň podmínky, přístup k
proměnným a volání akcí.
(Můžete například použít některé vhodné
již existující interprety jazyků Lisp, Scheme, Forth, atd.)
Následující ukázky berte jako příklad možné
realizace, syntaxe a klíčová slova nejsou předepsané:
- Reakce na událost náraz na přemistitelný objekt
(transferableObjectColision): pokud již agent nějaký objekt drží (je uložen v
proměnné myobject), jde doleva, jinak vezme ležící objekt.
transferableObjectColision {
if (myobject != null) {
goleft();
} else {
takeObject();
}
}
- Reakce na událost náraz na pevný objekt (fixedObjectColision): pokud je
levé políčko od agenta volné, jde doleva. Pokud je volné pravé, jde doprava,
jinak jde zpět.
fixedObjectColision {
if (isLeftFree()) {
goleft();
} else if (isRightFree()) {
goRight();
}
else {
goBack();
}
}
Ukládání agenta
- Konkrétního agenta s definovaným chováním lze uložit jako součást palety
agentů (tj. dát mu název, uložit jeho popis do XML souboru a nabízet ho jako
položku palety).
- Součástí odevzdání budou alespoň tři takoví agenti
- Jeden z agentů bude implementovat následující chování
- přemisťuje se po scéně náhodně
- pokud narazí na přemistitelný předmět, zvedne ho a dále se pohybuje
s tímto předmětem
- pokud narazí na přemistitelný předmět a již má jiný, umístí držený
předmět na aktuální pozici (nelze je dávat na sebe)
- pokud narazí na překážku, obejde ji (zahne doleva/doprava, otočí se, ...)
- překážkou se rozumí pevný objekt nebo okraj scény
Doporučení
- Scénu rozdělte do pravidelné mřížky, objekty se umisťují do jednotlivých
políček, agenti se přesunují po políčkách
- Součástí simulátoru je algoritmus, který detekuje kolize a
při kolizi generuje událost (zašle příslušnou zprávu objektům)
- Když se setkají dva nebo více agentů, je třeba poslat zprávu o kolizi
všem zůčastněným. Můžete zkusit implementovat i agenty, kteří "vidí" na
zadanou vzdálenost a mohou reagovat na situaci.
- Zkuste se inspirovat celulárními automaty (CA)
- Používejte vhodné návrhové vzory (Design Patterns).
Při návrhu postupujte tak, aby výsledný program byl dobře použitelný.
Hodnotit se bude nejen to, zda splňuje výše uvedené požadavky, ale také JAK je
splňuje.
Poznámky k implementaci a odevzdávání
- Program bude vytvořen zadáním příkazu make v adresáři s rozbalenými
zdrojovými kódy projektu (pozor - bude se automaticky překládat).
Musíte tedy vytvořit soubor Makefile. Výsledný program se bude jmenovat
"agents2007".
- Odevzdaný archiv obsahuje minimálně tuto adresářovou strukturu:
xnamevedouciho/src/* - zdrojové texty
xnamevedouciho/doc/* - dokumentace - pro IPP
xnamevedouciho/README - základní přehled o co jde, Autoři, ...
xnamevedouciho/Makefile - zavolá rekurzivně make na src/Makefile a případně
na dokumentaci
- Neodevzdávejte spustitelné přeložené programy.
(Příkaz "make clean" všechny produkty překladu smaže,
"make pack" vytvoří archiv pro odevzdání.)
- Všechny zdrojové soubory musí obsahovat na začátku komentář se jmény
autorů daného modulu, popisem obsahu modulu, atd.
Pokud nepůjde přeložit příkazem make = 0b,
pokud nebudou komentáře se jmény autorů = 0b.
Nevhodně formátovaný a nečitelný kód = 0b
[TODO: doplnit]
Poslední modifikace:
26. dubna 2007
Pokud naleznete na této stránce chybu, oznamte to dopisem na adresu
peringer AT fit.vutbr.cz