1345494271 artigo agentes jade

25
Encarando os “Agentes” com Java Poder e simplicidade “Cássio O. Camilo” ([email protected]) “Eduardo de Moraes Porciúncula” ([email protected]) Introdução A tecnologia de agentes possibilita hoje uma série de atividades tidas então como presenciais. Claro que ainda há muito trabalho a ser feito, e a tendência é que cada vez mais esses “agentes” não só movam dentro de uma rede, mas também das aplicações acadêmicas para as grandes corporações. Com a demanda por sistemas que visam além de automatizar tarefas, agregar valor (tais como ERP´s, CRM´s, BI´s, Dataware House, etc), os conceitos empregados nos agentes podem ser estendidos às arquiteturas tradicionais afim de criar softwares mais inteligentes. Diversas são as aplicações para os agentes, indo desde a simples troca de mensagem até a negociação comercial em sistemas multi-agentes. Em suma imagine reunir os conceitos mais modernos (IA, reconhecimento de padrões, redes neurais, bussiness intelligence, web services, EAI) e agrega-los ao seu software, de forma que ele agora não só receba requisições, mas também seja capaz de aprender e tomar decisões, como um clone seu! Colocar um agente para aprender não é um trabalho muito fácil, porém com certeza, para você leitor desse artigo, facilidade é sinônimo de chatice! Nesse primeiro contato não iremos nos aventurar por águas tão profundas, no entanto mostraremos a direção para chegar até lá. Quadro 1 – Frameworks para Agentes Aglets – A API aglets foi concebida pela IBM e também é muito utilizada. É uma API bastante popular e completa. A API Aglets també é muito estuda e utilizada pois fornece uma um sistema de agentes completo para se desenvolver aplicações multiagentes. Infelizmente a IBM abandou o projeto e hoje os Aglets são sustentados apenas pela comunidades. Odyssey - A General Magic Inc. criou o primeiro sistema de agentes móveis comercial, chamado Telescript. Entretanto, o Telescript teve pouco sucesso, pois era baseado em uma linguagem e arquitetura de rede proprietárias. A popularidade da Internet motivou a General Magic a reimplementar um sistema de agentes móveis chamado Odyssey, baseado em Java. Este sistema simplesmente mapeou os conceitos do Telescript em classes Java, permitindo os desenvolvedores a criar suas próprias aplicações.

Upload: diangelisj6783

Post on 30-Jul-2015

42 views

Category:

Documents


0 download

TRANSCRIPT

Encarando os Agentes com JavaPoder e simplicidadeCssio O. Camilo ([email protected]) Eduardo de Moraes Porcincula ([email protected])Introduo A tecnologia de agentes possibilita hoje uma srie de atividades tidas ento como presenciais. Claro que ainda h muito trabalho a ser feito, e a tendncia que cada vez mais esses agentes no s movam dentro de uma rede, mas tambm das aplicaes acadmicas para as grandes corporaes. Com a demanda por sistemas que visam alm de automatizar tarefas, agregar valor (tais como ERPs, CRM s, BIs, Dataware House, etc), os conceitos empregados nos agentes podem ser estendidos s arquiteturas tradicionais afim de criar softwares mais inteligentes. Diversas so as aplicaes para os agentes, indo desde a simples troca de mensagem at a negociao comercial em sistemas multi-agentes. Em suma imagine reunir os conceitos mais modernos (IA, reconhecimento de padres, redes neurais, bussiness intelligence, web services, EAI) e agrega-los ao seu software, de forma que ele agora no s receba requisies, mas tambm seja capaz de aprender e tomar decises, como um clone seu! Colocar um agente para aprender no um trabalho muito fcil, porm com certeza, para voc leitor desse artigo, facilidade sinnimo de chatice! Nesse primeiro contato no iremos nos aventurar por guas to profundas, no entanto mostraremos a direo para chegar at l. Quadro 1 Frameworks para Agentes Aglets A API aglets foi concebida pela IBM e tambm muito utilizada. uma API bastante popular e completa. A API Aglets tamb muito estuda e utilizada pois fornece uma um sistema de agentes completo para se desenvolver aplicaes multiagentes. Infelizmente a IBM abandou o projeto e hoje os Aglets so sustentados apenas pela comunidades. Odyssey - A General Magic Inc. criou o primeiro sistema de agentes mveis comercial, chamado Telescript. Entretanto, o Telescript teve pouco sucesso, pois era baseado em uma linguagem e arquitetura de rede proprietrias. A popularidade da Internet motivou a General Magic a reimplementar um sistema de agentes mveis chamado Odyssey, baseado em Java. Este sistema simplesmente mapeou os conceitos do Telescript em classes Java, permitindo os desenvolvedores a criar suas prprias aplicaes. Concrdia - Concebido pela Mitsubishi constitui-se de um framework para o desenvolvimento e gerenciamento de aplicaes de agentes mveis. O Concrdia compreende mltiplos componentes, todos escritos em Java, na qual so combinados para prover um ambiente para aplicaes distribudas. Este sistema simples, e requer somente uma implementao padro da mquina virtual Java. Seu ambiente composto de um servidor e um conjunto de agentes. O Concrdia prov mecanismos de segurana para execuo segura de agentes, alm de suportar mecanismos de checkpoint para tolerncia a falhas. Voyager - Criado pela ObjectSpace, consiste de uma plataforma ORB (Object Request Broker) implementado em Java e com suporte a agentes. Voyager implementa os mecanismos tradicionais de troca de mensagens, somados capacidade de objetos moverem-se atravs da rede como agentes. Uma desvantagem de Voyager no oferecer mecanismos de segurana contra agentes no autorizados.

