SPADE ((engl.): Smart Python multi-Agent Development Environment) je platforma temeljena na XMPP/Jabber tehnologiji i pisana u Python programskom jeziku. Izdana je pod GNU Lesser General Public License, te je temeljena na skupini standarda i tehnologija kao što su FIPA, XMPP i Jabber.
Python je za sad jedini programski jezik podržan za SPADE platformu. Točnije, to je Python modul za razvoj softverskih agenata, odnosno višeagentnih sustava. Iako se preporuča korištenje modula te Python kao programskog jezika, razvoj agenata nije ograničen SPADE platformom. Agenti se mogu razvijati i u nekim drugim programskim jezicima te ih koristiti u SPADE platformi, no uvjet je da agenti komuniciraju koristeći XMPP protokol. SPADE platforma je u potpunosti u skladu sa spomenutim FIPA standardima, prva koja je temeljena na XMPP/Jabber tehnologiji, stoga je uvelike prihvaćena od strane programera diljem svijeta. Srž SPADE platforme je XML Usmjernik, na koji su spojeni ostali elementi i agenti. To je standardni XMPP server koji preusmjerava sve poruke od pošiljatelja do specifičnog primatelja. On ima ulogu sustava za transport poruka ((engl.): Message Transport System (MTS)). Upravo zahvaljujući MTS-u, koji koristi XMPP protokol, moguća je komunikacija i između platformi, pod uvjetom su platforme u skladu sa FIPA standardima, odnosno da koriste XMPP protokol za komunikaciju. Jedna od važnijih komponenti koja je spojena na Usmjernik je i SPADE Agent Communication Channel (ACC) čija je zadaća upravljanje svom komunikacijom unutar platforme. Kao sigurnosni mehanizam, logiranje na XML Usmjernik zahtijeva korisničko ime i lozinku, a sama veza na XML Usmjernik se može kriptirati koristeći SSL koji pruža kriptiranje podataka, autentikaciju na serveru te integritet poruka. Svaka komponenta unutar platforme je izgrađena kao agent. SPADE agenti su elementi koji su spojeni na MTS (XML router) te si time mogu međusobno slati poruke. Model agenta sadrži mehanizam spajanja na platformu (XMPP Connection), prosljeđivač poruka (message dispatcher) te niz različitih zadataka kojima se prosljeđuju poruke. Svaki agent mora imati identifikator koji se naziva Jabber ID (JID) te lozinku s kojom se spaja na platformu. Ukoliko je proces registracije na platformu onemogućen, administrator platforme mora definirati politiku registracije.
Ponašanja agenta
Agent može imati nekoliko ponašanja ((engl.): behavior), koja se mogu izvršavati istodobno. Ponašanje je radnja koju agent izvršava ponavljajućim uzorcima. Predefinirani tipovi ponašanja, prema kojima se mogu implementirati različite radnje koje agent može izvršiti, su[1]:
- Cyclic
- Periodic
- Dva navedena ponašanja su korisna kod izvršavanja ponavljajućih radnji
- Time-Out
- One-shot
- Dva navedena ponašanja su korisna kod izvršavanja neformalnih, jedinstvenih radnji
- Finite State Machine
- Navedeno ponašanje omogućuje izradu kompleksnijih ponašanja
- Event Behaviour
- Navedeno ponašanje odgovori na neki događaj koji agent percipira
Svaki agent može imati neograničeni broj ponašanja. Kada agentu stigne poruka, prosljeđivač poruka ju proslijedi ponašanju kojem je namijenjena. Svako ponašanje ima predložak poruke koji mu je određen, koji koristi prosljeđivač poruke kako bi odredio koja je poruka za koje ponašanje, tako da poruku spoji sa predloškom. Time, ponašanje može odrediti koje vrste poruka želi primati koristeći predloške.
Primjeri višeagentnih sustava
Konkretni primjeri višeagentnih sustava ima mnogo, od jednostavnijih agenata koji prate kladioničarske koeficijente te se klade umjesto korisnika, pa to složenih sustava koji simuliraju i predviđaju prirodne pojave.
Implementacija
Jednostavni agent:
import spade class MyAgent(spade.Agent.Agent): def _setup(self): print "MyAgent starting . . ." if __name__ == "__main__": a = MyAgent("agent@myhost.myprovider.com", "secret") a.start()
Agent sa cikličkim ponašanjem:
import spade import time class MyAgent(spade.Agent.Agent): class MyBehav(spade.Behaviour.Behaviour): def onStart(self): print "Starting behaviour . . ." self.counter = 0 def _process(self): print "Counter:", self.counter self.counter = self.counter + 1 time.sleep(1) def _setup(self): print "MyAgent starting . . ." b = self.MyBehav() self.addBehaviour(b, None) if __name__ == "__main__": a = MyAgent("agent@myhost.myprovider.com", "secret") a.start()
Agent sa periodičkim ponašanjem (Periodic Behaviour):
import spade class MyAgent(spade.Agent.Agent): class MyBehav(spade.Behaviour.PeriodicBehaviour): def onStart(self): print "Starting behaviour . . ." self.counter = 0 def _onTick(self): print "Counter:", self.counter self.counter = self.counter + 1 def _setup(self): print "MyAgent starting . . ." b = self.MyBehav(1) self.addBehaviour(b, None) if __name__ == "__main__": a = MyAgent("agent@myhost.myprovider.com", "secret") a.start()
Agent sa One-Shot ponašanjem:
import spade class MyAgent(spade.Agent.Agent): class MyBehav(spade.Behaviour.OneShotBehaviour): def onStart(self): print "Starting behaviour . . ." def _process(self): print "Hello World from a OneShot" def onEnd(self): print "Ending behaviour . . ." def _setup(self): print "MyAgent starting . . ." b = self.MyBehav() self.addBehaviour(b, None) if __name__ == "__main__": a = MyAgent("agent@myhost.myprovider.com", "secret") a.start()