Mostrando entradas con la etiqueta Agentes Inteligentes. Mostrar todas las entradas
Mostrando entradas con la etiqueta Agentes Inteligentes. Mostrar todas las entradas

martes, 1 de abril de 2008

Mensajeria en JADE

JADE se encuentra basado en las especificaciones FIPA en cuanto al formato de los mensajes, los cuales están divididos en diferentes slots que contiene la información (lenguaje, protocolo, contenido. . . ), y sobre estos se definen funciones de creación (set) y consulta (get).

Los métodos básicos de los que se dispone para el manejo de los mensajes entre agentes son:

  • send(ACLMessage): Se usa para enviar un mensaje una vez ingresados todos los parametros de este. El mensaje es enviado desde el agente que invoca el método a todos los destinatarios que contienen el campo :receiver.
  • ACLMessage receive( ): Recibe un mensaje de la cola de mensajes del agente. Se puede especificar que tipo de mensaje se quiere recibir mediante una plantilla de mensaje (MessageTemplate).
  • ACLMessage blockingReceive( ): Bloquea el agente mientras no se reciba un mensaje. Al igual que en el método anterior, se puede especificar el tipo de mensaje a recibir, con lo que se desecharía el resto, y el agente permanecería bloqueado hasta recibir el mensaje deseado.
La siguiente figura muestra la secuencia de envió de un mensaje en JADE:

Como se aprecia en la figura anterior el agente A1 prepara el mensaje configurando como receptor de este al agente A2 y lo envía a través del canal de distribución de mensajes de JADE, el cual guarda el mensaje en la cola de recepción del agente A2. Una vez guardado el mensaje en la cola de recepción, el agente A2 puede proceder en cualquier momento a retirar este.

El lenguaje que se utiliza comúnmente para escribir los mensajes es el FIPA-SL (Semantic Lenguaje), el cual contiene un ámbito mas general ya que permite: formar expresiones lógicas, intercambiar información entre agentes y expresar acciones a realizar.


Agent Communication Language (ACL)


En una sociedad multiagente, los agentes deben cooperar para realizar sus tareas y alcanzar sus objetivos. Los mecanismos de comunicación tradicionales permiten que dos agentes se transfieran información, pero eso es insuficiente cuando el objetivo es conseguir un comportamiento social. Es decir, son necesarios otros mecanismos que permitan dotar a los mensajes intercambiados de un contenido semantico.

Para definir el modelo de comunicación, FIPA parte de la idea que los agentes poseen capacidad de razonamiento. Esta capacidad viene dada por una serie de actitudes mentales que se definen como:

  • Creencias: Conjunto de proposiciones que el agente acepta como verdaderas. Lo que el agente conoce del mundo.
  • Objetivos: Conjunto de propiedades que el agente quiere que sean verdaderas aunque actualmente no están entre sus creencias.
  • Intenciones: Conjunto de acciones planificadas por el agente que le permiten llegar a un estado deseado.
Mediante sus acciones, un agente puede contribuir a cambiar el estado de su entorno y así satisfacer sus objetivos. Un agente influye en el conocimiento y acciones de otros agentes mediante un acto de comunicación (speech act), que se realiza mediante el envió de un mensaje desde el origen al destino. Ambos extremos de la comunicación deben entender el mensaje, y este debe ser algo mas que un intercambio de datos: debe tener asociado un contenido semantico accesible por ambas partes.

La solución adoptada por FIPA se basa en la utilización de mensajes ACL que tienen que ser comprendidos por cualquier agente del sistema. El uso de mensajes ACL permite el envió de información junto a su contenido semantico.

El lenguaje ACL (Agent Communication Language) desarrollado por FIPA es una evolución del lenguaje KQML (Knowledge Query Manipulation Language). La definición semántica formal de los mensajes ACL ha sido uno de los esfuerzos mayores dentro del estándar FIPA, y otorga a este lenguaje de una gran aceptación como estándar dentro del mundo de los agentes.