A tecnologia de Agentes A grande evoluo da informtica combinada com o crescimento exponencial de servios e informaes disponveis na Internet nos leva a uma situao em que bilhes de pessoas tm acesso rpido e fcil de qualquer lugar: casa, escolas, trabalho, televisores, celulares, etc. A tendncia que a

informao esteja disponvel em todo e qualquer lugar. O problema residira na busca por essas informaes. A cerca de 7 anos a idia do que realmente um agente vem sendo debatida. Ainda no existe uma definio comum. O Oxford Dictionary of Computing define o agente como: um sistema autnomo que recebe informaes do seu ambiente, processa e efetua uma ao no ambiente. Agentes de softwares atuam em ambientes simblicos, percebendo e agindo de forma tambm simblica. Um rob um exemplo de agente que percebe o ambiente fsico, atravs de sensores, e age atravs de efetuadores. Os agentes podem operar de maneiras deferentes e serem encontrados em lugares diferentes (sistemas, redes, banco de dados, etc.). No entando algumas caracteristicas so comuns: Reativo: (a) responde s mudanas no ambiente aps um perodo de tempo adequado; (b) toma aes sem consultar seu estado interno; Autnomo: possui controle sobre suas prprias aes; Pr-ativo com propsito: no age simplesmente em resposta ao ambiente, mas o faz a fim de atingir um determinado objeto; Temporalmente contnuo: um processo que executa continuamente; Comunicativo socivel: comunica-se com outros agentes, talvez incluindo pessoas; Aprendiz: adaptativo muda seu comportamento baseando-se em suas experincias prvias; Mvel: possui a habilidade de transportar a si mesmo de uma mquina para outra; Cooperativo: agentes podem ignorar, cooperar ou competir com outros agentes. Cooperao ocorre quando os agentes combinam seus esforos para alcanar um objetivo comum;

O Framework Como vimos, os agentes necessitam de um ambiente para residirem: o framework. Atualmente encontramos uma srie de frameworks que podem ser utilizados para se trabalhar com agentes (Veja o quadro 1). Escolhemos o JADE Java Agent DEvelopment Framework, por ser feito em Java, claro, estar em processo de constante desenvolvimento, possuir boa documentao, frum, lista de discusso e ser FIPA(Foundations of Intelligent Physical Agents) Complience. (Veja o quadro 2) Na figura 1 podemos ver a arquitetura do JADE:

