Cómo programar un Agente:JADE, LEAP y JADEX
Javier Carbó, Grupo de Inteligencia Artificial AplicadaUniv. Carlos III de MadridCurso “SSII en el siglo XXI”Univ. Internacional Menendez Pelayo, Julio de 2008
Indice
Introducción a Jade, FIPA, LEAP y Jadex JADE:
Arquitectura de JADE Un agente en JADE Comportamientos JADE Mensajes JADE Ontologías en JADE
LEAP JADEx
Invocando agentes en Jadex La definición xml de un agente en Jadex Un plan de un agente Jadex
Construir un Sistema de Agentes 1. Idear escenarios y casos de uso
2. Distinguir entre roles y servicios3. Asignar responsabilidades4. Definir términos en ontología5. Determinar mensajes entre agentes y
su orden (protocolo)6. Implementar el agente 7. Crear el interfaz
Problema a tratar Dominios aplic.Ejemplo, pasos.
alumnos, profesBiblioteca, aulasrecomendaciones
Quién puede pedir libros?Quién puede entrar en el aula?
(propose (libro “JADE”) (editorial “wiley”) (author “caire”) (year “2007”) …)
“asignatura”, “libro”, “curso”, “nota”, …
Propose book; Reject/Accept Proposal
En java
JADE, LEAP o JADEX
Ejemplo de escenario
SmokingZone
Bar
Newspapers
BoardingGate
gates
Internet
Exchange
Souvenirs
TouristInfo
Spa
BARAJAS
allen
Distinguir entre roles y servicios
Roles Pasajero Aeropuerto Tripulante Personal servicios Seguridad
Servicios Registro Comercios: prensa, relax, cambio moneda, regalos, bar Viaje: Check-in, Embarque Otros: zona fumadores, wifi, WC, información_aeropuerto,
información_turística
Asignar responsabilidades
Roles Pasajero Aeropuerto Tripulante Personal servicios Seguridad
Pedir registro, pedir servicios_viaje, pedir servicios_comercio, pedir servicios_otros
Ofrecer registro, ofrecer servicios_otros, ofrecer servicios_viaje
Ofrecer servicios_comercio
Ontología
Protocolo: Secuencias de mensajes
Gates PrensaBarajas
REQUEST register ...
AGREE
REFUSE
INFORM-REF checkin
INFORM gates, us citizen towards rome
PROPOSE USAToday, Corr. Sera
ACCEPT-PROPOSAL
REJECT-PROPOSAL
Se mueve junto a prensa
Introducción a JADE, LEAP, JADEX http://jade.tilab.com/ Jade es una plataforma para ejecutar agentes que
permite: Ejecución de agentes completamente asíncrona Comunicación entre agentes en la misma o diferentes
plataforma/s JADE/LEAP/JADEX Programación de agentes mediante un conjunto de
paquetes Java. Validación de la ejecución mediante seguimiento mensajes
y estado interno del agente. Es la plataforma más extendida porque implementa
el estándar FIPA.
SNIFFER de JADE
El estándar FIPA
www.fipa.org Especifica formalemnte el lenguaje de comunicación (ACL)
Codificación, semántica, y uso de los mensajes Indica como interaccionan y son gestionados los agentes
Message Transport System
AgentManagement
System
DirectoryFacilitator
Agent Platform
Agent1
OtrasPlataformas
FIPA
PáginasAmarillas
Registro y supervisió
n de agentes
Agentn
El ACL del estándar FIPA
Cada uno de los mensajes FIPA se define mediante: El contenido del mensaje en donde se detalla qué tipo de
contenido debe llevar La intención (performative) que es una explicación
semántica del acto de comunicación El modelo formal en el que se codificará el mensaje La ontología en la que se describen los términos del
contenido del mensaje
Un mensaje FIPA-ACL(inform :sender antagent :receiver bob martin :conversation_id example6 :reply_with 275 :reply_by wed 3pm :language lisp :content (target (project “1hour”) (platform “computer15”) (author “sean”)) (time “8/07/01 4pm”)
(message “build failed”) (target “compile”) ) )
Intención (performative)Inform, Request, Failure,
Refuse, ...
Direccionamientosender, receiver
Coordinación de mensajesRespuesta esperada, id de diálogo
Detailed action or requestproblem specific
language, ontology, request
Un mensaje FIPA-ACL
Ejemplo: el agente billgates informa al agente barajas de su llegada (indicando información sobre sí mismo y sobre su viaje)
(request:sender (agent-identifier :name billgates):receiver (set (agent-identifier :name barajas)):content intancia de subclase de accion new Register
(new Pasajero (new Person(…) new Travel(…)))):codec SL:ontology airport-ontology:reply-with register-billgates) )
Actos comunicativos FIPA-ACL
accept-proposal, agree, cancel, call-for-proposal, confirm, disconfirm, failure, inform, inform-if, inform-ref, not-understood, propagate, propose, query-if, query-ref, refuse, reject-proposal, request, request-when, request-whenever, subscribe.
Introducción a LEAP
Leap es una plataforma casi idéntica a JADE para dispositivos limitados (móviles y pdas).
Se distribuye desde la propia página de JADE Clases LEAP son un subconjunto adaptado de las
clases que forman el paquete JADE. El código de un agente JADE funciona casi tal cual en
LEAP. Para simularlo en un PC necesitamos de Java Wireless
Toolkit en lugar de jdk estándar.
Introducción a JADEX
http://vsis-www.informatik.uni-hamburg.de/projects/jadex/ JADE facilita comunicaciones, pero no estructura de
razonamiento interno. Razonamiento JADE depende de cómo se programen
los comportamientos. Ideal para agentes reactivos. Se puede combinar con JESS o con DROOLS para
dotar a los agentes de inteligencia. JADEX es única plataforma compatible con JADE (es
una extensión) que facilita implementación del modelo deliberativo (BDI) de comportamiento.
Arquitectura de JADE
Arquitectura distribuida Multiples Hosts Multiples Procesos Multiples “Agent Containers”
Un contenedor de agentes Un proceso java por cada contenedor Es transparente a los agentes El contenedor principal alberga los servicios de la
plataforma JADE Contenedores en contacto mediante Java RMI
Servicios de plataforma
Han sido implementados como agentes AMS: Agent Management Service
“White Pages” Matiene una lista de los identificadores de agentes (AID)
que se están ejecutando en la plataforma DF: Directory Facilitator
“Yellow Pages” Proporciona un servicio de búsqueda de agentes Relaciona la descripción del tipo (role) y servicio que
proporcionan los agentes con su identificador. Los agentes pueden modificar la información sobre sí
mismos.
Arquitectura JADE
Network protocol stack using RMI
JRE JRE JRE
Jade Main-container Jade Agent Container Jade Agent Container
Jade distributed Agent Platform
DF
Age
nt
AM
S A
gent
App
lica
tion
Age
nt
App
lica
tion
Age
nt
App
lica
tion
Age
nt
App
lica
tion
Age
nt
App
lica
tion
Age
nt
App
lica
tion
Age
nt
Host 1 Host 2 Host 3
App
lica
tion
Age
nt
App
lica
tion
Age
nt
DF: Directorio de agentes y servicios Proporciona un lugar en donde los agentes registran sus
descripciones/servicios de tal forma que otros agentes puedan utilizar ese medio para localizar agentes/servicios con los que deseen interactuar/invocar
Datos mínimos de un agente AID: nombre único global Nombre del servicio Tipo del servicio
Cómo anunciarse Primero el agente da a conocer sus servicios al DF Y entonces el DF crea una entrada de directorio con sus
datos de agente La búsqueda de los agentes es por matching simple de
cadenas de caracteres y pares atributo-valor
Un agente JADE
Un agente es un programa JADE de un solo thread. Incluye un modelo para programar su funcionamiento
basado en tareas: Una tarea = un comportamiento (behaviour) Programadas por el agente Tareas operan en paralelo. Permite coordinación explícita entre tareas Single-threaded
Envía y recibe mensajes a través de una API: Que facilita la codificación/decodificación de mensajes
Programar un agente JADE
Programar un agente en JADE consiste en definir una clase Java que representa al agente y: Implementa los comportamientos que va a mostrar Hereda de la clase jade.core.Agent Programa sus métodos de inicio (setup) y fin (takeDown)
Para ejecutar el agente, podemos hacerlo desde el interfaz de JADE o desde cualquier otro programa JAVA explícitamente
AgenteSeve
Dentro de un AgenteAgent
CommunicationLanguage
dispatchloop
Ontology
ProfilePreferences
FactsRules
Models
Behaviour
Behaviour
Behaviour
AgenteOlazábal
Seve: Golf course
Course:
Play Cancel
Messages:
Augusta
(propose (course augusta …
start cancel
Lanzar un agente desde el GUI de JADEexport
CLASSPATH=/ruta/jade/lib/jade.jar:/ruta/jade/lib/iiop.jar:/ruta/jade/lib/http.jar
java jade.Boot -gui
Lanzar un agente desde el GUI de JADE Seleccionamos el main-container en el árbol de directorios Pulsamos el botón New Agent
Un agente hola-mundo
import jade.core.Agent;
public class HiWorldAgent extends Agent
{
protected void setup()
{
System.out.println(‘‘Hola mundo! ‘‘ +
getAID().getName() + ‘‘ is ready.’’);
}
}
Lanzando un agente JADE desde DOSjavac HiWorldAgent.javaexport CLASSPATH=/opt/jade/lib/jade.jar:/opt/jade/lib/http.jar:.java jade.Boot mi_agente:HiWorldAgentThis is JADE 3.4.1 - 2007/06/26 13:41:05downloaded in Open Source, under LGPL restrictions,at http://jade.cselt.it/http://simon:7778/accAgent container Main-Container@JADE-IMTP://simon is ready.Hola mundo! mi_agente@simon:1099/JADE is ready.
Lanzar un agente desde un programa Javaimport jade.core.*;
import jade.wrapper.*;
Runtime rt= Runtime.instance();
Profile p= new ProfileImpl();
AgentContainer ac= rt.createMainContainer(p);
Object misargs[]= null;
Agent miagente= ac.createAgent(“minombre”, ”mipaquete.miclase”, misargs);
miagente.start();
Prog. Basada en Comportamientos JADEPasos:1. determinar qué debe ser capaz de hacer el agente2. asociar cada funcionalidad con un comportamiento3. escoger el tipo de comportamiento4. dejar a JADE la tarea del scheduling (un solo
comportamiento se está ejecutando en cada instante)
Comportamientos JADE
Cada agente tiene asociado un conjunto de comportamientos. Cada comportamiento puede realizar una tarea simple como:
“Envía este mensaje”, “Compra X”, etc. Aunque se pueden crear comportamientos compuestos Los comportamientos son objetos java (una subclase de
jade.core.Behaviour). Un comportamiento se programa redefiniendo el método
action()
Orden ejecución comportamientos JADE Un agente esta permanentemente verificando si alguno de
sus comportamientos puede ejecutarse. Todos los comportamientos intentan ejecutarse con igual
frecuencia Cada agente tiene para sí una cola de comportamientos
activos Un comportamiento se ejecuta hasta que acaba (si no lo
bloqueamos), al acabar se invoca al método done, para decidir si se pone al final de la cola de activos (false) o no.
Orden ejecución comportamientos JADE Un comportamiento puede bloquearse, método block(). El bloqueo significa que, cuando el método action() termina,
se le coloca en una segunda cola, la de comportamientos bloqueados.
Se desbloquea cuando llegan mensajes al agente Cuando llega un nuevo mensaje, se le saca de esa cola de
comportamientos bloqueados y se le coloca al final de la de comportamientos activos.
Tipos de comportamientos
SimpleBehaviour Hay que definir el método done
CyclicBehaviour No se puede definir done, ya que es como si estuviera
permanentemente devolviendo false OneShotBehaviour
No se puede definir done ya que es como si estuviera permanentemente devolviendo true
Tipos de Comportamientos JADEBehaviour
action()done()
Simple Behaviour CompositeBehaviour
<<protected>> preAction()<<protected>> postAction()<<protected>> bodyAction()
addBehaviour()removeBehaviour()OneShotBehaviour CyclicBehaviour
SequentialBehaviour
<<protected>> bodyAction()
Abstract class
Abstract class - simple
Abstract class – composeschildren;
ParallelBehaviour
<<protected>> bodyAction()
FSMBehaviour
<<protected>> bodyAction()
Finite State Machine
done = true
done = false
Mensajes JADE
Toda la comunicación está basada en el intercambio de mensajes
La Plataforma JADE que alberga al agente se encarga de hacerle llegar los mensajes a la plataforma del agente destinatario.
La codificación y decodificación de mensajes la hacen automáticamente los agentes
Construir un mensaje
Cada mensaje es una objeto de la clase jade.lang.acl.ACLMessage.
Se puede acceder a sus campos mediante métodos get y set. Pasos: Crear objeto mensaje Indicar acto comunicativo (performative) Indicar destinatarios Indicar otros atributos del mensaje (codificación, ontología,
lenguaje, reply-with, etc.) Rellenar contenido (Cadena de caracteres en un lenguaje, u
objetos de una ontología)
Atributos de un mensaje
ConversationID – Para enlazar mensajes de un mismo diálogo
In reply to – Para distinguir a qué mensaje está respondiendo
Reply with – Para indicar cómo responder al mensaje Reply by – Para establecer un tiempo límite de respuesta Language – Para indicar en qué lenguaje está escrito el
texto enviado como contenido Ontology – Para especificar qué ontología está usandose Protocol – Especifica el protocolo (predefinido) Content – Contenido principal del mensaje
Enviar un mensaje
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.addReceiver(new AID(“Peter”, AID.ISLOCALNAME));
msg.setLanguage(“English”);
msg.setContent(“Today it s raining”);
send(msg);
Recibir un mensaje
Para reconocer (matching) si el mensaje recibido es del tipo del que se espera, se utilizan plantillas (objetos de tipo jade.lang.acl.MessageTemplate)
Pasos: Creamos plantilla para comparar el mensaje recibido con el
esperado: MessageTemplate. Por ejemplo: MatchPerformative(ACLMessage.REQUEST)
Invocamos método receive del agente con el objeto de tipo plantilla como argumento. Este método devuelve un objeto del tipo ACLMessage. si el mensaje != null era el mensaje que esperábamos.
Construir una respuesta
public void action() { ACLMessage msg = myAgent.receive(); if (msg != null) { String title = msg.getContent(); ACLMessage reply = msg.createReply(); Integer price = (Integer) catalogue.get(title); if (price != null) { reply.setPerformative(ACLMessage.PROPOSE); reply.setContent(
String.valueOf(price.intValue())); } else { reply.setPerformative(ACLMessage.REFUSE); reply.setContent( not-available ); } myAgent.send(reply);} } }
Ontologías en JADE
Una ontología proporciona una descripción de los conceptos de un dominio y las relaciones entre ellos. Relaciona estos conceptos con objetos Java.
JADE permite el manejo de ontologías para: Representar el dominio de aplicación mediante conceptos,
predicados, acciones, tipos de agentes, etc. Intercambiar elementos de la ontología entre agentes (i.e. en
el contenido del mensaje FIPA)
Definirlas ‘a mano’ es conceptualmente sencillo. Pero pesado si la ontología tiene un tamaño medio. Una alternativa es utilizar Protégé 2000 para el modelado y generación (Beangenerator) de la ontología JADE.
Componentes de una ontología
Una ontología es un conjunto de elementos (schemas) que permiten representar el dominio del que hablan los agentes.
Predicados: Afirmaciones sobre el estado del mundo, p.e. '(pertenece (Profesor :name Carbo)
(Universidad :name CarlosIII))' Se utilizan en típicamente en mensajes INFORM y QUERY-
IF, no en REQUEST. Términos: pueden ser conceptos, acciones, primitivas,
agregados, referencias y variables.
Términos de una ontología
Conceptos: representan una estructura con varios atributos: (Libro :titulo "Razonamiento con
incertidumbre" \ :autor (Profesor :name Carbo))No aparecen aisladamente en los mensajes sino incluidos en
predicados u otros tipos de términos. Acciones: Representan una acción a realizar por un agente:
(Estudiar (Libro :titulo "Razonamiento con incertidumbre"\ :autor (Profesor :name Carbo)))
Típicamente se utilizan en mensajes de tipo REQUEST. Agregaciones: conjuntos, listas de otros términos. Primitivas: elementos atómicos como números y cadenas de
caracteres. Variables: ?x Referencias: Para todo x que:
(all ?x (pertenece ?x (Universidad :name Carlos3))
Conceptos de una ontología
Para implementar nuestros propios concepts, acciones y predicados usaremos instancias de PredicateSchema, AgentActionSchema y ConceptSchema.
Estas clases tienen métodos que permiten construir nuestra propia estructura de estos términos para nuestro dominio.
Así con una clase Libro que implemente la interfaz Concept, podemos añadir este concepto desde el código de la clase de nuestra ontología con: add(new ConceptSchema("Libro", Libro.class);
ConceptSchema cs= (ConceptSchema) getSchema("Libro");
cs.add("isbn", (PrimitiveSchema) getSchema(BasicOntology.INTEGER));
Conceptos de una ontología
Para hacer un campo opcional, incluir el argumento: ObjectSchema.OPTIONAL
Para indicar la cardinalidad, incluir dos argumentos númericos (mínima y máxima) o bien ObjectSchema.UNLIMITED
Si queremos indicar un id de agente: BasicOntology.AID Una cadena de caracteres: BasicOntology.STRING Cada campo de un termino debe tener sus correspondientes
métodos de acceso set y get, p.e. la clase del concepto Libro debe incluir los métodos setTitulo, getTitulo, etc.
Predicados y acciones de una ontología Para añadir predicados o acciones, el proceso es equivalente
a los conceptos pero utilizando las clases PredicateSchema y AgentActionSchema en lugar de ConceptSchema
... y además la clase indicada como argumento debe implementar la interfaz Predicate o AgentAction en lugar de Concept.
Utilizar una ontología
Lo primero es utilizar una misma referencia estática a la ontología:private Ontology miont =MiOntologia.getInstance();
Luego registrarla junto con el codificador codec: que hayamos escogido (SLCodec, LEAPCodec ...)getContentManager().registerLanguage( new
SLCodec());
getContentManager().registerOntology(miont);
Utilizar una ontología
Para indicar en un mensaje la ontología utilizada: msg.setLanguage(codec.getName());
msg.setOntology(miont.getName()); A continuacion con los métodos set damos valor a los
términos de la ontología a utilizar en el contenido del mensaje, p.e. Libro milibro = new Libro();
milibro.set("Titulo", "Razonamiento con incertidumbre"');
Por último se rellena el contenido del mensaje antes de mandarlo: getContentManager().fillContent(msg,milibro);
LEAP
Leap es una plataforma casi idéntica a JADE para dispositivos limitados (móviles y pdas).
Se distribuye desde la propia página de JADE: LeapAddOn-3.4.1.zip
Clases LEAP son un subconjunto adaptado de las clases que forman el paquete JADE.
LEAP hace uso de Apache ANT para compilar el ejecutable en dispositivos limitados (.jad). http://ant.apache.org/
El código de un agente JADE funciona casi tal cual en LEAP. Se ejecuta sobre la versión micro de Java (J2ME) en lugar la
versión estándar (JDK). J2ME incluido en el paquete Sun Java Wireless Toolkit. Descargable gratuitamente de la web.
Plataformas de ejecución de LEAP
Ejecución de LEAP en móviles/PDAs
Ejecución de LEAP en móviles/PDAs
Limitaciones de LEAP
No se puede utilizar el SNIFFER No se pueden utilizar clases de …
… de Java que no estén incluidas en la versión micro (J2ME). Es decir, no todo jdk disponible. Por ejemplo, J2ME no soporta la librería gráfica awt.
… de Jade que no pertenezcan a la librería de LEAP. Hay que contar con los fuentes de cualquier otra clase java a
incluir, ya que hay que recompilar directamente todo el código fuente a la vez para generar el .jad
Compilar LEAP
Editar fichero ‘buidleap.properties’ incluyendo la carpeta del jwt y la version 2.0 de midp en los campos j2me-wtk-home y midp-version.
Escribiremos ‘ant j2se rebuild’ para generar el fichero jade/leap/j2se/lib/JadeLeap.jar que utilizará la plataforma jade que hace de main-container.
Escribiremos ‘ant midp rebuild’ para generar el fichero jade/leap/midp/lib/JadeLeap.jar que utilizará el emulador de jwt.
Sugerencia: Para compilar agente de leap, usar netbeans con el mobility pack.
Compilar la demo de LEAP
Es preciso retocar el código de la demo que viene con LEAP: Línea 87 de ChatClientAgent.java: hacer como haría el
preprocesador. Eliminar el código a excluir en caso de usar MIDP, junto con las directivas. Hacer lo mismo en el caso de incluir.
En el fichero MIDPChatGUI.java eliminar directivas del principio del fichero.
Eliminar las líneas 31, 44 y 115 de Start.java
Ejecutar LEAP
set classpath=rutajade\jade\leap\j2se\lib\JadeLeap.jar
java jade.Boot -nomtp
set classpath=rutawtk\wtk25\bin
rutawtk\wtk25\bin\emulator -Xdescriptor:leapmnet.jad
Primero lanzar la plataforma JADE que con la que se comunicará el movil/pda:
Después lanzar el emulador jwt del movil/pda con el fichero .jad generado como argumento:
Jadex
Extensión de JADE para utilizar una arquitectura deliberativa en JADE. Los agentes Jadex se ejecutan en un container de Java.
Se definen con dos elementos: una descripción en xml y clases java que representan sus planes. La implementación en java de cada plan accede y modifica
las creencias, satisface/abandona objetivos y adopta nuevos objetivos.
En el fichero xml incluimos información sobre: creencias, deseos (goals), planes, mensajes y estados iniciales del agente.
Arquitectura Jadex
Ejecución desde el interfaz de Jadex Desde la ventana principal (Jadex Control Center) pulsar el
botón“+” para incluir el jar o la carpeta donde están las clases JAVA que utiliza el agente a incluir.
Entonces pulsar el botón“…” para incluir el fichero xml que define a tu agente.
Una vez compilado el xml sin errores, indicaremos el nombre que le damos al agente, los argumentos que queramos (si procede) y podremos escoger uno de los estados iniciales que hayamos definido en el fichero xml.
Ejecución desde el interfaz de jadex
Ejecución desde un programa en javaimport jadex.model.SXML;
import jadex.util.Sreflect;
import jadex.modelIMBDIAgent;
String misimports[]= null;
IMBDIAgent miagente= IMBDIAgent model = jadex.model.SXML.loadAgentModel (“mixml”, misimports);
Object misargs[]= new Object[] {“mixml”,”miestadoinicial”};
Agent miagente= ac.createAgent(“minombre”, "jadex.adapter.jade.JadeAgentAdapter" , misargs);
miagente.start();
La definición xml de un agente Jadex
Creencias de un agente jadex
Asocia una clase java a las creencias que manejarán los planes del agente en cuestión:<belief name=“mi_posicion" class=“Posicion">
Podemos definir creencias iniciales usando argumentos con los que se creó el agente JADEX<fact>new Movimientos($arg1)</fact>
Podemos definir grupos de creencias<beliefset name=“mis_movtos" class=“Posicion" />
Planes de un agente jadex
Indicamos el constructor de la clase java correspondiente al plan y las condiciones para que se ejecute:
Al iniciarse el agente: <plan name=“MoverPlan“>
<body>new MoverPlan()</body>
<trigger>Condicion</trigger>
</plan>
Donde la condición puede ser: Cuando se activa un objetivo
<trigger><goal ref=“comerpiezagoal"/></trigger> Cuando se produce un evento (llegada de mensaje)
<trigger><messageevent ref=“turnomsg"/></trigger>
Los mensajes de un agente jadex Se definen su dirección, performative y típicamente el
comienzo del contenido para distinguir su tipo:<messageeventname=“turnomsg" type="fipa“
direction="receive">
<parameter name="performative" class="String“ direction="fixed">
<value>jadex.adapter.fipa.SFipa.CFP</value>
</parameter> <parameter name="content-start" class="String“ direction="fixed">
<value>"Movement_expected"</value>
</parameter>
</messageevent>
Estados iniciales de un agente JadexEn ellos podremos indicar las creencias y planes que
inicialmente asume el agente:<initialstates>
<initialstatename=“muevoprimero">
<beliefs><initialbeliefsetref=“mis_movimientos">
<fact>new Posicion(0,0)</fact>
</initialbeliefset></beliefs>
<plans>
<initialplanref="surveillanceplan" />
</plans>
</initialstate>
</initialstates>
Deseos (goals) de un agente jadexNo tienen asociado una clase java. 4 tipos: Perform: actividades a realizar sobre el estado del mundo
<performgoal name=“comerpieza”></performgoal> Achieve: un determinado estado del mundo (definido por las
creencias) debe alcanzarse Maintain: reestablece un estado del mundo en cuanto falte
alguna creencia. Query: para completar estado del mundo
Usualmente activados desde los planes en java: Goal objetivo= createGoal(“comerpieza"); dispatchTopLevelGoal(objetivo); dispatchSubgoal(objetivo);
Deseos (goals) de un agente jadex
Paso de parámetros
Se pueden indicar parámetros al definir un objetivo:<performgoal name=“comerpieza">
<parameter name=“pieza" class=“Pieza" />
</performgoal> Los parámetros son clases java que nos definimos nosotros. El plan instanciado como consecuencia de la adopción de un
determinado objetivo recibe dicho parámetro:<plan name=“MoverPlan">
<parameter name=“pieza" class=“Pieza"><goalmapping ref=“comerpieza.pieza"/></parameter>
<body>new WarningPlan()</body>
<trigger><goal ref=“comerpieza"/></trigger>
</plan>
Una clase java Plan de jadex
Subclase de jadex.runtime.Plan Mandar parámetro a objetivo creado en el plan:
Goal comer = createGoal(“comerpieza");
comer.getParameter(“pieza").setValue(pieza);
dispatchSubgoal(comer); Acceder a las creencias
private RBeliefbase bb;
bb=getBeliefbase();
RBeliefSet loc=bb.getBeliefSet(“mis_movimientos");
Tuple[] loc2=(Tuple[])loc.getValues();
Una clase java Plan de jadex
Acceder al mensaje que provocó un evento:RMessageEvent peticion=
((RMessageEvent)getInitialEvent());
String contenido=mensaje.getMessage().getContent();
Mandar un mensaje nuevo:ACLMessage mensaje= newACLMessage(ACLMessage.INFORM);
mensaje.addReceiver(new AID(receptor,AID.ISLOCALNAME));
mensaje.setContent(imagenmundoexterior);
sendMessage(createMessageEvent(mensaje));
Mandar una respuesta:
RMessageEventre=peticion.createReply(ACLMessage.INFORM,respuesta);
sendMessage(re);
Acceder a Jade desde Jadex
Para invocar métodos particulares de JADE como para registrarse en el directorio, JADEX tiene planes predefinidos (ver ejemplos).
Una alternativa es hacerlo igual que en JADE desde un plan de JADEX:jade.core.Agent agent =
(jade.core.Agent)getScope().getPlatformAgent();
Directorio (DF) en jadex
<import>jadex.planlib.*</import>
<capability name="dfcap“ file="jadex.planlib.DF"/>
Para registrarse:<maintaingoalref name="df_keep_registered">
<concrete ref="dfcap.df_keep_registered"/>
</maintaingoalref>
Para buscar en el df:<achievegoalref name="df_search">
<concrete ref="dfcap.df_search"/>
</achievegoalref>
Directorio (DF) en jadex
<initialstate name="default">
<goals>
<initialgoal ref="df_keep_registered">
<parameter ref="description"> <value>$propertybase.getProperty("fipa.agentdescription.dealer")</value>
</parameter>
</initialgoal>
</goals>
</initialstate>
Top Related