Desde este punto de vista, hay que entender un agente como una entidad que entiende el lenguaje ACL y es capaz de intercambiar conocimiento con otros agentes mediante el uso del mismo. Ya no se habla de que la interfaz de un agente (objeto) ofrezca una serie de servicios que se puedan invocar o instanciar, sino que un agente va a proporcionar ciertos servicios que se le pueden solicitar mediante un mensaje ACL que incluya dicha solicitud. Se pasa de un modelo de objetos a un modelo de agentes inteligentes basados en actos de comunicación.


Niveles de un mensaje ACL


  • Contenido: Contenido real del mensaje en el lenguaje de representación propio.
  • Mensaje: El nivel de mensaje conforma la esencia del mensaje. Determina el tipo de interacciones que se pueden tener con un agente que habla ACL. La función principal del nivel de mensaje es identificar el protocolo a ser utilizado para enviar el mensaje y proporciona al emisor una preformativa para que añada el contenido.
  • Comunicación: Relativo a los parámetros de comunicación a más bajo nivel: identidad del emisor y receptor, y un identificador único asociado con la comunicación.

La siguiente figura muestra los niveles de comunicación en un mensaje ACL:



Estructura de un mensaje ACL


Un mensaje ACL esta formado por:

  • Identificador del tipo de comunicación: Define el significado principal del mensaje. Es decir, lo que el agente origen pretende con dicho mensaje. Por ejemplo: ”inform”(un agente transmite información a otro), ”request”(un agente solicita a otro que realice una accion), ”agree”(un agente acepta la petición realizada), ”query”(un agente solicita información a otro).
  • Secuencia de parámetros del mensaje: Es un conjunto de parejas clave-valor que permiten asociar a cada acto de comunicación concreto toda la información necesaria.


Ejemplo de mensaje ACL:


(inform
:sender agente1
:receiver: agente2
:content
(velocidad agenteA 40)
:in-reply-to round-4
:reply-with bid04
:language sl
:ontology ontologia-agente
)

Este mensaje enviado del agente1 al agente2 informa que la velocidad del agente A es de 40, utiliza el lenguaje SL y la ontología ontologia-agente para describir esta información.

La siguiente figura muestra la estructura de los mensajes que se intercambian entre agentes:



Parámetros del mensaje


Los parámetros básicos del lenguaje ACL definidos por la especificación FIPA, son los siguientes:




sábado, 29 de marzo de 2008

Manejo de comportamientos en JADE

Las tareas o servicios que un agente hace se especifican a través de comportamientos. Un comportamiento (behaviour) hace referencia a una funcionalidad que incorpora el agente. Para que un agente pueda crear uno o más comportamientos debe heredar la clase jade.core.behaviours.Behaviour. Una vez que se ha implementado, el agente puede ejecutar ese comportamiento cada vez que sea invocado dentro del método setup del agente, el cual los anexa al agente a través del metodo addBehaviour perteneciente a la clase Agent.
Se puede pensar que los comportamientos son como los hilos de ejecución en Java (threads), ya que al igual que estos, en un agente pueden ejecutarse a la vez tantos comportamientos como sea necesario. Sin embargo, a diferencia de los hilos, el decidir que comportamiento se ejecuta en cada momento es tarea del desarrollador del agente. Esto es así para que cada agente sea equivalente únicamente a un único hilo, con el consiguiente ahorro de ciclos de CPU y memoria que esto implica.
La creación de los comportamientos se realiza extendiendo la clase jade.core. Behaviours, para lo cual la clase Agent tiene dos métodos para poder agregar o eliminar comportamientos:
  • addBehaviour
  • removeBehaviour

Estos comportamientos pueden ser anexados dentro del método setup (lo habitual), desde cualquier comportamiento, o desde otros agentes. Algunos métodos con los que cuentan los comportamientos son:

  • action: Método que implementa la tarea a realizar.
  • done: Método booleano que comprueba si la tarea ha acabado, eliminándola si retorna true.
  • block: Método que bloquea la ejecución del comportamiento. El bloqueo se hace efectivo cuando el método action retorna, el cual puede ser configurado con un determinado tiempo.
  • restar: Se reinicia explícitamente un comportamiento bloqueado.
  • reset: Retorna el comportamiento a su estado inicial.
  • onStart: Acciones antes de iniciar el comportamiento.
  • onEnd: Acciones antes de finalizar el comportamiento.