Figura 1- Arquitetura do JADE Os agentes encontram-se dentro da Agent Platform, que funciona com um container. O equivalente ao JBoss para os EJBs. O sistema gerenciador de agentes ou Agent Management System (AMS), o agente que supervisiona o acesso e o uso da plataforma de agentes. Apenas um AMS ir existir em uma plataforma. Ele prov guia de endereos e controle de ciclo-de-vida(Ver figura 2), mantendo um diretrio de identificadores de agentes (Agent Identifier - AID) e estados de agentes. O AMS o responsvel pela autenticao de agentes e pelo controle de registro. Cada agente tem que se registrar no AMS para obter um AID vlido. O diretrio facilitador (Directory Facilitator - DF) o agente que prov o servio de pginas amarelas (yellow-pages) dentro da plataforma. Ir ajudar no registro e localizao de servios. (Veja o quadro 3) Quadro 2 - FIPAA FIPA uma sociedade do IEEE que visa padronizar as tecnologias baseadas em agents e a interoperabilidade entre esse padro e as outras tecnologias Originalmente formada em 1996 visava produzir padres de especificaes para software que interagiam com agentes e para sistemas baseados em agentes. Desde sua criao a FIPA sempre foi um player crucial na tecnologia de agentes, promovendo eventos e pesquisas nessa rea. Em maro de 2005, surge a oportunidade da FIPA entrar para a comunidade IEEE. A especificao da FIPA representa uma coleo de padres que tem a inteno de promover a interoperabilidade entre agentes heterogneos e o servio que eles representam.

Temos tambm na plataforma o Message Transport System (Sistema de Transporte de Mensagem) tambm conhecido como canal de comunicao dos agentes (Agent Communication

Channel ACC). Ele o agente responsvel por prover toda a comunicao entre agentes dentro e fora da plataforma. Todos os agentes, inclusive o AMS e o DF, utilizam esse canal para a comunicao. A plataforma de agentes esta ligada existncia das JVMs. Em cada host temos uma JVM e em cada JVM temos basicamente um container de agentes, que fornece um ambiente completo para execuo destes agentes, alm de permitir que vrios agentes possam rodar concorrentemente no mesmo host. A comunicao entre JVMs feita atravs de invocao remota de mtodos (RMI) do Java. Quando iniciamos uma plataforma criamos tambm o main-container, onde se encontra o AMS, o DF e o registro RMI(Remote Method Invocation Registry). Quando temos diversos hosts conectados, apenas um(o servidor) ser main-container, todos os demais (clients) sero apenas containers e usaro os recursos (AMS, DF, etc) do container principal. Com isso fazemos com que o desenvolvedor fique abstrado da separao fsica dos hosts, caso exista, ou das diferenas de plataformas das quais cada host possam ter. Quadro 3 Pginas AmarelasO servio de pginas amarelas funciona como os servios do WebService. Um agente cadastra determinado servio que ele oferece, por exemplo, um agente possui o servio de dizer como esta o clima. Outros agentes que necessitam saber o clima, apenas procuram na plataforma quem fornece tal servio, e eles o fazem perguntam ao DF qual agente possui tal servio. Se achar, o DF passa a referncia do agente a quem solicitou o servio e eles comeam a comunicao.

O Agente Os agentes so implementados como uma classe Java comum e devem herdar a classe Agent. A classe Agent atua como uma base para a criao de agentes e prov mtodos para executar tarefas bsicas de agentes, tais como: Passagens de mensagens usando objetos ACLMessage (seja direta ou multicast); Suporte completo ao ciclo de vida dos agentes, incluindo iniciar ou carregar, suspender e matar (kill) um agente; Escalonamento e execuo de mltiplas atividades concorrentes; Interao simplificada com sistemas de agentes FIPA para a automao de tarefas comuns de agentes (registro no DF, etc). Movimentao dos agents Clonagem O ciclo de vida dos agentes representado na figura 2.

Figura 2 Ciclos de vida de um agente Principais mtodos da classe Agent Abaixo esto os mtodos que a classe Agent fornece ao desenvolvedor: protected void setup () Esse mtodo protegido indicado para cdigos inicializadores da aplicao. Os desenvolvedores podem sobrescrever esse mtodo fornecendo comportamentos necessrios ao agente. Quando este mtodo chamado, o agente j est registrado no AMS e est apto a enviar e receber mensagens. Porm, o modelo de execuo do agente ainda seqencial e nenhum escalonamento de comportamento foi efetivado ainda. Logo, essencial adicionar pelo menos um comportamento para o agente neste mtodo, alm de tarefas comuns de inicializao como registro no DF, para torn-lo apto a fazer alguma coisa. public void addBehaviour (Behaviour comportamento) - Esse mtodo adiciona um novo comportamento ao agente. Ele ser executado concorrentemente com outros comportamentos. Geralmente usado no mtodo setup() para disparar algum comportamento inicial, porm pode ser usado tambm para gerar comportamentos dinamicamente. O mtodo removeBehaviou() faz justamente o inverso: remove determinado comportamento do agente public final void send (ACLMessage mensagem) - Envia uma mensagem ACL para outro agente. Esse agente destino especificado no campo receiver da mensagem no qual um ou mais agentes podem ser definidos como receptores. public final ACLMessage receive () Recebe uma mensagem ACL da fila de mensagens do agente. Este mtodo no-bloqueante e retorna a primeira mensagem da fila caso haja alguma. Retorna nulo caso no haja mensagens.

