Date post: | 23-Jan-2016 |
Category: |
Documents |
Upload: | amaranto-olivero |
View: | 225 times |
Download: | 0 times |
Agentes Inteligentes
M.C. Juan Carlos Olivares Rojas
[email protected]@hotmail.com
@jcolivareshttp://antares.itmorelia.edu.mx/~jcolivar
Febrero, 2010
Competencia Específica
• Conoce los fundamentos teóricos de la teoría de agentes y poderla aplicar en la práctica.
Agentes• Es un software (que puede incluir
hardware) que trabaja de manera autónoma y es capaz de realizar una serie de problemas de forma razonada.
• Los agentes se caracterizan por tener bien delimitados sus alcances. Generalmente reciben entrada a través de estímulos y realizan acciones hacia el exterior.
Arquitectura de Agentes
Agentes Inteligentes• Un agente es algo que razona (agente
viene del latín agere, hacer).
• Aparte de la autonomía y la racionalidad un agente debe de ser adaptable y en muchos casos “sociable”; es decir, poderse comunicar con otros agentes e incluso con el hombre mismo.
• Algunos autores a los agentes les llaman softbot.
Agentes Inteligentes
Aplicación de los Agentes
Inteligencia y Conocimiento
Patrones
Agentes
Coordinación y Sincronización
Robótica Móvil
Robótica de Manipuladores
Procesamiento de Imágenes
Redes Neuronales
Agentes Inteligentes• Se trata de emular la inteligencia natural
Razonamiento
Percepción
Memoria
Aprendizaje
Medio am
biente
Abstracción
Imaginación
Creatividad
Conciencia
Libre albedrio
Solución de problemas
Actuación
Áreas de la Teoría de Agentes
IA DistribuidaIngeniería de software
Sistemas distribuidos y redes
POO
NOCION DENOCION DEAGENCIAAGENCIA
Cerebro Humano como Máquina
• ¿Una computadora biológica?
• 1011 Neuronas (procesadores)
• Poder desconocido• 1000 – 10000
conexiones por neurona• Capacidad basada en
las conexiones.• Cada neurona es muy
compleja.• Almacenamiento
redundante.• No binario, no estable y
no asíncrono.
“Sensores Humanos”Neuronas
Olor
Color
Sabor
Sonido
Tersura
información
acciones
Conexiones
“Sensores Humanos”• Sonido 102 Hz, 104 Hz
• Color 1015 Hz
• Sabor ¿es una onda?
• Olor ¿es una reacción química?
• Tersura ¿es una onda?
104 Hz
102 Hz
MAS• Multi-Agent System (Sistemas Multi
Agentes) son una colección de agentes generalmente distribuidos geográficamente y que pueden trabajar en conjunto para el logro de objetivos.
• Se caracterizan por que no hay un control global del sistema (recordar que cada agente es autónomo), por lo que los datos están descentralizados y la comunicación es asíncrona.
MAS• Los agentes pueden ser reactivos o
proactivos.
• Se dice que es un agente es reactivo cuando dado un estímulo es capaz de procesar la respuesta.
• Un agente es proactivo cuando antes de percibir estímulos se encuentra trabajando.
MAS• Algunos ejemplos de agentes:
• Un demonio en unix (poca racionalidad)• Un sistema de calefacción/aire
acondicionado automatizado (poca racionalidad)
• Un agente planificador de vuelos• Un agente para recomendaciones en
sistemas de comercio electrónico.
MAS• Se considera que para que un agente
inteligente esté realmente completo se necesita de las siguientes actitudes:
• Conocimientos• Creencias• Intenciones• Obligaciones• Emociones
MAS• En los sistemas multiagente se hace
sumamente necesario la movilidad. Existen diversas clasificaciones de MAS:
COOPERATIVOSCOOPERATIVOS
AUTONOMOSAUTONOMOS
APRENDENAPRENDEN
AGENTES INTELIGENTESAGENTES INTELIGENTESCOLABORATIVOSCOLABORATIVOS
AGENTES DE AGENTES DE INTERFAZINTERFAZ
COLABORATIVOS/COLABORATIVOS/APRENDENAPRENDEN
Actividad• Para un Taxi con piloto automático (taximetro
reemplazado por un agente inteligente )
• Determine lo siguiente:
• Percepciones• Acciones• Metas• Ambiente
Ejemplo de MAS
Ambientes• Dependiendo del tipo de ambiente, la
inteligencia del agente varía. Actualmente se maneja el concepto de AMI (Ambientes Inteligentes) para describir el cómputo generalmente ubicuo que puede interactuar con su entorno. Es una variante de la domótica y del cómputo automatizado.
• A continuación se muestran los diferentes tipos de ambientes.
Cómputo Ubicuo y AMI
Inteligencia Ambiental
Consciencia del
dispositivo
Consciencia del
dispositivo
¿Qué se necesita para AMI?
¿Donde? WHERE¿Donde? WHERE
¿Quién? WHO¿Quién? WHO
Realizar servicios solosRealizar servicios solos
Realizar servicios coordinados
Realizar servicios coordinados
¿Cuándo? WHEN¿Cuándo? WHEN
¿Qué? WHAT¿Qué? WHAT
Context-Aware y SOA
¿Cómo? HOW¿Cómo? HOW
Ambientes• Accesible/Inaccesible: Si los sensores
proporcionan todo lo que hay que saber sobre el estado completo del ambiente.
• Determinístico/No-determinístico (estocástico): Si el estado siguiente del ambiente está determinado plenamente por el estado presente del mismo, y por la acción del agente.
Ambientes• Episódico/No-episódico: Un ambiente
episódico implica que los episodios siguientes no dependen de las acciones que ocurrían en episodios previos.
• Estático/Dinámico: Será estático todo ambiente que no cambie mientras el agente está pensando.
Ambientes• Discreto/Continuo: se es discreto cuando
existe un escaso número de percepciones y acciones en el ambiente. Continuo en el otro caso.
• Sin adversario/con adversarios racionales: los ambientes de estudio generalmente son contrincarios, aunque la realidad es más compleja, como la bolsa o los juegos deportivos.
Ejercicio de Ambientes
Tipos de Ambientes• De acuerdo con Russell & Norving se
tienen los siguientes tipos de agentes:
• De reflejo simple: se basan en reglas condición/acción. Carecen de memoria referente a estados pasados del mundo.
• Bien informado de lo que pasa: con un estado interno usado para almacanar estados pasados del mundo.
Tipos de Ambientes• Basados en meta (proactivos): además de
disponer de información sobre el estado, tienen una meta que describe situaciones deseables.
• Basados en Utilidad: basan su decisión en
la teoría de la utilidad para actuar racionalmente.
Agente Reactivo (Reflejo)
Agentes bien informados
Agentes basados en Metas
Agentes basados en Utilidad
BDI• Es una forma de representar agentes:
Belief (creencias), Desire (deseos), Intentions (intenciones).
• Las creencias representan la base de conocimientos, los deseos los logros a obtener y las intenciones son la serie de acciones a realizar para lograr los objetivos.
• Todo esto se debe explicitar de alguna forma.
Ejemplo de BDI• Ejemplo: TERMOSTATO • D = mantener temperatura en T• B = { t (A), OK(T) }• I = { Calentar, Enfriar, nada}
• Filtro: - Si A > T entonces I = Enfriar• - Si A < T entonces I = Calentar• - Si A = T entonces I = Nada
Ejemplo de BDI• Acción: Case I de • Enfriar Acción = bajar temp• Calentar Acción = subir temp• Nada Acción = nada
• Después de todo esto el principal reto en teoría de agentes es el lenguaje de comunicación entre los agentes y su entorno.
Lenguajes de Agentes• Existen diversos lenguajes de comunicación entre
agentes la gran mayoría propietarios aunque en los últimos años se han estandarizado dos:• KQML• FIPA ACL
– En este curso se trabajará con la plataforma de
agentes JADE.
– Los agentes se han hecho tan populares que ha surgido el paradigma de programación orientado a agentes AOP por sus siglas en inglés.
AOP• Programación Orientada a Agentes
• Nuevo paradigma computacional• Especialización de la OOP
• Elemento central: Agentes BDI
• Agente: creencias + capacidades + compromisos
AOPCaracterística OOP AOP
Unidad Básica Objecto Agente
Unidad Básica de Estados
Sin restricciones Creencias, compromisos, …
Proceso de cálculo Métodos de Respuesta y Paso de Mensajes
Métodos de Respuesta y Paso de Mensajes
Tipo de mensajes Sin restricciones Informe, solicitud, oferta, promesa, declinación
Limitaciones en métodos
Ninguna Honestidad, Consistencia, …
AOP• Modelado de Agentes
<<agent>> agent-name
Role
role 1, role 2, …, role n
role dynamic 1, role dynamic 2, …, role dynamic n
Organization
organization 1, organization 2, ., organization n
org dynamic 1, org dynamic 2, ., org dynamic n
Plataformas de Agentes• Existen muchas plataformas MAS como:
• Concordia• FIPA-OS• Zeus• Gossip• JATLite• Odyssey• Aglets• Voyager
JADE• Java Agent DEvelopment Framework fue
desarrollado en Italia por Telecom (formalmente CSELT) junto con la Universidad de Parma en Julio de 1998.
• El objetivo fue crear una implementación concreta de la especificación FIPA.
• Actualmente es la plataforma de agentes más utilizada en el mundo.
FIPA• Es un estándar para el manejo de
agentes para poderlos hacer interoperables define una arquitectura básica así como un lenguaje de agentes: ACL basado en KQML.
• En el caso de JADE se tiene la característica de manejar agentes móviles donde si no se le define “inteligencia” simplemente funcionan como un middleware de aplicaciones distribuidas.
JADE• Es un marco de trabajo de software para
facilitar el desarrollo de sistemas multiagentes inteligentes e interoperables.
• Constituye un midelware para el desarrollo y un ambiente de ejecución para aplicaciones punto a punto que siguen el paradigma de agentes.
• Jade está basado en Java.
Arquitectura de JADE
Arquitectura JADE• Cada instancia del ambiente de ejecución
se llama Contenedor, dado que puede contener varios agentes.
• El conjunto de contenedores activos se llama Plataforma.
• Debe existir un contenedor denominado como principal (Main Container), en el cual todos los demás contenedores deben registrarse tan pronto inicien su ejecución en el sistema.
Arquitectura JADE• El primer contenedor en iniciar en una
plataforma debe ser el principal.
• Los demás contenedores deben saber dónde localizar al principal (host:port)
• Si existe otro contenedor principal, entonces este constituye otra plataforma.
• Los contenedores puede registrarse en cualquiera de las plataformas disponibles.
Arquitectura JADE• El contenedor principal maneja dos
agentes especiales:• AMS (Agent Management System)
– Provee el servicio de nombres y representa la autoridad en el sistema (crear o eliminar agentes en un contenedor remoto).
• DF (Directory facilitator)– Provee las páginas amarillas de servicios a
través del cuál un agente puede encontrar a otros que proveen los servicios que requiere para completar sus metas.
Arquitectura JADE• JADE cuenta con una interfaz gráfica para
el manejo de los agentes.
• Para poder ejecutar JADE se requiere actualizar la variable de entorno classpath.
• En sistemas *X a través de export CLASSPATH=$CLASSPATH:/rutabibliotecas/jade.jar:/rutabibliotecas/otrosarchivos.jar
Arquitectura JADE• En el caso de sistemas Windows puede
hacer a través de línea de comandos o a través de la opción de variable de entorno dentro de la configuración principal del equipo.
• Una vez instalada la máquina virtual de Java se ejecuta: java jade.Boot para correr en modo texto JADE o bien java jade.Boot –gui para correrlo en modo gráfico.
Arquitectura JADE• Interfaz Gráfica RMA (Remote Agent
Management)
Arquitectura JADE• Se cuenta con algunos agentes de
utilidad como el agente sniffer que permite rastrear el paso de mensajes entre los agentes.
Arquitectura JADE• El agente instrospector permite visualizar
los mensajes y comportamientos de los agentes.
Arquitectura JADE• El agente Dummy permite interactuar
con otros agentes mandando y recibiendo mensajes.
Arquitectura JADE• Para la comunicación se utiliza el
protocolo IIOP utilizando RMI (con compatibilidad nativa con CORBA).
• La comunicación se puede dar:– Entre agentes en el mismo contenedor– Entre agentes en distintos contenedores pero
en la misma máquina– Entre agentes en distintas máquinas
utilizando JADE– Entre agentes en distintas plataformas
Ciclo de Vida de Agente en JADE
Modelo de Ejecución• JADE usa la abstracción de Behavior o
comportamiento para modelar las tareas que un agente debe realizar.
• JADE usa el modelo de concurrencia de hilo-por-agente en lugar de hilo-por-comportamiento para mantener pocos hilos en concurrencia.
Modelo de Ejecución• Cada agente posee un programador de
comportamientos que implementa una política “round-robin non-preemptive”.
• Se utilizan dos métodos para manejar la cola de comportamientos de agente: addBehaviour(Behaviour) y removeBehaviour(behaviour).
Hola Mundo en JADE• En el caso de contar con un IDE como
NetBeans se deberán incluir todos los archivos de biblioteca *.jar en el proyecto.
• Para poder ejecutarlo se necesitará modificar las propiedades del proyecto para que la clase principal sea jade.Boot y en los argumentos de ejecución la opción –gui seguida del nombre del agente y de la clase agente. Por ejemplo agente1:Comprador
Modelo de Ejecución
Programación en JADE• El proyecto en su totalidad se puede
bajar de la liga AgenteSimple.zip del sitio Web de la asignatura.
import jade.core.*;import javax.swing.*;public class AgenteSimple extends Agent { @Override public void setup(){ System.out.println("Ejemplo de Agente
Simple!!!");
Programación en JADE JOptionPane.showMessageDialog(null, "El
nombre del agente es:"+getAID().getName());
}
@Override public void takeDown(){ JOptionPane.showMessageDialog(null,
"Se murió el agente"); }}
Programación en JADE• Un agente de manera predeterminada no
recibe datos a través de su constructor por lo que debe pasárselos a través de línea de comandos.
import jade.core.Agent;public class Parametros extends Agent { private String titulo; @Overrideprotected void setup() { System.out.println("Prueba de
Programación en JADEObject[] args = getArguments();if (args != null && args.length > 0) { titulo = (String) args[0]; System.out.println("Comprando CD:"+titulo);} else { System.out.println("No se recibieron parámetros. El agente
morirá"); doDelete(); }}• @Override• protected void takeDown() { • System.out.println("El agente:"+getAID().getName()+" está
colgando los tennis");
• }• }
Programación en JADE@Overrideprotected void takeDown() { System.out.println("El
agente:"+getAID().getName()+" está colgando los tennis");
} }
Para ejecutarse sería algo así como: java jade.Boot –gui agente:MiClaseAgente(“Parametro1”, parametro2, etc…)
Programación en JADE• Aunque se pueden crear agentes a partir
de otra clase que por ejemplo tenga o no un método main() su funcionamiento no es el adecuado.
• Por ejemplo si quisiéramos que un agente tuviese una interfaz gráfica, sería el agente el cual debiera de crear la interfaz.
Programación en JADE• Otra de las características fundamentales
de los agentes es la programación de los comportamientos.
• Un comportamiento no es otra cosa que un método que ejecuta de manera constante (en forma concurrente un hilo).
• A continuación se muestra un ejemplo de definición de comportamiento de un agente con interfaz gráfica.
Programación en JADEimport jade.core.Agent;import jade.core.behaviours.*;import java.util.*;public class Comportamiento extends
Agent { private Hashtable catalogo; private Interfaz i; @Overrideprotected void setup() { setCatalogo(new Hashtable());
Programación en JADEi = new Interfaz(this); i.setVisible(true);}@Overrideprotected void takeDown() {i.dispose(); }public Hashtable getCatalogo() { return catalogo; }
Programación en JADEpublic void setCatalogo(Hashtable
catalogo) { this.catalogo = catalogo; }}
• En la interfaz se diseña una forma con un cuadro de texto y dos botones: uno para agregar el texto (implementa el comportamiento del agente) y otro para listar los datos.
Programación en JADE• La clase que define el comportamiento
tiene la siguiente estructura
class comportamientoAgregar extends Behaviour{
private String titulo; private int precio; private Hashtable catalogo; public comportamientoAgregar(String
t, int p, Hashtable h){ titulo = t;
Programación en JADEprecio = p; catalogo = h; } public void action() { catalogo.put(titulo, precio); } public boolean done() { return true; }}
Programación en JADE• En lo que respecta al botón de agregar en
la interfaz que manda llamar al comportamiento del agente se tiene:
public void actualizarCatalogo() { agente.addBehaviour(new
comportamientoAgregar(titulo.getText(), Integer.parseInt(precio.getText()), agente.getCatalogo()));
}
Comportamientos en JADE• Existen algunos tipos de
comportamientos básicos predefinidos para extender el uso de comportamientos:
• SimpleBehaviour: Es un comportamiento simple en el cual el usuario debe definir dentro del método onEnd() la condiciones sobre las cuales el comportamiento debe terminar.
Comportamientos en JADE• OneShotBehaviour: Es un
comportamiento simple que se ejecuta sólo una vez y no puede ser bloqueado. Por lo tanto el método done() siempre retorna verdadero. La función done() retorna verdadero o falso para definir si el comportamiento finalizó o no.
• CyclicBehaviour: Este comportamiento simple puede ser ejecutado infinitamente, por lo que el método done() siempre retorna falso.
Comportamientos en JADE• FSMBehaviour.- Es un comportamiento
compuesto que se ejecuta de acuerdo a una máquina de estado finito cuyos estados son definidos por el usuario.
• SequentialBehaviour.- Este comportamiento compuesto ejecuta secuencialmente varios subcomportamientos y termina cuando todos los subcomportamientos hayan terminado.6. ParallelBehaviour.- Es un comportamiento compuesto que ejecuta subcomportamientos concurrentemente y termina cuando una condici ́on particular en estos subcomportamien- tos se cumple.
Comportamientos en JADE• ParallelBehaviour: Es un comportamiento
compuesto que ejecuta subcomportamientos concurrentemente y termina cuando una condición particular en estos subcomportamientos se cumple.
• TickerBehaviour: es un comportamiquento que se hace cada x tiempo predeterminado.
Comportamientos en JADE• public class AgenteMonitor extends Agent
{ ...• addBehaviour(new
TickerBehaviour(this,2000) { public void onTick() {
• //Instrucciones de monitoreo• System.out.println(“ya casi es hora de
salir”)• }} }); ...
Clonación• Los agentes se pueden clonar, para ello
se deberán redefinir los métodos afterClone y beforeClone para definir funcionalidades básicas.
• Los agentes se pueden crear en tiempo de ejecución para ello se deberá importar la clase jade.core.RunTime.
• Runtime rt = Runtime.instance();
ClonaciónAgentContainer ac =
getContainerController();
AgentController agente1= ac.createNewAgent("AgenteRecolector",”paquete.X",args);
Agente1.start();
Ontologías en JADE• Se pueden definir ontologías para un
manejo homogéneo del vocabulario de los agentes.
• Las ontologías se basan en jade.content.onto.Ontologyy deben de definir tres dominios de conceptos: PredicateSchema, AgentActionSchema y ConceptSchema incluidas en el paquete jade.content.schema.
Ejemplo de Ontologíapackage conexionOntology;import jade.content.onto.*;import jade.content.schema.*;public class conexionOntology extends
Ontology {public static final String ONTOLOGY_NAME
= "ontología de conexión”; public static final String URL_ = "Url”;public static final String URL_IP = "ip";public static final String URL_PUERTO =
Ejemplo de Ontología"puerto";public static final String CONEXIONA =
"ConexionA";public static final String CONEXIONA_URL =
"url";public static final String CONECTA =
"Conecta";public static final String CONECTA_URL =
"url”; private static Ontology laInstancia = new
conexionOntology();
Ejemplo de Ontologíapublic static Ontology getInstance() {return
laInstancia;} private conexionOntology() {super(ONTOLOGY_NAME,
BasicOntology.getInstance());try {add(new ConceptSchema(URL_), Url.class);add(new PredicateSchema(CONEXIONA),
ConexionA.class);add(new AgentActionSchema(CONECTA),
Ejemplo de OntologíaConecta.class); URL_ConceptSchema cs = (ConceptSchema)
getSchema(URL_);cs.add(URL_IP, (PrimitiveSchema)
getSchema(BasicOntology.STRING),ObjectSchema.OPTIONAL);
cs.add(URL_PUERTO, (PrimitiveSchema) getSchema(BasicOntology.INTEGER));
PredicateSchema ps = (PredicateSchema) getSchema(CONEXIONA);
Ejemplo de Ontologíaps.add(CONEXIONA_URL, (ConceptSchema)
getSchema(URL_));AgentActionSchema as =
(AgentActionSchema) getSchema(CONECTA);
as.add(CONECTA_URL, (ConceptSchema) getSchema(URL_));
}catch (OntologyException oe) {oe.printStackTrace();
}}
Concepto de Ontologíapackage conexionOntology;import jade.content.Concept;public class Url implements Concept {private String ip;private int puerto;public String getIp() {return ip;}public void setIp(String i) {ip = i;}public int getPuerto() {return puerto;}public void setPuerto(int p) {puerto = p;}}
Ejemplo deOntologías package conexionOntology;import jade.content.Predicate;public class ConexionA implements
Predicate {private Url url;public Url getUrl() {return url;}public void setUrl(Url u) {url = u;}}
Ejemplo de Ontologíaspackage conexionOntology;import jade.content.AgentAction;public class Conecta implements
AgentAction {private Url url;public Url getUrl() {return url;}public void setUrl(Url u) {url = u;}}
Programación en JADE• Como puede observarse en algunos casos
da lo mismo implementar un comportamiento que definir un método cuando el comportamiento no es inteligente.
• La parte más interesante de los sistemas de agentes móviles es la comunicación entre los agentes. A continuación se muestra un ejemplo de cómo implementar el envío de mensajes
Programación en JADEimport jade.core.*;import jade.lang.acl.*;import java.io.*;public class Mensajero extends Agent { private String nombre; private String contenido; public Mensajero(){ nombre = ""; contenido = ""; }
Programación en JADE@Override public void setup() { ACLMessage msg = new
ACLMessage(ACLMessage.INFORM); BufferedReader bf = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Introduce el nombre del agente a enviar mensaje?");
try { nombre = bf.readLine();
Programación en JADE} catch (IOException ioe) { ioe.printStackTrace(); } msg.addReceiver(new AID(nombre,
AID.ISLOCALNAME)); msg.setLanguage("Español"); System.out.println("Introduce el
contenido del mensaje?"); try { contenido = bf.readLine();
Programación en JADE} catch (IOException ioe){ ioe.printStackTrace(); } msg.setContent(contenido); send(msg); System.out.println("Contenido
Enviado"); }}
Programación en JADEimport jade.core.*;import jade.lang.acl.*;public class ReceptorRespuesta extends
Agent{ @Override public void setup(){ //receive es no bloueante... //ACLMessage msg = receive(); //Hasta que llegue un mensaje aquí se
queda
Programación en JADEACLMessage msg = blockingReceive(); if (msg != null) { System.out.println("Llego
mensaje..."); String nombre =
msg.getSender().getLocalName(); System.out.println("Mensaje
enviado por:"+nombre); String contenido =
msg.getContent();
Programación en JADESystem.out.println("El contenido del mensaje
es:"+contenido); ACLMessage reply =
msg.createReply();
reply.setPerformative(ACLMessage.PROPOSE);
String respuesta = String.valueOf(Math.random()*100);
System.out.println("La respuesta a enviar es:"+respuesta);
reply.setContent(""+respuesta);
Programación en JADEsend(reply); } else { System.out.println("No llegó
mensaje"); } }}
Programación en JADEimport jade.core.*;import jade.domain.*;import
jade.domain.FIPAAgentManagement.*;public class Registro extends Agent{ @Override public void setup(){ System.out.println("Registrando
Agente en la sección amarilla..."); DFAgentDescription dfd = new
DFAgentDescription();
Programación en JADEdfd.setName(getAID()); ServiceDescription
sd = new ServiceDescription(); sd.setType("Venta-Libros"); sd.setName("Agente-Vendedor"); dfd.addServices(sd); try { DFService.register(this, dfd); } catch (FIPAException fe) { fe.printStackTrace(); } }
Programación en JADE@Override protected void takeDown() { try { DFService.deregister(this); } catch (FIPAException fe) { fe.printStackTrace(); } System.out.println("Desregistrando
servicios en el DF"); }}
Prácticas• Agente para Transacciones de Comercio
Electrónico (“carrito de compras”)
• Un MAS que permita tener un agente para tomar pedido, recolectar pedido, cancelar pedido.
• Un buscador Web de páginas semánticas en dispositivos móviles
Bibliografía
Winston, P. (1992) Artificial Intelligence, 3ra. Edición, Addison-Wesley.
• Fabio Bellifemine, Giovanni Caire, Agostino Poggi, Giovanni Rimassa, 2008, JADE: A software framework for developing multi-agent applications. Lessons learned, Information and Software Technology, 50(1): 10-21. http://jade.tilab.com/
¿Preguntas, dudas y comentarios?