Jade Java Agent Development Framework http://jade.tilab.com/ Versão atual: 3.6.1 (04 Novembro 2008) O que é 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 permite a administração e o monitoramento das atividades dos agentes em execução © LES/PUC-Rio Contêiner e Plataforma • Contêiner – Instância de um ambiente Jade – É onde os agentes executam – Ao iniciar o Jade, um MainContainer é criado • Plataforma – Conjunto de contêineres ativos © LES/PUC-Rio Contêineres e Plataformas © LES/PUC-Rio A Plataforma • O Jade segue o modelo da FIPA (Foundation for Intelligent Physical Agents) © LES/PUC-Rio AMS e DF • 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 plataforma © LES/PUC-Rio 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 implementação do comportamento do agente © LES/PUC-Rio 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 © LES/PUC-Rio O Ciclo de Vida de um Agente © LES/PUC-Rio Ciclo de Vida de um Agente • 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 © LES/PUC-Rio Ciclo de Vida de um Agente • 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 © LES/PUC-Rio Criando um Agente Jade • 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 © LES/PUC-Rio Um 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()); } } prompt> set CLASSPATH=%CLASSPATH%;.;[CLASSPATH JADE JARS] prompt> java jade.Boot -gui Agente1:examples.hello.HelloWorldAgent © LES/PUC-Rio Um Exemplo © LES/PUC-Rio 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 agente da plataforma © LES/PUC-Rio Um 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."); } } © LES/PUC-Rio 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() – Dentro de outros comportamentos © LES/PUC-Rio 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 comportamentos que um agente está executando © LES/PUC-Rio O Esquema de um Comportamento public class UmComportamento extends Behaviour { public void action() { while (true) { // Código do Comportamento } } public boolean done() { return true; } } © LES/PUC-Rio 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 desenvolvedor © LES/PUC-Rio A Execução de um Agente © LES/PUC-Rio 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 © LES/PUC-Rio A Hierarquia de Comportamentos © LES/PUC-Rio 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 } } © LES/PUC-Rio 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; } } © LES/PUC-Rio 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 © LES/PUC-Rio 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" © LES/PUC-Rio TickerBehaviour public class MyAgent extends Agent { protected void setup() { addBehaviour(new TickerBehaviour(this, 10000) { protected void onTick() { // Executar a operação Y } } ); } } A operação Y é executada periodicamente a cada 10 segundos © LES/PUC-Rio A Comunicação entre Agentes • A troca de mensagens é assíncrona e usa a FIPA ACL (Agent Communication Language) © LES/PUC-Rio 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 © LES/PUC-Rio A Linguagem ACL - Exemplo Mensagem ACL 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 ) © LES/PUC-Rio Conteúdo da mensagem 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” © LES/PUC-Rio A Linguagem ACL – Performativas • PROPOSE “Eu posso abrir a porta para você, pelo seguinte preço” • SUBSCRIBE “Quero ser avisado quando a porta for aberta” • NOT-UNDERSTOOD “Porta? Que porta?” © LES/PUC-Rio Enviando Mensagens • Deve-se criar e montar um objeto ACLMessage e chamar o método send() do agente 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" ); send(msg); © LES/PUC-Rio Recebendo Mensagens • 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 } © LES/PUC-Rio 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 block(); } © LES/PUC-Rio Selecionando um Tipo de Mensagem da Fila • Pode-se selecionar um tipo de mensagem da fila 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(); } © LES/PUC-Rio 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 © LES/PUC-Rio Registrando um Serviço no DF • Deve-se criar um objeto ServiceDescription e chamar o método register() de um DF (usualmente no método setup() do agente) 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(); } ... } © LES/PUC-Rio 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"); } © LES/PUC-Rio Procurando por Serviços no DF • Criar um objeto DFAgentDescription e chamar o método search() do DF 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(); } ... } ); ... } © LES/PUC-Rio Nova versã0 3.5 – Novidade • Novo mecanismo de comunicação – Para 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) – 1) Está empacotado com uma aplicação web que pode ser implantada em qualquer servidor, tal como, Apache Tomcat – 2) Os web services visíveis são derivados diretamente das ações especificadas na ontologia referenciada pelo descritor de serviço registrado no DF. – 3) 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 • http://jade.tilab.com/doc/tutorials/WSIG_Guide.pdf © LES/PUC-Rio Concluindo... • Jade é um framework de desenvolvimento de sistemas multi-agentes – Implementa o modelo de infraestrutura FIPA com registro, páginas amarelas e mecanismo de envio de mensagens • Uso de AMS, DF e de FIPA ACL – Ciclo de vida de um agente • setup(), addBehaviour(), takeDown() – Abordagem orientada a tarefas: o comportamento dos agentes é decomposto em pedaços menores (Behaviour) que são adicionados ao agente quando necessário © LES/PUC-Rio