Existem ainda mtodos bastante particulares e teis que podem ser encontrados na documentao do JADE. Os acima citados so os bsicos e primordiais que qualquer sistema multiagente, por menor que seja, tem que ter. Comportamentos (Behaviour) As aes ou comportamentos que um agente desempenha dentro de um sistema multiagente so fundamentais para que o objetivo final da aplicao seja alcanado. Para implementarmos comportamentos especficas para o agente basta escrevermos uma ou mais subclasses Behaviour,

instanci-las e adicion-las ao agente. A API j contm comportamentos especficos para a maioria das tarefas comuns, tais como envio e recebimento de mensagens, e at algumas mais complexas. Existe uma srie de comportamentos que podem ser usados nos agentes(Veja quadro 4), inclusive mais de um simultaneamente. Para o nosso exemplo utilizaremos o CyclicBehaviour, um comportamento cclico que executado enquanto o Agente est ativo. bom salientar que os comportamentos diferentes no so executados de forma seqencial, o que permite a chamada simultnea. Quadro 4 - BehaviorsDentro os vrios eventos, podemos citar: SimpleBehaviour: super-classe que na maioria dos casos pode se tornar uma soluao simples e eficiente. CyclicBehaviour: Este comportamento se repete ciclcicamente enquanto o Agente est ativo. executado repetidamente a cada evento. timo para uso na manipulao de mensagens. o TickerBehaviour: um comportamento cclico que executa periodicamente um trecho de cdigo do usurio. OneShotBehaviour: Este comportamente executa apaenas uma vez. o WakerBehaviour: executa um trecho de cdigo em um tempo definido. o ReceiverBehaviour: executa quando um tipo de mensagem recebida. ParallelBehaviour: controla um conjunto de comportamentos filhos que executa em paralelo. O mais relevante sua condio de trmino: possvel especificar que ele se encerre quando totas filhos terminarem, quando N terminarem ou ainda quando apenas um deles terminar. SequentialBehaviour: esse comportamento executa seus filhos sequencialmente e termina aps o ultimo ser concludo.

Troca de Mensagens Toda a troca de mensagens, e por conseqncia toda comunicao, feita atravs de mtodos prprios e com o uso de instncias da classe ACLMessage.. Outro meio de enviar ou receber mensagens atravs do uso das classes de comportamentos SenderBehaviour e ReceiveBehaviour. Fato que torna possvel que as trocas de mensagens possam ser escalonadas como atividades independentes de um agente. A classe ACLMessage implementa, como o prprio nome diz, uma mensagem na linguagem FIPA-ACL complacente s especificaes da FIPA. Todos seus atributos podem ser acessados via mtodos set e get (Por exemplo, getContent e setContent). Alm disso, a ACLMessage define um conjunto de constantes (ACCEPT_PROPOSAL, AGREE, CANCEL, CFP,CONFIRM, etc) que so usadas para se referir s performativas da FIPA. Essas constantes so referidas no construtor da classe com o objetivo de definir o tipo de mensagem. Os mtodos da classe ACLMessage so simples e abrangentes. Segue abaixo os principais: public void addReceiver (AID idAgente) Adiciona o AID de um agente como receptor

ou destinatrio da mensagem. Em outras palavras, determina quem receber a mensagem. public void removeReceiver (AID idAgente) Remove o AID do agente da lista de receptores. public ACLMessage createReply() - Cria uma nova mensagem ACL de resposta determinada mensagem. Assim, o programador s necessita definir o ato comunicativo (communicate-act) e o contedo da mensagem. public java.lang.String getContent () - Retorna uma string contendo o contedo da mensagem. public void setContent (java.lang.String contedo) Define o contedo da mensagem a ser enviada.