JADE no guarda el estado de los comportamientos, razón por la cual es responsabilidad del desarrollador guardar el último estado de este.

Los comportamientos pueden ser agrupados en tres grandes grupos:

  • Comportamientos one-shot: Son aquellos que se ejecutan de manera casi instantánea, y solamente una vez.
  • Comportamientos cíclicos: Son aquellos que nunca son sacados del conjunto de comportamientos del agente y cuyo método action siempre ejecuta el mismo código. Por lo tanto, nunca finalizan.
  • Comportamientos genéricos: Un poco más complejos ya que el código que se ejecuta en ellos depende del estatus del agente, y eventualmente analizan su ejecución.

Otro tipo de comportamientos en JADE son los compuestos, que permiten combinar comportamientos previamente definidos de manera conveniente para aplicarles un orden de ejecución determinado; estos son:

  • Secuenciales a través de SequentialBehaviour.
  • En paralelo a través de ParallelBehaviour.
  • Guiados mediante un autómata finito deterministico a través de FSMBehaviour.

Existen comportamientos a los cuales se les puede definir su ejecución a través de un tiempo de espera; estos son WakerBehaviour y TickerBehaviour, los cuales tienen en común que su ejecución es diferida. Se invocan y aguardan hasta que se ha cumplido un determinado tiempo. El primero de estos solamente se ejecuta una vez y el segundo es un comportamiento cíclico.

Los objetos behaviour describen pequeñas tareas que debe realizar el agente ejecutándose según un planificador que se encuentra implementado en la clase Agent. El planificador va ejecutando según una política round-robin (o por turnos rotatorios) de los objetos behaviour que se encuentran en una cola FIFO.

Los objetos behaviour tienen dos métodos que se deben reescribir, action() y done(). El método action() es en donde se deben desarrollar las tareas que debe realizar el agente, mientras que el método done() es llamado cuando el action() finaliza. El planificador va ejecutando uno a uno los métodos action() de la cola y cuando el método action() de un objeto finaliza se llama al método done(), el cual debe retornar un valor booleano. Si retorna true, el objeto es sacado fuera del planificador ya que se da por concluida su tarea, mientras que si retorna false se vuelve a planificar.

Si en algún momento de la ejecución del método action() se requiere esperar por la llegada de un mensaje, existe el método block() para mandar a una cola de bloqueados cuando el método action() finaliza (no cuando se llama a block()). Cuando se produce la llegada de un mensaje, todos los objetos en la cola de bloqueados se planifican y deben comprobar si el mensaje llegado es para ellos o no. En caso de que un objeto no sea el destinatario del mensaje este debe volver a bloquearse.

Es importante que los métodos action() sean cortos, de esta forma se permite un cierto grado de paralelismo. Si se necesita realizar una tarea que va a requerir un largo periodo de tiempo, entonces el desarrollador deberá dividir la tarea en subtareas y cada una de ellas implementarla mediante un objeto behaviour. Con el fin de ayudar en esta labor, JADE proporciona una jerarquía de clases behaviour, que permite incluso simular maquinas de estados finitos.

  • SimpleBehaviour: Representa un comportamiento atómico.
  • OneShotBehaviour: Representa un comportamiento que se debe ejecutar solo una vez, por eso su método done() retorna true, si no es redefinido.
  • CyclicBehaviour: Representa un comportamiento que debe ejecutarse una serie de veces. El método done, si no es redefinido, devuelve false.
  • SenderBehaviour: Encapsula la acción de envió de un mensaje ACL. Este mensaje debe ser especificado en el constructor.
  • ReceiverBehaviour: Encapsula la acción de recepción de un mensaje ACL. Termina cuando se recibe el mensaje o cuando pasa una cierta cantidad de tiempo especificada en el constructor.
  • WakerBehaviour: Implementa un comportamiento OneShot que se ejecuta justo después de que haya pasado un tiempo especificado.
  • CompositeBehaviour: Esta clase se compone de diferentes sub-behaviours que se pueden ejecutar siguiendo diferentes políticas de planificación, las cuales vienen determinadas por la subclase elegida, las que pueden ser: SequentialBehaviour, ParallelBehaviour y FSMBehavior.
  • SequentialBehaviour: Esta clase deriva de CompositeBehaviour y ejecuta sub-behaviours de forma secuencial, y termina cuando todos los métodos action() han terminado.





  • ParallelBehaviour: Esta clase deriva de CompositeBehaviour y ejecuta los sub-behaviours de manera concurrente. En el constructor de la clase se puede especificar cuando se desea que acabe la ejecución: cuando todos los sub-behaviours lo han hecho, cuando uno termine, o cuando un numero especificado lo logre.





  • FSMBehaviour: Esta clase permite definir una maquina de estados finita mediante sub-behaviours. Cada sub- comportamiento representa un estado de la maquina, y las transiciones se van produciendo según la salida de dichos estados. La finalización se alcanza cuando se termine de ejecutar algún sub-behaviour que se haya registrado como estado final.


