Spade

Izvor: Wikipedija
SPADE

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 s 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, autentifikaciju 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. Ako je proces registracije na platformu onemogućen, administrator platforme mora definirati politiku registracije.

Ponašanja agenta[uredi | uredi kôd]

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 s predloškom. Time, ponašanje može odrediti koje vrste poruka želi primati koristeći predloške.

Primjeri višeagentnih sustava[uredi | uredi kôd]

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[uredi | uredi kôd]

Jednostavni agent:[uredi | uredi kôd]

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 s cikličkim ponašanjem:[uredi | uredi kôd]

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 s periodičkim ponašanjem (Periodic Behaviour):[uredi | uredi kôd]

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 s One-Shot ponašanjem:[uredi | uredi kôd]

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()

Izvori[uredi | uredi kôd]

  1. [1]SPADE manual