Mo na massa! ATENO: Nossa inteno primria foi a de mostrar como construir um agente e usar a plataforma JADE para execut-lo. No estivemos preocupados na aplicao dos agentes para resoluo de um problema complexo e real. O nosso sistema meramente ilustrativo. A primeira coisa que temos de fazer baixar o JADE. Isso poder ser feito atravs do site http://jade.tilab.com. Existem diversas opes para download. Vo desde baixar somente a documentao, at o pacote completo (doc + bin + src). Para o nosso exemplo usaremos apenas os arquivos binrios, porm extremamente recomendado para os que querem se aventurar pelo mundo dos agentes a ver os exemplos. Antes de comearmos a criar os nossos agentes, vamos dar um passeio pelo framework JADE. Aps fazer o download de uma verso que possua a distribuio em formato binrio e descompactar o arquivo teremos a estrutura de diretrios:

O JADE uma plataforma que por default roda em modo silent, ou seja sem uma interface grfica. Entretanto ele possui uma GUI muito til que nos possibilita: Criar, matar, clonar e mover agentes Enviar mensagens para os agentes Interagir com os agentes AMS e DF Ativar o servio de sniffer Ativar o servio de dump Ativar o servio de log e monitoramento Adicionar plataformas remotas, etc. Assim, nesse artigo iremos us-la. Antes de executar o comando para iniciar o JADE, necessrio setar as bibliotecas jade.jar, http.jar localizados no diretrio lib da instalao no CLASSPATH. Em seguida executamos a seguinte linha de comando:

O parmetro -gui responsvel por mostrar a interface grfica. Aps a execuo do comando teremos:

Vamos agora identificar os elementos:1) Contm a estrutura dos agentes. Na raiz temos a plataforma (gyn022480:1099/JADE). Logo

depois temos os Containers da plataforma. Nesse caso, o Main-Container. Em uma plataforma dever existir pelo menos um e apenas um Main-Container. Dentro dos containers podemos ter vrios agentes. Por default o framework JADE j nos traz trs agentes: RMA, df e ams. O RMA(Remote Monitoring Agent) o agente usado para controlar a IDE. Ele o responsvel por montar a parte grfica. Quando se inicia o container sem o parmetro -gui no teremos o RMA. O ams(Agent Management System) um agente que fornece uma serie de servios para outros agentes na plataforma. E o df (Directory Facilitator) quem fornece o servio chamado de yellow pages (veja o quadro 3). Por fim para entendermos melhor, o nome do agente composto pelo nickname + o endereo. Assim, para o agente RMA@gyn022480:1099/JADE, temos nickname RMA e o endereo da plataforma gyn022480:1099/JADE. 2) Fornece uma descrio do agente selecionado. 3) Menus. 4) Barra de menus. Agora que criamos nosso Main Container, e j temos o nosso servidor RMI (o prprio JADE fornece), precisamos criar um segundo Container. Para fins didticos, usaremos a mesma mquina para iniciar outro container. Caso quisssemos fazer isso de outra mquina o procedimento seria o mesmo:

O parmetro -host que indica em qual mquina o Main-Container esta. O -port indica em qual porta da mquina host o JADE est escutando.

O -container indicar que queremos inserir na plataforma outro container e no criar um principal. Ao usarmos o comando container no temos a opo do comando -gui. Assim, somente na mquina central teremos a GUI do JADE. Aps a execuo do comando acima, na janela do JADE, teremos o Container-1. O prprio JADE atribui um nome ao container, que incremental, caso nenhum seja fornecido. No permitido dois containers com o mesmo nome.

Agora que j sabemos como iniciar a plataforma e adicionar containers a ela, vamos comear a pensar em nossos agentes! A idia que iremos usar aqui muito simples. Teremos no nosso container principal um agente chamado TheAnswer responsvel por receber informaes de diversos outros agentes. Esses outros agentes chamados Report iro em determinado momento se conectar ao container principal, procurar por um servio do tipo TheAnswer, enviar uma mensagem e sair. O agente TheAnswer possuir uma interface Swing que mostrar a quantidade de mensagens enviadas a ele, alm de permitir que um operador possa solicitar um relatrio. Esse relatrio no ser implementado por ser uma classe Java comum e ficar aqum do nosso foco, mas poderia conter, por exemplo, as informaes enviadas pelas agentes. Criando os agentes O primeiro agente criado ser o TheAnswer. Como dissemos, um agente simplesmente uma classe Java que herda da classe Agent:public class TheAnswer extends Agent { }

A classe Agent, como diseemos, possui uma srie de mtodos. Nesse exemplo usaremos apenas o mtodo setup:protected void setup() { ... }

