Jade
Java Agent Development
Framework
http://jade.tilab.com/
JADE
Jade é um middleware para o
desenvolvimento de sistemas
multi-agentes
Inclui
Um ambiente de execução onde os agentes
JADE "vivem" e que deve estar ativo em um
host antes que um agente possa ser executado
Uma biblioteca de classes que programadores
podem usar para desenvolver agentes
Um conjunto de ferramentas gráficas que
JADE
Contêiner
Instância de um ambiente Jade
É onde os agentes executam
Ao iniciar o Jade, um MainContainer é criado
Plataforma
JADE
A Plataforma do Jade segue o modelo da
FIPA (Foundation for Intelligent Physical
Agents)
JADE
Agent Management System (AMS)
Agente que exerce o controle sobre o acesso e
o uso da plataforma
Existe um único AMS por plataforma
Mantém a lista de identificadores dos agentes
(AID) que estão na plataforma
Todo agente deve se registrar no AMS
Directory Facilitator (DF)
Oferecer o serviço de páginas amarelas na
JADE
A classe Agent
Representa a classe base para a definição de
agentes
Para o desenvolvedor, um agente Jade é uma
instância de uma classe Java que estende a
classe Agent
Já oferece todas as interações básicas da
plataforma (registro, configuração, etc...)
Oferece um conjunto de métodos para a
JADE
Modelo Computacional do Agente
Um agente é multi-tarefa, onde os serviços são
executados concorrentemente
Cada serviço de um agente deve ser
implementado como um ou mais
comportamtentos
A classe Agent oferece um scheduler (não
acessível ao programador) que gerencia
automaticamente o agendamento dos
comportamentos
JADE
JADE
Iniciado
O objeto agente é criado, mas ainda não se
registrou no AMS, i.e. não possui um identificador
e não pode se comunicar com outros agentes
Ativo
O objeto agente está registrado no AMS, possui
um identificador e pode executar seus serviços
Suspenso
O objeto agente está parado, i.e. sua thread
interna está suspensa e o agente não está
executando serviço algum
JADE
Esperando
O objeto agente está bloqueado, esperando por algum
evento, i.e. sua thread interna está dormindo e será
acordada quando uma condição se tornar verdadeira
Removido
O objeto agente está terminado, i.e. sua thread
interna acabou sua execução e o agente não está
mais registrado no AMS
Em Trânsito
Um agente móvel entra neste estado quando está
migrando para um novo local (contêiner). O sistema
continua a armazenar as mensagens enviadas a este
agente, que lhe serão passadas quando ele estiver no
novo local
JADE
Criação de um novo Agente segue os
seguintes passos
Jade gerencia a criação de um novo agente
com os seguintes passos
O construtor do agente é executado
O agente recebe um identificador do MAS
Ex: agente@localhost:1099/JADE
Entra no estado Ativo
É executado o método setup()
•
Método responsável por inicializar os
comportamentos do agente
JADE
package examples.hello; import jade.core.Agent;
public class HelloWorldAgent extends Agent { protected void setup() {
// Mostra uma mensagem de Hello
System.out.println("Hello World! Meu nome eh " + getAID().getName());
} }
prompt> set CLASSPATH=%CLASSPATH%;.;[CLASSPATH JADE JARS]
prompt> java jade.Boot -gui Agente1:examples.hello.HelloWorldAgent
JADE
Destruindo um Agente Jade
Mesmo que não esteja fazendo coisa alguma, o
agente continua executando
Para terminar um agente, deve-se executar o
método doDelete() que chama o método
takeDown()
Serve para remover todas as referências ao
JADE
Exemplo
package examples.hello; import jade.core.Agent;
public class HelloWorldAgent extends Agent { protected void setup() {
// Mostra uma mensagem de Hello
System.out.println("Hello World! Meu nome eh " + getAID().getName());
doDelete(); }
protected void takeDown() {
// Imprimindo uma mensagem de saida
System.out.println("Agente " + getAID().getName() + " terminando.");
} }
JADE
As Tarefas do Agente – Classe Behaviour
Todas as tarefas dos agentes são executadas
por meio de "comportamentos"
Um comportamento é um objeto da classe
Behaviour
O agente adiciona um comportamento com o
método addBehaviour()
Comportamentos podem ser adicionados a
qualquer momento
•
No método setup()
JADE
As Tarefas do Agente – Classe Behaviour
Método action()
•
Método que define as operações que são executadas
quando o comportamento está em execução
Método done()
•
Método que especifica se um comportamento foi
completado e deve ser removido do pool de
JADE
public class UmComportamento extends Behaviour { public void action() {
while (true) {
// Código do Comportamento }
}
public boolean done() { return true;
} }
JADE
Detalhes sobre a Execução de
Comportamentos
Um agente pode executar diversos
comportamentos concorrentemente
O scheduling de comportamentos não é
preemptivo
•
Quando um comportamento está agendado para
execução, o método action é chamado e executa até
retornar
•
Quem deve definir quando um agente deve passar da
execução de um comportamento para outro é o
JADE
Execução
de um
agente
JADE
A Hierarquia de Comportamentos
Comportamentos Simples
•
Modelam os comportamentos atômicos
–
OneShotBehaviour e CyclicBehaviour
Comportamentos Compostos
•
Modelam comportamentos que são compostos de
outros comportamentos. Assim, as operações que
devem ser executadas não estão definidas neste
comportamento em si, mas nos comportamentos
filhos que o compõem
–
SequentialBehaviour, ParallelBehaviour e
FSMBehaviour
JADE
A
Hierarquia
de
Comporta
mentos
JADE
Comportamentos Simples
OneShotBehaviour
•
Modela comportamentos que só devem executar uma
vez e que não podem ser bloqueados (parar o
comportamento até que algum evento ocorra)
CyclicBehaviour
•
Modela comportamentos atômicos que devem ser
executados eternamente
JADE
Comportamentos Compostos
SequentialBehaviour
•
Executa seus sub-comportamentos seqüencialmente
e termina quando todos estes estiverem terminados
ParallelBehaviour
•
Executa seus sub-comportamentos concorrentemente
e termina quando uma condição particular sobre o
conjunto de sub-comportamentos é alcançada
FSMBehaviour
•
Executa seus sub-comportamentos como uma
Máquina de Estados Finita (FSM). Quando uma tarefa
acaba, sua saída é usada para se calcular a transição
JADE
Esquemas de Comportamentos Simples
// OneShotBehaviour
public class MyOneShotBehaviour extends OneShotBehaviour { public void action() {
// Executar a operação X }
}
// CyclicBehaviour
public class MyCyclicBehaviour extends CyclicBehaviour { public void action() {
// Executar a operação Y }
JADE
Esquema Genérico de Comportamento
public class MyTwoStepBehaviour extends Behaviour { private int step = 0;
public void action() { switch (step) { case 0: // Executar a operação X step++; break; case 1: // Executar a operação Y step++; break; } }
public boolean done() { return step == 2;
JADE
Comportamentos Especiais
WakerBehaviour
•
Comportamento que espera um determinado período
de tempo (em ms) para efetivamente executar a
tarefa
TickerBehaviour
•
Comportamento que executa uma tarefa
periodicamente em intervalos de tempo constantes
(em ms). Este comportamento nunca acaba
JADE
WakerBehaviour
public class MyAgent extends Agent { protected void setup() {
System.out.println("Adicionando waker behaviour"); addBehaviour(new WakerBehaviour(this, 10000) {
protected void handleElapsedTimeout() { // Executa a operação X
} } ); }
}
A operação X é executada 10 segundo depois de imprimir "Adicionando waker behaviour"
JADE
TickerBehaviour
public class MyAgent extends Agent { protected void setup() {
addBehaviour(new TickerBehaviour(this, 10000) { protected void onTick() {
// Executar a operação Y }
} ); }
}
JADE
A troca de mensagens é assíncrona e usa
a FIPA ACL (Agent Communication
Language)
JADE
A Linguagem ACL
Campos principais
•
Sender: o agente que envia a mensagem
•
Receivers: lista de agentes destino da mensagem
•
Performative: ato de fala que indica o que o agente
que envia a mensagem espera com ela
•
Content: o real conteúdo da mensagem
•
Language: sintaxe usada para expressar o conteúdo
•
Ontology: denota a semântica dos itens do
conteúdo
•
Outros campos de controle de convesação como:
conversation-id, reply-with, in-reply-to, reply-by
JADE
A Linguagem ACL - Exemplo
Início da mensagem
Tipo de ato de comunicação (Performativa) Controle de conversação (inform :sender agent1 :receiver hpl-auction-server :content
(price (bid good02) 150) :in-reply-to round-4 :reply-with bid04 :language FIPA SL :ontology hpl-auction ) Mensagem ACL Conteúdo da mensagem
JADE
A Linguagem ACL – Performativas
INFORM
“ A porta está aberta”
QUERY
“A porta está aberta?”
CFP
“Alguém quer abrir a porta?”
REQUEST
“Abra a porta para mim”
AGREE
“OK, vou abrir a porta para você”
REFUSE
“Eu não vou abrir a porta”
FAILURE
“Eu não consigo abrir a porta”
PROPOSE “Eu posso abrir a porta para você, pelo
seguinte preço”
SUBSCRIBE “Quero ser avisado quando a porta for
aberta”
JADE
Deve-se criar e montar um objeto
ACLMessage e chamar o método send() do
agente para enviar messagens:
ACLMessage msg = new ACLMessage( ACLMessage.INFORM );
msg.addReceiver( new AID( "Agente2", AID.ISLOCALNAME ) ); msg.setLanguage( "English" );
msg.setOntology( "Weather-forecast-ontology" ); msg.setContent( "Today it’s raining" );
JADE
Para se receber uma mensagem usa-se o
método receive(), que recupera a primeira
mensagem da fila de mensagens do
agente
Este método remove a mensagem da
pilha, ou retorna null caso esteja vazia
ACLMessage msg = receive(); if (msg != null) {
// Processar a mensagem }
JADE
Bloqueando um Agente à espera de uma
Mensagem
O scheduler de ações do Jade não pára a
execução de uma ação caso não haja
mensagens para um agente
Para parar a execução de uma ação à espera
de uma mensagem, deve-se usar o método
block()
public void action() {
ACLMessage msg = myAgent.receive();
if (msg != null) { // Mensagem recebida – processá-la … } else
JADE
Selecionando um Tipo de Mensagem da
Fila: Pode-se selecionar um tipo especifico
usando um MessageTemplate
public void action() { MessageTemplate mt;
mt = MessageTemplate.MatchPerformative(ACLMessage.CFP); ACLMessage msg = myAgent.receive(mt);
if (msg != null) {
// Mensagem do tipo CFP recebida - processá-la ...
} else
block(); }
JADE
O Serviço de
Páginas
Amarelas
(Agente DF)
Todo agente
deve registrar
seu serviço no
DF
Só existe um
DF em cada
plataforma
Jade
JADE
Registrando um Serviço no DF
Deve-se criar um objeto ServiceDescription e
chamar o método register() de um DF
JADE
Registrando um Serviço no DF
protected void setup() { ...
// Registrar um agente vendedor de livros no DF DFAgentDescription dfd = new DFAgentDescription(); dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription(); sd.setType("book-selling");
sd.setName("JADE-book-trading"); dfd.addServices(sd);
try { DFService.register(this, dfd); }
catch (FIPAException fe) { fe.printStackTrace(); } ...
JADE
Removendo um Serviço do DF
Chamar o método deregister() do DF
(usualmente no método takeDown() do
agente)
protected void takeDown() { // Saindo do DF
try {
DFService.deregister(this); }
catch (FIPAException fe) { fe.printStackTrace(); }
// Mostrando uma mensagem de saída
System.out.println("Agente vendedor " + getAID().getName() + " terminando");
JADE
protected void setup() { ...
// Criando um TickerBehaviour para procurar agentes vendedores a cada minuto addBehaviour(new TickerBehaviour(this, 60000) {
protected void onTick() {
// Atualizando a lista de agentes vendedores
DFAgentDescription template = new DFAgentDescription(); ServiceDescription sd = new ServiceDescription();
sd.setType("book-selling"); template.addServices(sd); try {
DFAgentDescription[] result = DFService.search(myAgent, template); sellerAgents = new AID[result.length];
for (int i = 0; i < result.length; ++i) sellerAgents[i] = result.getName(); }
catch (FIPAException fe) { fe.printStackTrace(); } ...
} ); ... }
JADE
Versã0 3.5
Novo mecanismo de comunicação com lista de assinaturas
Os agentes podem enviam mensagens sem especificar os destinatários,
somente o assunto
Implementado no kernel do Jade pelo TopicManagement Service
jade.core.messaging package
Versão reestruturada do Web Service Integration Gateway (WSIG)
Está empacotado com uma aplicação web que pode ser implantada em
qualquer servidor, tal como, Apache Tomcat
Os web services visíveis são derivados diretamente das ações especificadas
na ontologia referenciada pelo descritor de serviço registrado no DF.
Um documento WSDL padrão é produzido para cada agent service que
precise ser visível como um web service.
Desta forma é possível construir clientes web services sem nenhum
conhecimento sobre qual agente provê o serviço e como ele o faz