domingo, 27 de enero de 2008

Creando agentes con JADE

A partir de este momento empezaremso a introducirnos más dentro del framework de JADE y mostraremos a través de un proyecto pequeño realizado dentro del grupo de investigación GICOGE el manejo de las distintas herramientas de JADE para la creación de una plataforma de agentes.

En principio hablaremos de la creación de agentes con JADE. Este proceso es realmente sencillo, teniendo en cuenta que al principio miraremos los elementos básicos para que un agente funcione dentro de la plataforma de JADE. De alguna manera la complejidad de nuestra plataforma de agentes se irá haciendo más evidente a medida que vayamos agregando más características a nuestros agentes, como comportamientos y relaciones con otros agentes.

El proyecto desarrollado consiste en simular un regulador de un contenedor de almacenamiento de cualquier tipo de líquido que necesita mantenerse dentro de una temperatura determinada. Para esto, el regulador debe aumentar o disminuir la temperatura a medida que pasa el tiempo. La temperatura del contenedor debe mentenerse dentro de unos límites tanto superior como inferior de temperatura establecidos por un usuario. Para que el regulador sepa en qué momento debe aumentar o disminuir la temperatura, este debe comunicarse con un agente supervisor que recibirá información constante del estado del agente y del contenedor, de tal manera que basándose en esta información el agente supervisor pueda ordenarle al regulador el aumento o la de la disminusión de la temperatura. Por último, el agente regulador le informará a otro agente, llamado agente informante, todo lo ocurrido en cuanto a su estado y temperatura del contenedor para que este la publique y hacerla visible para el usuario.

Creando un agente:

En principio, la creación de un agente dentro de la plataforma JADE consiste en un proceso sencillo donde nuestro agente hereda de la clase jade.core.Agent e implementar un método llamado setup(). Pero antes de empezar a mostrar la forma práctica hablaremos un poco de la clase Agent:
  • jade.core.Agent: El paquete jade.core contiene el microkernel del sistema de JADE. La clase Agent, que pertenece al paquete jade.core extiende de la java.lang.object y es la superclase que nos permtie crear nuestros agentes dentro de la plataforma JADE. Esta superclase nos proporciona métodos básicos de un agente dentro de JADE como el paso de mensajes utilizando objetos ACLMessage, un ciclo de vida completo que permite los procesos de inicio, suspensión y muerte de un agente y programar y ejecutar varios tipos de actividades concurrentes.

Para explicar la creación de un agente nos basaremos en el proyecto Sistema de Control, en el agente Regulador:

1. Creamos una clase llamada AgenteRegulador que extiende de la clase Agent(No sobra recordar que es necesario importar la librería jade.core.Agent).

import jade.core.Agent;


public class AgenteRegulador extends Agent{
......
}

2. Creamos un método público llamado setup() e inicializamos los siguientes elementos:

  • Interfáz gráfica del agente(no es necesario tener una pero si se va a tener se tiene que inicializar en el setup).
  • Publicación de servicios: Para publicar los servicios que nuestro agente pueda prestar es necesario establecerlos y publicarlos desde el setup(). Debido a que nosotros tenemos varios agentes dentro de nuestra plataforma que necesitan enviar y recibir información de determinados agentes, la plataforma JADE nos permite establecer una descripción del tipo de agente a través de las páginas amarillas o DF, donde podemos publicar un tipo de servicio ofrecido por nuestro agente, de tal manera que cada vez que creemos un agente regulador este tenga un tipo de descripción que facilite su búsqueda y diferenciación dentro de la plataforma.
  •  public void setup() {
    System.out.println("Agente Regulador " + getAID().getName() + " esta listo.");

    miGui = new AgenteReguladorGuiImpl();
    miGui.setAgent(this);
    miGui.show();

    DFAgentDescription dfd = new DFAgentDescription();
    dfd.setName(getAID());
    ServiceDescription sd = new ServiceDescription();
    sd.setType("Calentar-Contenedor");
    sd.setName(getLocalName() + "-Calentar-Contenedor");
    dfd.addServices(sd);
    try {
    DFService.register(this, dfd);
    } catch (FIPAException fe) {
    fe.printStackTrace();
    }

    }

Como podemos observar, al principio de nuestro método, imprimimos en la línea de comando un mensaje con el nombre de nuestro regulador con el cual nos aseguramos de que ha sido iniciado correctamente. Para obtener el nombre de nuestro agente accedemos a través de un método de la clase jade.core.AID. Esta clase extiende de java.lang.object y nos permite utilizar métodos para acceder, establecer, comparar o igualar los distintos elementos del AID de un agente. En este caso utilizamos el método getAID().getName() que nos permite obtener el nombre global de nuestro agente. Esta información también la podríamos obtener con el getAID() de la clase Agent, pero no obtendríamos el nombre global, sino el local.

Para la publcación de nuestros servicios es necesario establecer elementos básicos como el tipo de servicio, el nombre que va a identificar a nuestro servicio, asociarlo a nuestro agente y publicarlo en el DF. Para esto utilizamos los métodos ofrecidos por las clases DFAgentDescription, ServiceDescription del paquete jade.domain.FIPAAgentManagement, y la clase jade.domain.DFService. Publicar nuestros servicios en las páginas amarillas nos facilita que nuestros agentes sean faciltmente encontrados ya que la condición de búsqueda se puede resumir al tipo de servicio que ofrece un agente.

El código general de nuestro agente AgenteRegulador quedaría así en principio:

import jade.core.AID;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.TickerBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import javax.swing.JOptionPane;
import sistemaDeControl.contenedor.Contenedor;


public class AgenteRegulador extends Agent{

private Contenedor contenedor;
private AgenteReguladorGui miGui;

public void setup() {
System.out.println("Agente Regulador " + getAID().getName() + " esta listo.");

miGui = new AgenteReguladorGuiImpl();
miGui.setAgent(this);
miGui.show();

DFAgentDescription dfd = new DFAgentDescription();
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription();
sd.setType("Calentar-Contenedor");
sd.setName(getLocalName() + "-Calentar-Contenedor");
dfd.addServices(sd);
try {
DFService.register(this, dfd);
} catch (FIPAException fe) {
fe.printStackTrace();
}

}


}


Aqui encontraras desponible el codigo fuente completo de la aplicacion.
Para NetBeans 5.5 o superior
Descargar

No hay comentarios: