Jade e Jadex Equipe do Curso de ES para SMA {lucena, furtado, choren, viviane}@inf.puc-rio.br Jade Java Agent Development Framework http://jade.tilab.com/ Versão atual: 3.2 (26 Jul 2004) 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 3 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 4 Contêineres e Plataformas Laboratório de Engenharia de Software (LES) – PUC-Rio 5 A Plataforma • O Jade segue o modelo da FIPA (Foundation for Intelligent Physical Agents) Laboratório de Engenharia de Software (LES) – PUC-Rio 6 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 7 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 8 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 9 O Ciclo de Vida de um Agente Laboratório de Engenharia de Software (LES) – PUC-Rio 10 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 11 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 12 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 13 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 14 Um Exemplo Laboratório de Engenharia de Software (LES) – PUC-Rio 15 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 16 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."); } } Laboratório de Engenharia de Software (LES) – PUC-Rio 17 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 18 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 19 O Esquema de um Comportamento public class UmComportamento extends Behaviour { public void action() { while (true) { // Código do Comportamento } } public boolean done() { return true; } } Laboratório de Engenharia de Software (LES) – PUC-Rio 20 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 21 A Execução de um Agente Laboratório de Engenharia de Software (LES) – PUC-Rio 22 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 23 A Hierarquia de Comportamentos Laboratório de Engenharia de Software (LES) – PUC-Rio 24 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 25 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 subcomportamentos é 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 para a próxima tarefa. O comportamento termina quando uma tarefa final é executada Laboratório de Engenharia de Software (LES) – PUC-Rio 26 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 } } Laboratório de Engenharia de Software (LES) – PUC-Rio 27 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; } } Laboratório de Engenharia de Software (LES) – PUC-Rio 28 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 29 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" Laboratório de Engenharia de Software (LES) – PUC-Rio 30 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 31 A Comunicação entre Agentes • A troca de mensagens é assíncrona e usa a FIPA ACL (Agent Communication Language) Laboratório de Engenharia de Software (LES) – PUC-Rio 32 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 33 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 ) Laboratório de Engenharia de Software (LES) – PUC-Rio Conteúdo da mensagem 34 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” Laboratório de Engenharia de Software (LES) – PUC-Rio 35 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?” Laboratório de Engenharia de Software (LES) – PUC-Rio 36 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); Laboratório de Engenharia de Software (LES) – PUC-Rio 37 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 } Laboratório de Engenharia de Software (LES) – PUC-Rio 38 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(); } Laboratório de Engenharia de Software (LES) – PUC-Rio 39 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(); } Laboratório de Engenharia de Software (LES) – PUC-Rio 40 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 41 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(); } ... } Laboratório de Engenharia de Software (LES) – PUC-Rio 42 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"); } Laboratório de Engenharia de Software (LES) – PUC-Rio 43 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(); } ... } ); ... } Laboratório de Engenharia de Software (LES) – PUC-Rio 44 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 Laboratório de Engenharia de Software (LES) – PUC-Rio 45 Laboratório de Engenharia de Software (LES) – PUC-Rio 46 Jadex http://vsis-www.informatik.uni-hamburg.de/projects/jadex/ Versão atual: 0.92 (09 Mai 2004) O que é Jadex? • Jadex é um framework que oferece suporte ao modelo BDI (Beliefs – Desires – Intentions) sobre a plataforma JADE • Inclui Laboratório de Engenharia de Software (LES) – PUC-Rio 48 O Modelo BDI • Teoria sobre o raciocínio humano – As causas para as ações humanas são os desejos, ignorando outras facetas como p. ex. as emoções • No caso de agentes, é composto por – Belief – Desire – Plan – Intention Laboratório de Engenharia de Software (LES) – PUC-Rio 49 O Modelo BDI • Crença (Belief) – Informação que um agente possui sobre o seu ambiente e sobre seu estado interno • Desejo (Desire) – Objetivo do agente que guia a escolha de ações • Plano (Plan) – Meio pelo qual os agentes alcançam os objetivos. Pode não ser uma seqüência de ações simples (i.e. pode incluir sub-objetivos) • Intenção (Intention) – Ato de se comprometer a alcançar um determinado objetivo por meio de um plano Laboratório de Engenharia de Software (LES) – PUC-Rio 50 Algoritmo BDI Initialize-state(); repeat options := option-generator(event-queue); selected-options := deliberate(options); update-intentions(selected-options); execute(); get-new-external-events(); drop-successful-attitudes(); drop-impossible-attitudes(); end repeat A. Rao and M. Georgeff. BDI Agents: from theory to practice. In V. Lesser (ed.) Proceedings of the First International Conference on Multi-Agent Systems (ICMAS’95), pp. 312–319. The MIT Press: Cambridge, MA, USA, 1995. Laboratório de Engenharia de Software (LES) – PUC-Rio 51 O Modelo Jadex Laboratório de Engenharia de Software (LES) – PUC-Rio 52 Agente Jadex • Descrito através de um arquivo XML • Contém – Nome – Estado inicial • Beliefs • Goals • Biblioteca de planos • Expressões para especificar determinadas propriedades do agente Laboratório de Engenharia de Software (LES) – PUC-Rio 53 Um Exemplo Laboratório de Engenharia de Software (LES) – PUC-Rio 54 Definindo um Agente • Arquivo de definição (ADF – agent definition file) escrito em XML <agent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jadex.sourceforge.net/jadex.xsd" name="ta" class="jadex.runtime.JadeWrapperAgent" package="jadex.examples.tutorial"> </agent> prompt> set CLASSPATH=%CLASSPATH%;.;[CLASSPATH JADE JARS]; [CLASSPATH jadex.jar] prompt> java jade.Boot rma:jadex.tools.rma.rma Laboratório de Engenharia de Software (LES) – PUC-Rio 55 Um Exemplo Laboratório de Engenharia de Software (LES) – PUC-Rio 56 Planos • Devem estender uma das classes ThreadedPlan ou NonThreadedPlan • Deve implementar o método body() • Deve-se colocar a referência à classe do plano no arquivo ADF (incluindo o import para o pacote da classe) • Plano pode ser – Ativo: sempre em execução – Passivo: instanciado a cada evento Laboratório de Engenharia de Software (LES) – PUC-Rio 57 Um Exemplo <agent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jadex.sourceforge.net/jadex.xsd" name="ta" class="jadex.runtime.JadeWrapperAgent" package="jadex.examples"> <imports> <import>jadex.ex.*</import> </imports> <plans> <plan name="traduz" instant="true"> <constructor> new EnglishPortugueseTranslationPlanP1() </constructor> <waitqueuefilter> EnglishPortugueseTranslationPlanP1.getEventFilter() </waitqueuefilter> </plan> </plans> </agent> Laboratório de Engenharia de Software (LES) – PUC-Rio 58 Um Exemplo package jadex.ex; import import import import jadex.runtime.*; jade.lang.acl.*; jadex.*; java.util.*; public class EnglishPortugueseTranslationPlanP1 extends ThreadedPlan { private Hashtable palavras; public EnglishPortugueseTranslationPlanP1() { this.palavras = new Hashtable(); palavras.put("chair", "cadeira"); palavras.put("table", "mesa"); palavras.put("book", "livro"); System.out.println("Criado: " + this); } Laboratório de Engenharia de Software (LES) – PUC-Rio 59 Um Exemplo public void body() { while (true) { REvent event = waitFor(getEventFilter()); String conteudo = ((RMessageEvent)event).getContent().toString(); if (palavras.get(conteudo) != null) { String traducao = palavras.get(conteudo).toString(); System.out.println(conteudo + " em portugues eh " + traducao); } else System.out.println("Nao conheco a palavra " + conteudo + "."); } } public static IFilter getEventFilter() { MessageTemplate mt; mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST); MessageFilter mfilter = new MessageFilter(mt); return mfilter; } } Laboratório de Engenharia de Software (LES) – PUC-Rio 60 Um Exemplo Laboratório de Engenharia de Software (LES) – PUC-Rio 61 A BeliefBase • Representa o conhecimento dos agentes sobre o ambiente • Deve estar declarado no arquivo ADF • Pode-se consultar, adicionar e remover objetos da BeliefBase dinamicamente • Um exemplo – Indicação no arquivo ADF – Inserção de dados na BeliefBase – Consulta a dados na BeliefBase Laboratório de Engenharia de Software (LES) – PUC-Rio 62 Um Exemplo <agent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jadex.sourceforge.net/jadex.xsd" name="ta3" class="jadex.runtime.JadeWrapperAgent" package="jadex.examples"> <imports> <import>jadex.ex.*</import> <import>java.util.*</import> </imports> <plans> <plan name="traduz"> <constructor>new EnglishPortugueseTranslationPlanP4()</constructor> <filter>EnglishPortugueseTranslationPlanP4.getEventFilter()</filter> </plan> <plan name="mantemDicionario"> <constructor>new EnglishPortugueseTranslationPlanP3()</constructor> <filter>EnglishPortugueseTranslationPlanP3.getEventFilter()</filter> </plan> </plans> <beliefs> <belief name="dicionario" class="Hashtable"> <fact>new Hashtable()</fact> </belief> </beliefs> </agent> Laboratório de Engenharia de Software (LES) – PUC-Rio 63 Um Exemplo // PLANO DE TRADUÇÃO package jadex.ex; import import import import jadex.runtime.*; jade.lang.acl.*; jadex.*; java.util.*; public class EnglishPortugueseTranslationPlanP4 extends ThreadedPlan { public EnglishPortugueseTranslationPlanP4() { System.out.println("Criado plano P4: " + this); } public void body() { REvent event = getInitialEvent(); String conteudo = ((RMessageEvent)event).getContent().toString(); Hashtable dicionario = (Hashtable)getBeliefbase().getFact("dicionario"); Laboratório de Engenharia de Software (LES) – PUC-Rio 64 Um Exemplo // CONTINUAÇÃO DO PLANO DE TRADUÇÃO if (dicionario.get(conteudo) != null) { String traducao = dicionario.get(conteudo).toString(); System.out.println("Traduzindo: " + conteudo + " em portugues eh " + traducao); } else System.out.println("Nao conheco a palavra " + conteudo + "."); } public static IFilter getEventFilter() { MessageTemplate mt; mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST); MessageFilter mfilter = new MessageFilter(mt); return mfilter; } } Laboratório de Engenharia de Software (LES) – PUC-Rio 65 Um Exemplo // PLANO DE MANUTENÇÃO DO BELIEFBASE package jadex.ex; import import import import jadex.runtime.*; jade.lang.acl.*; jadex.*; java.util.*; public class EnglishPortugueseTranslationPlanP3 extends ThreadedPlan { public EnglishPortugueseTranslationPlanP3() { System.out.println("Criado plano P3: " + this); } public void body() { REvent event = getInitialEvent(); String conteudo = ((RMessageEvent)event).getContent().toString(); Hashtable dicionario = (Hashtable)getBeliefbase().getFact("dicionario"); StringTokenizer st = new StringTokenizer(conteudo, " "); Laboratório de Engenharia de Software (LES) – PUC-Rio 66 Um Exemplo // CONTINUAÇÃO DO PLANO DE MANUTENÇÃO DO BELIEFBASE if (st.countTokens() == 4) { st.nextToken(); st.nextToken(); String palavraIngles = st.nextToken(); String palavraPortugues = st.nextToken(); if (!dicionario.containsKey(palavraIngles)) dicionario.put(palavraIngles, palavraPortugues); } // Código para imprimir a Hashtable na tela (removido daqui) } public static IFilter getEventFilter() { MessageTemplate mt = new MessageTemplate(new MatchStartContentLiteral("adicione ingles_portugues")); MessageFilter mfilter = new MessageFilter(mt); return mfilter; } } Laboratório de Engenharia de Software (LES) – PUC-Rio 67 Outras Features • Jadex oferece suporte ainda a – Capabilities – Goals – Events Laboratório de Engenharia de Software (LES) – PUC-Rio 68 Concluindo... • Jadex é um framework de desenvolvimento de sistemas multi-agentes – Implementa o modelo BDI • Planos • Beliefs • Objetivos – É feito sobre o Jade Laboratório de Engenharia de Software (LES) – PUC-Rio 69 Dúvidas? Laboratório de Engenharia de Software (LES) – PUC-Rio 70 Laboratório de Engenharia de Software (LES) – PUC-Rio 71