In questo articolo faremo una panoramica su JADE (Java Agent DEvelopment framework), un ambiente in grado di aiutare i programmatori nello sviluppo di software su modello multi-agente, grazie alla tecnologia fornita dal linguaggio Java.
Lo standard
JADE segue lo standard fornito dalla Foundation for Intelligence Physical Agent (FIPA), un'organizzazione preposta alla promozione e sviluppo di specifiche volte alla realizzazione di sistemi basati su agenti intelligenti.
Un sistema multi-agente, per aderire allo standard, deve garantire alcuni aspetti:
- una piattaforma, o Agent Platform, che identifica l'hardware contenente il sistema. Il sistema la vedrà come un unico spazio anche se potrà essere distribuita su più macchine contemporaneamente;
- la possibilità di creare e gestire Agenti, ovvero processi computazionali con funzionalità comunicative e di autonomia. Ogni agente deve essere univoco e deve essere fornito di un nome identificativo e un indirizzo, utile per comunicare messaggi;
- un Directory Facilitator, che fornisce un elenco di servizi che vari agenti possono fornire sulla piattaforma, e che fa da servizio di "yellow pages" per gli agenti che desiderano ottenere servizi;
- un sistema di gestione per gli agenti, che gestisce lo spazio fisico e tiene l'elenco degli agenti presenti nella piattaforma;
- un sistema di comunicazione standard per i messaggi tra le piattaforme di agenti, detto Message Transport System o MTS;
- un linguaggio comune agli agenti per scambiarsi informazioni, o Agent Communication Language (ACL). In particolare viene anche implementato il concetto di ontologia, ovvero una rappresentazione che garantisce all'agente di carpire correttamente il messaggio ricevuto.
Agenti e Messaggi
Un agente è un processo software fisico e come tale possiede un suo ciclo di vita che è possibile dettagliare in una serie di stati e transizioni, secondo lo standard.
Gli stati sono:
- ACTIVE: l'agente è attivo e può ricevere messaggi;
- INITIATED: l'agente esiste ma non è ancora in grado di comunicare;
- WAITING: l'agente è in attesa di un evento che lo risvegli;
- SUSPENDED: l'esecuzione è temporaneamente sospesa;
- TRANSIT: l'agente si sta muovendo verso una nuova piattaforma, l'MTS raccoglie i messaggi con quell'agente come destinatario e li consegnerà non appena esso si sarà insediato a destinazione;
- UNKNOWN: l'agente è in uno stato non definito. In questo caso l'MTS mantiene i messaggi destinati a lui, in attesa di poterli consegnare o doverli distruggere.
Vi sono una serie di transizioni specifiche che consentono agli agenti di passare tra i vari stati. Possono interagire tra loro attraverso dei messaggi che vengono definiti dallo standard ACL
La struttura di un messaggio generico è la seguente:
- PERFORMATIVE: definisce il tipo di messaggio tra gli agenti (comunicazione, richiesta, risposta a servizio, ecc.);
- SENDER: chi invia il messaggio;
- RECEIVER: chi deve ricevere il messaggio;
- REPLY-TO: l'ente cui deve essere inoltrata una eventuale risposta;
- CONTENT: il contenuto della comunicazione tra i due agenti;
- LANGUAGE: il tipo di linguaggio che definisce il contenuto;
- ENCODING: la particolare codifica del messaggio;
- ONTOLOGY: indica l'ontologia specifica per decifrare i simboli espressi nel contesto;
- PROTOCOL: determina il protocollo di interazione richiesto dal mittente;
- CONVERSATION-ID: viene utilizzato per determinare un codice utile per riunire i messaggi relativi ad una comunicazione;
- REPLY-WITH: specifica una espressione che il destinatario utilizzerà per riferirsi in maniera univoca al messaggio;
- IN-REPLY-TO: specifica una eventuale azione cui il messaggio è in risposta;
- REPLY-BY: determina un limite di tempo per la risposta al messaggio.
Ecco un tipico esempio di messaggio tra agenti:
(request :sender (agent-identifier :name htmlit-sender@local.local :addresses (sequence iiop://local.local/acc)) :receiver (agent-identifier :name htmlit-receiver@local.local :addresses (sequence iiop://local.local/acc)) :ontology htmlit-for-fipa-agent :language htmlit-spec :protocol htmlit-request :content "((action (agent-identifier :name htmlit-receiver@local.local :addresses (sequence iiop://local.local/acc)) (status_to-wait .... .... .... ")
Caratteristiche di JADE
Jade implementa diverse caratteristiche:
- una Agent Platform distribuita all'occorrenza su più macchine fisiche che possono comunicare attraverso Remote Method Invocation (RMI).
- Gli agenti vengono trattati come thread contenuti in particolari elementi definiti Agent Container, che forniscono il supporto a runtime.
Nella agent platform troviamo un sistema per la gestione degli agenti (ne cura i passaggi di stato), un Directory Facilitator (yellow pages) e un canale di comunicazione, che trasferisce i messaggi come oggetti java.
E' inoltre in grado di gestire la mobilità degli agenti tra ogni elemento distribuito della rete cui fanno riferimento.
E' da notare che il sistema può essere formato da macchine con sistemi operativi differenti; JADE è in grado di gestire automaticamente la conversione eventuale di sintassi per gli oggetti; - una interfaccia grafica per gestire agenti e container da un singolo host remoto;
- due elementi per il debug: un Dummy Agent che consente di gestire manualmente l'invio di messaggi agli agenti e uno Sniffer per captare i messaggi tra gli agenti della piattaforma;
- un supporto per il trasferimento degli agenti tra le diverse macchine del sistema;
- un supporto per singolo agente per la gestione di più attività concorrenti (behaviuors);
- librerie di protocolli di interazione FIPA già pronte;
- un supporto per definizione di ontologie specifiche.
Gli agenti in JADE seguono le specifiche per il ciclo di vita prima definite; alcuni agenti possono avere una GUI che consenta ad un eventuale operatore di interagire con essi.
Per garantire la normale autonomia del comportamento dell'agente viene implementato un pattern di tipo Model/View di Swing.
I comportamenti autonomi dell'agente vengono gestiti attraverso dei metodi di comportamento, o behaviours, che ereditano tutti da una classe comune e vengono classificati nel seguente modo:
comportamenti semplici: definiscono azioni semplici, che non richiedono sotto-task
- one-shot: vengono eseguiti solo una volta;
- ciclici: vengono eseguiti ininterrottamente;
comportamenti compositi o complessi: definiscono attività che sono costituite da molte azioni differenti
- sequential: modella una attività composta da sotto-elementi semplici o complessi;
- FMS: definisce una attività le cui azioni corrispondono a passaggi di stato di una macchina a stati finiti;
- parallel: modella una attività le cui azioni sono eseguite parallelamente.
E' possibile anche realizzare del codice specifico non relativo strettamente agli agenti che JADE può gestire come servizio registrato al Directory Facilitator
Conclusioni
Con questa panoramica abbiamo illustrato i sistemi ad agenti e la piattaforma JADE. Nei prossimi articoli vedremo delle applicazioni che ci consentiranno di sviluppare dei sistemi complessi utilizzando le caratteristiche di quest'ambiente di sviluppo.