Adjunto dos codigos de ejemplo para que vean lo facil que es agregar comportamientos a un agente.

En el proximo post veremos mensajeria y ACL.



viernes, 14 de marzo de 2008

Conceptos básicos de programación de un agente en JADE

Hasta el momento hemos visto parte de la especificación FIPA y algunas de las funcionalidades básicas de JADE….pero falta lo mas importante, la programación de un agente, para luego continuar con un SMA!!!

Para crear un agente en JADE se debe extender la clase jade.core.Agent. Esta contiene dos métodos muy importantes que tienen que ser implementados necesariamente. Estos son setup() y takedown(), los cuales permiten inicializar y finalizar el agente respectivamente.

La siguiente figura muestra la estructura de un agente:






Cada agente del sistema multiagente será una instancia de una clase java que sea subclase de la clase Agent. Esta clase se compondrá básicamente de un método setup, que se ejecutara al iniciarse el agente y que contendrá código de inicialización, incluyendo instrucciones que especificaran la ontología a utilizar y los comportamientos asociados al agente. Además del método setup, se dispondrá de una clase interna a la clase del agente por cada uno de los comportamientos asociados al agente.

Estos comportamientos básicamente se utilizan para el envió y recepción de mensajes, aunque también se podrían realizar otras tareas

A continuación se muestra el código del agente EstructuraBasica, correspondiente a un agente simple al que no se ha asociado ningún comportamiento ni ninguna ontología, y que se tomara como base para implementar los futuros ejemplos de agentes:

package ejemplo1;

import jade.core.Agent;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;

public class EstructuraBasica extends Agent {

protected void setup() {
/* Registrarse con el agente DF */
DFAgentDescription dfd = new DFAgentDescription();
ServiceDescription sd = new ServiceDescription();
sd.setType("EstructuraBasica");
sd.setName(getName());
dfd.setName(getAID());
dfd.addServices(sd);
try {
DFService.register(this,dfd);
}
catch (FIPAException e) {
System.err.println("Problemas : " +e.getMessage());
doDelete();
}
}

}

En este ejemplo se observa como el agente EstructuraBasica es una subclase de Agent y por lo tanto se pueden crear agentes de la clase EstructuraBasica utilizando "java jade.Boot". Todos los agentes heredan la clase jade.core.Agent, para lo cual cada uno de estos al momento de ser creado tiene un identificador único el cual es un objeto de la clase jade.core.AID. El AID que se genera es del tipo:

nombre_agente@host:puerto/JADE

Al momento de crearse el agente se realizan varias tareas automáticamente; algunas de estas son:

  • Se llama al constructor del agente
  • Se crea un identificador del agente (AID)
  • Se registra el agente en el AMS
  • Se ejecuta el método setup

En el método setup se pueden realizar las siguientes operaciones:

  • Modificar el registro del AMS
  • Registra el agente en el DF
  • Agregar los comportamientos (Behaviours) que ejecutara el agente

Otros métodos con los que cuenta la clase Agent son:

  • doDelete: Finaliza la ejecución del agente.
  • TakeDown: Se ejecuta antes de que el agente finalice. Un uso común es el de desregistrar al agente del DF.