Lembre-se que esse mtodo o responsvel pelo processo de preparao e iniciao do agente. Ento dentro dele devemos registrar o nosso servio, iniciar a interface Swing para acompanhamento e adicionar os Behaviors desejados. Para registrarmos o servio, basta criarmos a descrio do servio e solicitarmos ao DF para registr-lo:DFAgentDescription dfd = new DFAgentDescription(); ServiceDescription sd = new ServiceDescription(); sd.setType("TheAnswer"); sd.setName(getName()); sd.setOwnership("MUNDOJAVA"); dfd.setName(getAID()); dfd.addServices(sd); DFService.register(this,dfd);

Para a criao da interface de acompanhamento usaremos o bom e velho Swing. Simplesmente criamos uma classe que extends JFrame e no agente a chamamos(A classse TheAnswerGUI apenas um JFrame e no ser mostrada aqui, porm voc poder v-la no cdigo fonte):private void setupUI() { frame = new TheAnswerGUI( this ); frame.setVisible( true ); }

O ultimo passo a criao do nosso comportamento. Usaremos aqui o CyclicBehaviour, pelo fato do nosso agente sempre ficar ecebendo mensagens. Assim, aps cada execuo (chamada ao mtodo action() ) o processo definido pro esse mtodo repetido novamente. O behavior dos agentes funcionam como um mtodo de callback que temos atravs dos Listener do Swing, ou do OnMessage nos EJBs do tipo MessageDriveBean. O mtodo addBehavior da classe Agent espera um Behavior. Como iremos usar um comportamento j criado pela API do JADE criamos uma inner class:addBehaviour( new CyclicBehaviour( this ) { public void action() { . } } );

Precisamos detalhar melhor o contedo do mtodo action. nele que teremos o nosso processamento. Muito simples. O primeiro passo a chamar o mtodo blockingReceive(), tambm da classe Agent. Esse mtodo faz com que o agente fique esperando receber uma mensagem. Em seguida recuperamos o contedo da mensagem, verificamos o seu contedo e realizamos nossa operao:ACLMessage msg = blockingReceive() ; if (msg != null) { if (ADD.equals( msg.getContent() )) { System.out.println("Mensagem add recebida."); ((TheAnswerGUI)frame).addContador(); } }

Aps a primeira execuo do mtodo action, devido ao comportamento cclico o mtodo

blockingReceive()

chamado novamente e o procedimento se repete.A seguir podemos ver o exemplo completo:package mundojava.server; import jade.core.*; import jade.lang.acl.*; import jade.wrapper.*; import jade.lang.acl.*; import jade.core.behaviours.*;

import jade.domain.FIPAAgentManagement.*; import jade.domain.*; import javax.swing.*; import java.util.*; import java.text.*; /** * A classe TheAnswer extends a classe Agent e com isso se torna um agente que poder ser * controlado por um container. A classe Agente possui vrios mtodos que o container chama * e que outros agentes podem chamar para controlar o ciclo de vida de um agente. * * Nesse exemplo usaremos apenas o mtodo setup que ser responsvel por registrar * o servio, iniciar a GUI e adicionar o Behavior. */ public class TheAnswer extends Agent { public final static String ADD = "ADD"; //A varivel frame apenas armazena a referncia ao GUI private JFrame frame = null; /** * O mtodo setup chamado quando o agente criado em um container. Use-o para iniciar * os recursos usados pelo agente. Aqui estaremos cadastrando o servio junto ao DF, * criando nossa interface de controle e monitoramento e adicionando um comportamento cclico. */ protected void setup() { try { System.out.println( getLocalName() + " iniciando..."); DFAgentDescription dfd = new DFAgentDescription(); ServiceDescription sd = new ServiceDescription(); sd.setType("TheAnswer"); sd.setName(getName()); sd.setOwnership("MUNDOJAVA"); dfd.setName(getAID()); dfd.addServices(sd); try { DFService.register(this,dfd); } catch (FIPAException e) { doDelete(); } setupUI(); addBehaviour( new CyclicBehaviour( this ) { public void action() { ACLMessage msg = blockingReceive() ; if (msg != null) { if (ADD.equals( msg.getContent() )) { System.out.println("Mensagem add recebida."); ((TheAnswerGUI)frame).addContador(); } }

}

} } ); }catch (Exception e) { e.printStackTrace(); }

