AgentSpeak - úpravy agenta, vlastní akce
Pro dnešní cvičení využijeme jeden ze složitějších příkladů z Jasonu. Napřed si ukážeme, jak se dá napsat vlastní reprezentace světa agenta a jak přidat vlastní interní akce.
Dnešní zdrojové kódy najdete opět přímo v Jasonu, v adresáři examples/gold-miners-II
. Jedná se o starší scénář ze soutěže týmů agentů. Agenti se pohybují v prostředí a jejich cílem je těžit zlato. Každý agent uveze maximálně tři kusy zlata najednou, natěžené zlato vozí ke sběrači. V každém týmu může být až šest těžících robotů a jeden jejich velitel.
Vlastní architektura agenta
Na minulých cvičeních jsme využívali výchozí funkce pro práci se zprávami a vjemy a jako reprezentaci prostředí jsme používali informace, které se daly odvodit přímo z beliefs agenta. To je sice jednoduché, ale není to moc pohodlné. Jason nám proto umožňuje upravit si architekturu agenta. Můžeme tedy napsat vlastní funkce na zpracování příchozích zpráv a vjemů; můžeme si napsat vlastní interní akce (protože některé věci se v Javě píšou snáze než v AgentSpeaku) a můžeme si vytvořit i vlastní reprezentaci prostředí (v té se nám zase třeba budou snáze hledat cesty apod.).
Vlastní architekturu agenta si vytvoříme tak, že napíšeme potomka třídy AgArch
. V té potom můžeme předefinovat metody java.util.List<Literal> perceive()
, void checkMail()
a případně i další.
Přepsání metody checkMail()
se hodí, když s některými zprávami chceme zacházet jinak než obvykle. Příklad, ze kterého dnes vycházíme, dělá to, že v této metodě odstraňuje zprávy o překážkách a pozici agentů a rovnou podle nich mění model (a přidává je mezi beliefs). Díky tomu je agent schopný zpracovat několik zpráv v každém cyklu místo jen jedné a zároveň si tím správně aktualizuje svůj vnitřní model světa. (viz arch/MinerArch.java
).
Z podobného důvodu se hodí i přepsání metody perceive()
. V našem příkladu opět tato metoda zpracovává postupně všechny vjemy a upravuje podle nich model světa agenta. Ve frontě nechává jen ty vjemy, na které agent musí reagovat. (arch/LocalMinerArch.java
, a metody z arch/MinerArch.java
). Agenti také jako svou vnitřní reprezentaci světa používají kopii prostředí. Do té si poznamenávají, co o světě ví, buď ze zpráv, nebo z vlastních vjemů. viz (viz arch/LocalWorldModel
).
Architektura, kterou má agent používat, se specifikuje v .mas2j
souboru u agenta jako agentArchClass
(viz příklad).
Vlastní úprava BeliefBase
Minule jsme také zmiňovali, že v některých případech se hodí mít vlastní funkci, která bude upravovat beliefs agenta, když se něco nového dozví.
Toho se dá docílit tím, že napíšeme potomka třídy DefaultBeliefBase
a té upravíme metodu add
. V příkladu můžete vidět dva příklady - jeden zajišťuje, že belief s daným funktorem má agent jen jednou (automaticky se aktualizuje, když přijde nová se stejným), druhý zajišťuje, že některé beliefs jsou rovnou zahozeny (informace z nich agenta nezajímají, nebo jsou už v jeho modelu světa poznamenány). Na detaily implementace se koukněte do souborů agent/UniqueBelsBB.java
a agent/DiscardBelsBB.java
.
BeliefBase, kterou má agent používat, se opět specifikuje v souboru .mas2j
, tentokrát jako beliefBaseClass
.
Vlastní úprava funkce výběru událostí
Pokud chceme upravit funkci pro výběr události, na kterou se má reagovat (nebo nějakou jinou funkci), stačí implementovat vlastního potomka třídy Agent.
Vzorový agent upravuje konkrétně funkci pro výběr události tak, aby napřed reagoval na objevení nového zlata (tato událost má tedy nejvyšší prioritu).
Nová třída agenta se opět dá nastavit v .mas2j
souboru a její příklad najdete v souboru agent/SelectEvent.java
.
Definice vlastních interních akcí
Interní akce agenta mu umožňují měnit svou vnitřní reprezentaci, komunikovat s ostatními agenty a obecně provádět cokoliv, co se v AgentSpeaku dělá špatně (např. hledat cesty v prostředí).
Pokud budete chtít napsat svojí vlastní akci, je potřeba vytvořit potomka třídy DefaultInternalAction
a v tom naimplementovat metodu execute()
. Tato metoda má tři parametry, jeden z nich je TransitionSystem
, ze kterého dostanete informace např. o agentově reprezentaci světa a jeho vnitřním stavu. Dalším parametrem je unifikátor, pomocí kterého můžete provádět unifikace s proměnnými v AgentSpeaku a nakonec dostanete seznam Term
ů, které měla akce na svém vstupu. Nejlepší je opět se podívat na příklady. Najdete je v adresáři jia
. Vhodné je začít např. akcí obstacle
, která rozhoduje, zda na dané pozici je překážka.
Zadání úkolu
Vaším úkolem v této soutěži je napsat strategie pro tým 6 agentů, kteří budou těžit zlato na čtvercové mřížce. Kromě těchto šesti agentů můžete mít ještě jednoho, který bude celý tým řídit, nebo se starat o rozdělení práce mezi nimi.
Prostředí v této soutěži je čtvercová mřížka, kde na některých místech je zlato, na jiných může být překážka. Na jednom místě je sklad, do kterého agenti zlato vozí. Ten je pro oba týmy na stejném místě. Agent těží zlato tím, že zavolá akci pick
, může ho odložit tím, že zavolá drop
(pokud ho odloží na místě, kde je sklad, přičítá se jeho týmu bod za každý odložený kousek zlata). Každý agent může současně nést jen tři kousky zlata.
Prostředí poskytuje následující akce:
pick
- sebere zlato z pozice, kde zrovna stojí robotdrop
- odloží zlato na místo, kde zrovna stojí robotup
,down
,right
,left
- pohne se o jedno políčko zadaným směrem Akce je potřeba zadávat jakodo(<akce>)
, např.do(drop)
.
Prostředí na začátku simulace poskytuje agentům následující vjemy:
gsize(sID, W, H)
- prostředí pro simulaci s IDsID
má šířkuW
a výškuH
depot(sID, x, y)
- v simulaci IDsID
je cíl na souřadnicíchx
,y
steps(sID, n)
- simulace s IDsID
poběží pon
kroků
Během simulace prostředí potom poskytuje následující
pos(x,y,s)
- v kroku s je agent na pozici (x,y)cell(x,y,t)
- na pozici(x,y)
je věct
(obstacle
,gold
,enemy
,ally
,empty
) pro všechna políčka kolem agenta (do vzdálenosti 1)container_has_space
- agent unese další zlatocarrying_gold(n)
- agent nesen
kousků zlata
Agentům se počítá únava, a ta určuje, z jakou pravděpodobností selžou vjemy (tj. agent se v tu chvíli nedozví nic) nebo akce (agent prostě akci neprovede). Únava agenta záleží na množství zlata, které právě nese (čím více, tím větší, mezi 0.1 a 0.5, lineárně za 0 - 3 ks zlata).
Pravidla a tipy
Při implementaci se můžete inspirovat existujícími ukázkovými agenty, implementaci do soutěže ale napište sami. Můžete pracovat v týmu až 4 studentů. Vymyslete si unikátní jméno týmu a používejte ho jako prefix názvu všech souborů, které změníte (a budete odevzdávat).
Při implementaci se vám mohou hodit metody .send
a .broadcast
, které posílají zprávu buď konkrétnímu agentovi, nebo všem ve vašem týmu. Metoda .send
má tři parametry
- příjemce
- performative (co zpráva je) -
tell
označuje, že jde o informaci;achieve
znamená, že jde o žádost auntell
je informace, která má být zapomenuta - samotný obsah zprávy
Akce .broadcast
má jen poslední dva parametry. V akci .broadcast
v příklady z Jasonu je bug – posílá zprávu jen prvním třem agentům v týmu. Můžete ji opravit tak, že vytvoříte novou verzi souboru arch/MinerArch.java
a všech souborů, které na něm závisí, nebo si ji můžete napsat ručně přímo v AgentSpeaku tak, že uděláte plán, který pošle zprávu explicitně všem agentům pomocí akce .send
.
Obsah zprávy je typicky fakt v AgentSpeaku (podobně jako jsou vjemy z prostředí) a defaultně se při přijetí přidá do agentovy belief base s anotací zdroje.
Hodnocení
Každý člen týmu, který odevzdá agenta, který porazí dummy agenta z příkladů (toho v adresáři asl
) dostane 8 bodů. Uděláme turnaj a 4 nejlepší týmy z turnaje (obou skupin dohromady) dostanou 10 bodů. (Počet týmů s bonusem se může zvýšit, pokud by se ukázalo, že máme celkově týmů hodně.)
Deadline: 8. dubna 2024