La siguiente figura muestra el ciclo de ejecución de un agente:


El acceso a los métodos del DF se realiza importando la clase jade.domain.DFService con la cual se construyen dos tipos de objetos:
  • DFAgentDescription: Permite guardar el nombre del agente y el o los tipos de servicios que este desea registrar.
  • ServiceDescription: Permite guardar el nombre y tipo de servicio que el agente desea registrar.

Hay que recordar que el AMS es un agente de gestión que controla el estado y el acceso a la plataforma. También proporciona un servicio de ”páginas blancas” que permite la localización de agentes a partir de sus nombres, y que el DF proporciona un servicio de “páginas amarillas” al resto de los agentes. Los agentes usan el DF para registrar sus servicios o para obtener los servicios de los demás agentes.

Estos serán unos puntos muy importantes al momento de desarrollar un SMA.

Con esto hasta el momento hemos visto la estructura básica de un agente, los métodos mas importantes que componen las estructura de un agente y una pequeña descripción de estos.

Para que sea mas claro les adjunto un video en el cual se detalla la ejecución de cuatro agentes básicos de ejemplo, estos son:

  • BuscarAMS: Permite obtener una lista de todos los agentes que se encuentren registrados en el AMS.
  • RegistrarDF: Permite registrar un servicio en el directorio facilitador.
  • BuscarDF: Permite obtener un listado de todos los servicios registrados en el directorio facilitador.
  • EjemploCompletoDF: Permite registrar un servicio en el directorio facilitador y obtener un listado de los agentes registrados en el DF que presten un servicio determinado.

En el próximo post veremos los distintos tipos de comportamientos (Behaviours) y comenzaremos a programar nuestros primeros SMA.



miércoles, 20 de febrero de 2008

Agentes inteligentes en el mundo Java

Dentro del mundo Java, lo que más me gusta investigar es sobre agentes inteligentes y cuales son las aplicaciones que actualmente se están desarrollando. En una serie de post intentare explicar que son, hablare de FIPA (Foundation for Intelligent Physical Agents), que es el framework JADE (Java Agent DEvelopment), como este implementa FIPA y pondremos en practica la teoría con una serie de pequeños ejemplos para entender mejor todo.

Existen muchas definiciones de que es un agente inteligente, pero a mi juicio la mejor esta dada por Pattie Maes, investigadora del MIT: ”un agente es un sistema computacional que vive en un entorno complejo y dinámico. El agente puede sentir ese entorno y actuar en consecuencia, y tiene un conjunto de objetivos o motivaciones que intenta conseguir a través de dichas acciones”.

Algunas de las características principales que debe tener un agente son: autonomía, cooperación, movilidad, adaptabilidad, veracidad, reactividad y pro-actividad.

Hoy en día existen muchas organizaciones que se encuentran definiendo los estándares para el desarrollo de agentes inteligentes tales como SMA (Sistemas Multi Agentes), OMG (Object Management Group), KSE (Knowledge Sharing Effort) y FIPA. De estas, la que más aceptación a tenido por parte de la comunidad investigadora y desarrolladora es FIPA.