/** * Lgica necessria a gerao do relatrio */ public void gerarRel() { System.out.println("Relatorio..."); doDelete(); } /** * Inicia a parte grfica */ private void setupUI() { frame = new TheAnswerGUI( this ); frame.setVisible( true );

}

}

Nosso segundo agente, o Report. Nesse, ao invs de registrarmos o servios, ns tentamos localizar um servio. Basta sabermos o nome do servio desejado e definirmos algumas regras para a busca:DFAgentDescription template = new DFAgentDescription(); ServiceDescription templateSd = new ServiceDescription(); templateSd.setType("TheAnswer"); template.addServices(templateSd); SearchConstraints sc = new SearchConstraints(); sc.setMaxResults(new Long(1)); DFAgentDescription[] results = DFService.search(this, template, sc); DFAgentDescription dfd = results[i]; AID provider = dfd.getName();

A classe AID representa a referncia global ao agente em uma plataforma. Fazendo uma analogia, seria a chave primria de uma tabela. Tendo o AID temos a referncia ao agente. Em seguida criamos a mensagens usando a ACLMessage e a enviamos usando o mtodo send da classe Agent:ACLMessage msg = new ACLMessage( ACLMessage.INFORM ); msg.setContent( "ADD" ); msg.addReceiver( provider ); send(msg);

Por fim, chamamos o mtodo doDelete do Agent para que o nosso agente seja removido do container:doDelete();

Note que aqui por nossa ao ser executada apenas no momento da criao do agente no foi necessrio a definio de nenhum comportamento. Abaixo o cdigo completo:package mundojava.cliente; import jade.core.*; import jade.domain.*; import jade.domain.FIPAAgentManagement.*; import jade.lang.acl.*; import jade.util.leap.*; import java.util.*; /** * A classe Report extends a classe Agent e com isso se torna um agente que poder ser * controlado por um container. A classe Agente possui vrios mtodos que o container chama * e que outros agentes podem chamar para controlar o ciclo de vida de um agente. * * Nesse exemplo usaremos apenas o mtodo setup que ser responsvel por procurar * um servio, enviar a mensagem e terminar. */ public class Report extends Agent { /** * O mtodo setup chamado quando o agente criado em um container. Use-o para iniciar * os recursos usados pelo agente. Aqui estaremos recuperando um servio junto ao DF, * enviando nossa mensagem e por fim terminando. */ protected void setup() { System.out.println("Agente " + getLocalName() + " procurando por TheAnswer...");

try { DFAgentDescription template = new DFAgentDescription(); ServiceDescription templateSd = new ServiceDescription(); templateSd.setType("TheAnswer"); template.addServices(templateSd); SearchConstraints sc = new SearchConstraints(); sc.setMaxResults(new Long(1)); DFAgentDescription[] results = DFService.search(this, template, sc); for (int i = 0; i < results.length; ++i) { DFAgentDescription dfd = results[i]; AID provider = dfd.getName(); Iterator it = dfd.getAllServices(); while (it.hasNext()) { ServiceDescription sd = (ServiceDescription) it.next(); if (sd.getType().equals("TheAnswer")) { ACLMessage msg = new ACLMessage( ACLMessage.INFORM ); msg.setContent( "ADD" ); msg.addReceiver( provider ); send(msg); } doDelete();

}

}

} } } catch (Exception fe) { fe.printStackTrace(); }

Agora que j temos nossos agentes, basta chamados. No entanto, para uma melhor compreenso criamos um diagrama de seqncia para o processo de criao do agente TheAnswer e outro para o agente Report. Repare que a seqncia praticamente a mesma apresentada no cdigo:

: JADE : Administrador 1: Criar o Agente 2: setup

: TheAnswer

: TheAnswerGUI

3: register service 4: criar GUI

5: addBehavior 6: mostrar o agente 7: agente criado

Diagrama de seqncia para a criao do agente TheAnswer: JADE : Host 1: adicionar container 2: criar o Report 3: setup : Report : TheAnswer

: TheAnswerGUI

4: procurar servio 5: enviar mensagem 6: atualizar contador 7: delete 8: finalizar

9: remover container

Diagrama de seqncia para a criao do agente Report

Vamos agora colocar em funcionamento nossos agentes. No esquea que ser necessrio colocar no CLASSPATH os arquivos .class que representam os nossos agentes para quando formos cri-los atravs da GUI. Assim, aps termos iniciado nosso framework com o parmetro gui, basta clicarmos no container com o boto direito e escolhermos a opo Start New Agent:

