Introduzione agli agenti in JAM

L'infrastruttura da realizzare è basata sulla tecnologia RMI di Java [3], si veda la Figura 2.

Figure: Descrizione generale del progetto da realizzare.
Image jam-organization
Questa sarà costituita da un ambiente a runtime, denominato Runtime Agent Middleware (RAM, nel seguito). Il RAM sarà realizzato direttamente sull'infrastruttura RMI offerta da Java mediante una serie di classi che costituiranno lo Agent Directory Service Layer (ADSL, nel seguito). Il RAM permetterà di ospitare, cercare, trovare, eseguire e soprattutto scambiare messaggi tra gli agenti presenti in un dato momento. Agenti che saranno definiti mediante un insieme di opportune classi, che costituiscono un altro degli obiettivi del laboratorio, denominate Java Agent Middleware (JAM, nel seguito).

In JAM un agente è un oggetto, istanza di una particolare classe che estende la JAMAgent e che descrive il proprio stato interno.

Figure: Diagramma a classi dell'organizzazione di un ogente e del suo comportamento in JAM.
Image JAM-Parte-V
Il comportamento di un agente è definito da un insieme di oggetti di tipo JAMBehaviour che implementano il metodo action e che hanno accesso, mediante opportuno puntatore, allo stato dell'agente proprietario di tali comportamenti. In un certo senso, tale metodo rappresenta le ``azioni'' che definiscono il comportamento dell'agente stesso. Il codice (Java) di ogni metodo action è eseguito su un thread dedicato (vedi Figura 3 e Figura 4). Il metodo action è eseguito una volta soltanto se la classe che implementa il metodo estende JAMSimpleBehaviour, è invece eseguito ciclicamente fino a che il metodo done non è invocato, se la classe estende JAMWhileBehaviour.
Figure: Agente e comportamenti come thread.
Image mioAgente

In generale un agente in JAM è definito mediante la classe che descrive il proprio stato interno (la classe che estende JAMAgent e forisce le funzionalità comunicative) e le classi che definiscono il suo comportamento. Ad esempio, le seguenti sono tre classi che definiscono tre comportamenti diversi:

class ComportamentoMioAgente extends JAMWhileBehaviour {
  [ ... ]
  public ComportamentoMioAgente(JAMAgent myAgent) {
    super(myAgente);
    [ ... ]
  }
  [ ... ]
  public void action() {
    [ ... ]
  }
}

class AltroComportamentoMioAgente extends JAMSimpleBehaviour {
  [ ... ]
  public AltroComportamentoMioAgente(JAMAgent myAgent) {
    super(myAgente);
    [ ... ]
  }
  [ ... ]
  public void action() {
    [ ... ]
  }
}

class AltroAncoraComportamentoMioAgente extends JAMWhileBehaviour {
  [ ... ]
  public AltroAncoraComportamentoMioAgente(JAMAgent myAgent) {
    super(myAgente);
    [ ... ]
  }
  [ ... ]
  public void action() {
    [ ... ]
  }
}
Tali comportamenti possono essere associati alla definizione di un agente nel seguente modo:
class MioAgente extends JAMAgent {
  [ ... ]
  public MioAgente( ... ) {
    [ ... ]
    addBehaviour( new ComportamentoMioAgente(this) ); 
    addBehaviour( new AltroComportamentoMioAgente(this) ); 
    addBehaviour( new AltroAncoraComportamentoMioAgente(this) ); 
  }
  [ ... ]
}
L'attivazione di un agente avviene mediante invocazione del metodo start (dopo init che ha lo scopo di collegarlo alla RAM), il quale attiva i propri comportamenti, ognuno su un thread diverso.
  [ ... ]
  JAMAgent agent = new MioAgente( ... );
  agent.init();
  agent.start();
  [ ... ]
Un agente può comunicare con altri agenti (conoscendone il nome (identificatore) o inviando messaggi a tutti gli agenti presenti in un dato momento) attraverso i metodi send. Inoltre può leggere i messaggi ricevuti dagli altri agenti mediante i metodi receive. Tipicamente tali medodi sono utilizzti all'interno del metodo action:
  public void action() {
    [ ... ]
    Message4You request = new Message4You(MessageType.REQUEST);
    request.setSender(myagent.getMyID());
    request.setReceiver( ... );
    request.setContent("Che ora e`?");
    myAgent.send(request);
    [ ... ]
    Message aswerRequest =
      myAgent.receive(MessageType.INFORM, ... );
    [ ... ]
  }
Dell'effetivo trasferimento dei messaggi via rete si occuperà la sottostante classe JAMAgent (la cui realizzazione è uno degli obiettivi del progetto).

baldoni 2005-01-13