Dentro de los actuales frameworks que implementan FIPA se encuentra JADE (http://jade.tilab.com/) el cual esta 100% desarrollado en Java y cuenta con una gran comunidad de desarrolladores.

Pero bueno menos teoría y mas acción!! Como todo, lo primero es bajar los archivos necesario para lo cual se debe ingresar a la página de JADE y registrarse. Una vez hecho esto, en la zona de descarga bajen el archivo jadeAll.zip. Al descomprimir el archivo encontraran JADE-bin-3.5.zip, descompriman este ultimó con lo cual se generara la carpeta jade. Dentro de esta se encuentra la carpeta lib, la cual contiene todo lo necesario para el desarrollo de los agentes. Estos archivos deben ser agregados al CLASSPATH del sistema (esto nos ayudara a compilar los archivos de ejemplo) :

CLASSPATH=c:\jade\lib\jade.jar;c:\jade\lib\jadeTools.jar;c:\jade\lib\http.jar;c:\jade\lib\iiop.jar;c:\jade\lib\commons-codec\commons-codec-1.3.jar;c:\jade\src


Por ultimo en una venta de comandos (o shell dependiendo el caso) ingresen a la carpeta jade y ejecuten el siguiente comando:

java jade.Boot –gui

Con este comando se ejecutara el entorno grafico (ya hablaremos de el en mas detalle).




Por ahora solo cabe mencionar que al iniciar la plataforma ya se encuentran en ejecución tres agentes básicos: RMA, AMS y DF.

Ahora solo nos falta probar el ejemplo más básico, el clásico “Hola Mundo” en JADE es el agente “PingAgent”. Este agente esta programado para contestar mensajes con la preformativa QUERY-REF, el contenido del mensaje debe ser “ping” y el tipo de mensaje debe ser INFORM (ya veremos en otro post los protocolos FIPA). En caso de recibir un mensaje que no cumpla esta estructura, el agente responderá con un mensaje de tipo NOT-UNDERSTOOD.

Los códigos de ejemplo están en el archivo JADE-examples-3.5.zip, el cual contiene la carpeta jade\src\examples, es esta ultima carpeta (examples) es la que deben descomprimir en la carpeta …\jade\src que creamos anteriormente (en mi caso c:\jade\src).

Una vez hecho esto, en una ventana de comandos, vamos a la carpeta …\jade\src\examples\PingAgent y ejecutamos javac *.java para compilar los códigos de ejemplo.

Para ejecutar el agente, en la ventana de comandos nos posicionamos en la carpeta …\jade\src y ejecutamos el comando

java jade.Boot –gui ping:examples.PingAgent.PingAgent


Como se aprecia en la imagen, además de los agentes básicos se ejecuto el agente ping (ese es el nombre que nosotros le dimos al ejecutar el agente).

Para probar el correcto funcionamiento del agente necesitaremos ejecutar el agente “SnifferAgent” y “DummyAgent” desde el entorno grafico. El primero es el botón con la imagen de un hombre de traje morado con sombrero, y el segundo es el botón de la derecha de este último.


El agente SinifferAgent y DummyAgent serán llamados sniffer0 y da0 respectivamente.

Para visualizar gráficamente el intercambio de mensajes, en la venta del Sniffer0 se debe presionar con el botón derecho del Mouse sobre el agente da0 y sniffer0, y seleccionar la opción “Do sniff agent(s)”.


En la ventana del agente da0 se pulsa el botón derecho del mouse sobre el casillero Receivers, se selecciona la opción add y el en casillero del nombre se ingresa el nombre completo (para mi caso el nombre completo es ping@VALUED-08C26EC4:1099/JADE). El resto de lo campos se pueden dejar en blanco. En el listado de “Communicative Act” se debe seleccionar la preformativa QUERY-REF, y dentro del casillero “content” se debe introducir la palabra ping. Una vez ingresado los datos se debe presionar el botón “enviar” (es el segundo botón de la parte superior izquierda, el cual tiene un sobre).

En la misma ventana se puede observar en la cola de mensajes el mensaje QUERY-REF enviado por el DummyAgent, así como la respuesta del agente ping la cual es INFORM.


Si seleccionamos el mensaje INFORM (el que esta en letras rojas) y presionan el botón para examinar el mensaje de respuesta (el botón con los lentes), verán la contestación enviada por agente ping “alive“.

Al mismo tiempo que hemos estado enviando el mensaje, el agente sniffer0 ha estado representando gráficamente el intercambio de mensajes.


Haciendo doble clic sobre cualquiera de los mensajes enviados, podremos examinar el contenido del mensaje seleccionado.

Como podemos ver en este ejemplo, JADE contiene un gran número de herramientas que nos permiten gestionar nuestros agentes. En el próximo post veremos más en profundidad el estándar FIPA y comenzaremos a programar nuestros primeros agentes.

Si alguien se interesa mas en el tema le recomiendo el libro “An Introduction to MultiAgent Systems“ de Michael Wooldrige.

Por ultimo aqui les dejo un video explicativo de lo visto anteriormente (como dicen...un video vale mas que mil palabras)...