Em seguida, informamos os dados do agente:

Voc poderia iniciar o agente junto a interface grfica do JADE, como fizemos no cdigo fonte deste artigo. Aps a criao do agente teremos os agentes na plataforma JADE e a tela para o acompanhamento.

Vejamos agora a criao de um agente Report. Estes agentes devem ser criados como se estivessem em outras mquinas. Usaremos o comando explicado anteriormente e j solicitaremos a criao do agente Report:> java jar jade.jar container host gyn022480 port 1099 Report:mundojava.cliente.Report

Solicitamos a criao de um segundo agente Report chamado Report2:> java jar jade.jar container host gyn022480 port 1099 Report2:mundojava.cliente.Report

Na GUI podemos ver os agentes Reports criados, com seus containers, e na tela de acompanhamento vemos marcando dois envios.

Nota: Durante a execuo voc praticamente no ter tempo de ver o agente Report. Isso ocorrer pelo fato dele estar se destruindo aps o envio da mensagem. Para a gerao do relatrio basta que o administrador clique no boto Gerar Status. Como j dissemos o processo de gerao do relatrio em nada tem haver com a tecnologia de agentes e por isso no ser explorado aqui, seu objetivo apenas mostrar a possibilidade de comunicao entre uma aplicao externa e o agente. Consideraes Finais Apesar de termos visto os agentes se comunicando e que realmente so entidades dotadas de capacidade de ao e reao, o exemplo acima muito simplrio para refletir o potencial dessa tecnologia. importante ressaltar que a tecnologia de agentes por si s no completa. Outras disciplinas so essenciais para que possamos tirar um melhor proveito desses agentes, como por exempo: Inteligncia Artificial, Reconhecimento de padres, etc. Apesar de sua grande capacidade, comercialmente o uso de agentes ainda esta limitado a poucos cenrios. Sem dvida, aliada a outras tecnologias, o uso de agentes j oferece um diferencial computacional imenso. Em um futuro prximo, certamente teremos a aplicao de agentes em sistemas complexos a fim de obtermos um melhor aproveitamento.

Para Saber Mais

Site Projeto JADE http://sharon.cselt.it/projects/jade Site da FIPA http://fipa-os.sourceforge.net Exemplos obtidos no site do JADE. Voc poder ver diversos agentes e funcionalidades.

Referncias Junior, Celso G. Camilo. Dissertao Sistema Multiagente de Negociao Automatizada para Comrcio Eletrnico. UFG Gois. 2005. WEISS, G. Multiagent Systems. [S.l.]: MIT, 1999. JADE. Homepage do Projeto JADE. 2006. Disponvel em: . Acesso em: 9 agosto 2006. FIPA. O framework FIPA. 2003. Disponvel em: . Acesso em: 9 agosto 2006. Camilo, Cassio Oliveira; Porcincula, Eduardo de Moraes. TCC Tecnologia de Agentes Mveis Aplicada ao Mercado de Compras Virtuais. UCG Gois. 2004Cssio O. Camilo ([email protected]) graduando no curso de Cincias da Computao pela UCG-GO, trabalha como desenvolvedor Java na POLITEC LTDA - Goinia. Detm aos ttulos de SCJP e SCWCD. Moderador do JUG GOJava e XPLeader do XPGO XisPequizeiros. Eduardo de M. Porcincula ([email protected]) graduado no curso de Cincia da Computao pela UCG-GO, trabalha como desenvolvedor Java na POLITEC LTDA Goinia e possui a certificao de SCJP.

ANEXO I

package com; import jade.core.Agent; import javax.swing.JFrame; public class TheAnswerGUI extends JFrame { private Agent agente; private int qtde = 0;

public TheAnswerGUI (Agent agente) { this.agente = agente; initComponents(); }

public void addContador() { qtde++; jTextField1.setText(""+qtde); }

public void subContador() { qtde--; jTextField1.setText(""+qtde); }

/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() { jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("QTDE:");

jTextField1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTextField1ActionPerformed(evt); } });

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addGap(18, 18, 18) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(18, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(25, 25, 25) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(25, Short.MAX_VALUE)) );

pack(); }//

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:

}

// Variables declaration - do not modify private javax.swing.JLabel jLabel1; private javax.swing.JTextField jTextField1; // End of variables declaration }