Desenvolvendo SMAs na Plataforma JADE Pós Graduação em Engenharia da Informação Tópicos Especiais em Ciências Cognitivas André Filipe de Moraes Batista [email protected] UFABC 2009 Objetivos Conhecer a arquitetura da plataforma JADE Desenvolver a programação na plataforma JADE, com o desenvolvimento de um sistema multiagente Conhecer as ferramentas oferecidas pela plataforma 1 JADE Java Agent Development framework JADE - Middleware Biblioteca de alto nível que facilita o desenvolvimento de aplicações fornecendo serviços genéricos úteis para várias aplicações JADE : Plataforma de agentes em conformidade com o padrão FIPA Package para o desenvolvimento de agentes JADE - Implementação A implementação dos agentes em JADE será em JAVA. Por quê utilizar JAVA ? ambientes heterogêneos distribuídos Serialização de Objetos RMI etc POO 2 Instalando o Software Configuração das variáveis de ambiente - Instalação dos arquivos fontes -Execução da plataforma - Requisitos Mínimos Para execução da plataforma Java Run-Time Environment(JRE) 1.4 ou superior Para desenvolvimento Java Development Kit (JDK) 1.4 ou superior Software JADE Licença LGPL Direitos: Acesso ao código fonte Fazer e distribuir cópias Fazer melhorias e novas funcionalidades Deveres: Jamais fazer modificações privadas e secretas Não alterar a licença e suas modificações Software JADE Disponível em http://jade.cselt.it http://jade.tilab.com Última versão: 3.7 Software JADE Instalação Faça o download do arquivo jadeAll.zip Descompacte este arquivo para o hd principal (C:) Será criada uma pasta chamada jade. Inclua a seguinte linha na variável de ambiente path: .;c:\java\bin;c:\java\lib E na variável classpath: .;c:\jade\lib\jade.jar; c:\jade\lib\jadeTools.jar; c:\jade\lib\iiop.jar Obtendo ajuda • JADE administrator guide http://jade.tilab.com/doc/administratorsguide.pdf • JADE programmer guide http://jade.tilab.com/doc/programmersguide.pdf • Examples & tutorials http://jade.tilab.com/doc/index.html Nosso manual no site Oficial http://jade.tilab.com/doc/tutorials/noEnglish /ManualJadePortuguese.pdf Developing Multi-Agent Systems with JADE Fabio Bellifemine, Giovanni Caire, Dominic Greenwood Editor: WILEY ISBN: 978-0-470-05747-6 3 JADE - Arquitetura - Arquitetura da plataforma JADE -Agentes FIPA: Páginas Amarelas e Páginas Brancas - Arquitetura Jade é um middleware para o desenvolvimento de sistemas multiagentes 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 Padrão FIPA JADE segue o modelo da FIPA (Foundation for Intelligent Physical Agents) Arquitetura PLATFORM a set of active containers The main container of the platform; all other containers register with it as soon as they start. CONTAINER a running instance of the JADE runtime environment 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 3 Primeiros Programas Classe Agent -Modelo Computacional de um Agente -Hello World - Ciclo de Execução dos Agentes -Ambiente Gráfico da Plataforma - 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 Modelo Computacional de um 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 Hello World Agentes são como Applets, eles executam dentro de outro programa javac *.java java jade.Boot Fred:HelloAgent No caso, a classe jade.Boot fornece o ambiente de execução dos agentes Importamos jade.core.Agent Um agente é uma extensão da classe Agent Método setup é o método main de um agente Agentes – Ciclo de Vida 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 Agentes – Ciclo de Vida 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 Agent Identifiers classe jade.core.AID getAID() obter identificação do agente getAID().getLocalName() GUID getAID().getName() Endereços método getAID().getAllAdresses(), retorna um interator Interator auxílio com Collections Métodos hasNext() e next() O método getAID().getAllAddresses() retorna um objeto Interator java jade.Boot Luis:InfoAgentes Hello World ! Eu sou um agente! Meu nome local é Luis Meu nome global (GUID) é Luis@lap:1099/JADE Meus endereços são: - http://lap:7788/acc Passando Argumentos (1/3) Importamos a classe AID para manipular AID’s Passando Argumentos (2/3) O método doDelete() invoca o método takeDown() Passando Argumentos (3/3) java jade.Boot Jose:CompradordeLivros(“O-Pequeno-Principe”) Ola !!! Eu sou o Agente Comprador Jose e estou pronto para comprar ! Pretendo comprar o livro: O-Pequeno-Principe java jade.Boot Jose:CompradordeLivros Ola !!! Eu sou o Agente Comprador Jose e estou pronto para comprar ! Nao tenho livros para comprar ! Agente Comprador Jose@lap:1099/JADE esta finalizado Interface Gráfica java jade.Boot –gui … Executa a plataforma com interface gráfica Na verdade é um agente que possui interface gráfica, denominado RMA (Remote Monitoring Agent) Seria possível, então, desenvolver um agente com interface gráfica??? Basic operations: • Start • Kill • Suspend Active agents: • Resume • RMA (the GUI itself) • Send Message • ams (white pages) • Migrate • df (yellow pages) • Clone Useful tools: • Sniffer (“interaction spy”) • Dummy agent • Log Manager • Introspector (agents internals) • Add platform 4 Comportamentos Behaviours -Tipos de Comportamentos -Comportamentos pré-definidos -Aplicação - Comportamentos Cada ação do agente comportamento Código deve estar em uma classe que herde jade.core.behaviour.Behaviour Uma vez implementado, basta chamar o método addBehaviour() para que o comportamento seja executado. Exemplo (1/5) Exemplo (2/5) Exemplo (3/5) Método action() é executado quando o comportamento é acionado. Exemplo (4/5) Variável que representa o agente Exemplo (5/5) Método que verifica a finalização do comportamento. Tipos de Comportamentos Simple Behaviour Composite Behaviour 40 F.F. Dalpiaz – AOSE 2008-09 Dalpiaz – AOSE 2008-09 Comportamentos Simples One Shot Behaviour Um comportamento é dito one-shot quando Após o método action() este é finalizado Ou seja, o método action() é executado apenas 1 vez jade.core.behaviours.OneShotBehaviour fornece a implementação de um comportamento one-shot Esta implementa o método done() retornando true Comportamentos Simples Comportamentos Cíclicos Um comportamento é dito cíclico quando Nunca termina Seu método action() executa a mesma coisa diversas vezes jade.core.behaviours.CyclicBehaviour Implementa o método done() retornando false Comportamentos Simples Comportamentos Temporais WakerBehaviour e TickerBehaviour. possuem uma estreita relação com o tempo durante sua execução Aos serem invocados, ambos aguardam até que se tenha cumprido um tempo de definido (time-out) para serem executados. Waker vs. Ticker Executa apenas uma vez Ticker Executa a cada time-out Waker Comportamentos Simples Waker Comportamentos Simples Ticker Comp. Compostos Comportamentos compostos tentam modelar diferentes tipos de comportamentos de um agente A classe abstrata jade.core.behaviours.CompositeBehaviour modela estes tipos de comportamento É feita pela composicao de outros comportamentos (children) É apenas uma interface Não define como os comportamentos filhos serão escalonados Duas formas de escalonamento estão disponíveis Sequencial Paralela Sequential behaviour Comportamentos filhos são executados em sequencia Dois modos de usar: Extendendo jade.core.behaviours.Se quentialBehaviour Declarando um SequentialBehaviour Depois da execução de todos os filhos, o comportamento é finalizado Parallel behaviour Escalonamento concorrente dos comportamentos filhos Classe jade.core.behaviours.ParallelBehaviour Três modos de finalização do comportamento pai when all children are done (constant ParallelBehaviour.WHEN_ALL) when any child is done (constant ParallelBehaviour.WHEN_ANY) when N children are terminated use the constructor ParallelBehaviour(int endCondition) Parallel Behaviour Output Behaviour 1 executing cycle 1 Behaviour 2 executing cycle 1 Behaviour 3 executing cycle 1 Behaviour 1 executing cycle 2 Behaviour 2 executing cycle 2 Behaviour 3 executing cycle 2 Behaviour 2 executing cycle 3 Behaviour 1 executing cycle 3 Behaviour 2 executing cycle 4 FMS Behaviour Semelhante a uma máquina de estado finito Classe jade.core.behaviours.FSMBehaviour Cada comportamento filho é um estado da máquina Veja exemplo em nossa apostila 5 Comunicação entre Agentes Estrutura de uma mensagem em JADE -Envio/Recebimento de mensagens -Respondendo mensagens -Encontrando agentes -Buscando no AMS - Comunicação entre Agentes JADE agents have communication capabilities The adopted paradigm is asynchronous message passing. Each agent has a sort of mailbox (the agent message queue) JADE posts into the mailbox the messages sent by other agents Whenever a message is posted in the message queue the receiving agent is notified The programmer decides when to get the message from the message queue How do agents communicate? Messages exchanged by JADE agents have a format specified by the FIPA ACL (Agent Communication Language) Instances of the jade.lang.acl.ACLMessage class. JADE provides methods to get and set all the fields defined by the ACL language get/setPerformative() get/setSender() add/getAllReceiver() get/setLanguage() get/setOntology() get/setContent() … Enviando uma Mensagem Sending a message to another agent requires filling the fields of an ACLMessage object call the send() method of the Agent class The code below informs an agent whose nickname is Peter that today it’s raining Receiving messages The JADE runtime automatically posts messages in the receiver’s private message queue as soon as they arrive An agent can pick up messages from its message queue by means of the receive() method This method returns the first message in the message queue (removing it) or null if the message queue is empty and immediately returns Blocking behaviours The previous behavior is continuously executing even no messages occur - msg != null is false. In general, this is not a good way of programming… Use the block() method Another way of enacting blocking behaviours is using the blockingReceive() method instead of receive(). Exemplo: Sender Exemplo: Receiver Seleção de Mensagens The receive() method returns the first message in the message queue and removes it. If there are two (or more) behaviours receiving messages, one may “steal” a message that the other one was interested in. To avoid this it is possible to read only messages with certain characteristics specifying a jade.lang.acl.MessageTemplate parameter in the receive() method. 6 DF e AMS Registro -Exclusão de registro -Busca -Métodos Úteis - Páginas Amarelas Páginas Amarelas The DF is an agent and as such it communicates using ACL The ontology and language that the DF “understands” are specified by FIPA • The jade.domain.DFService class provides static utility methods that facilitate the interactions with the DF It is possible to search/register to a DF agent of a remote platform register() modify() deregister() search() The JADE DF also supports a subscription mechanism When an agent registers with the DF it must provide a description (jade.domain.FIPAAgentManagement.DFAgentDescription) The description is composed of The agent AID A collection of service descriptions (class ServiceDescription) In turn, ServiceDescription is composed of The service type (e.g. “Weather forecast”) The service name (e.g. “Meteo-1”) The languages, ontologies and interaction protocols that must be known to exploit the service A collection of service-specific properties in the form key-value pair When an agent searches/subscribes to the DF it must specify another DFAgentDescription that is used as a template Páginas Amarelas Ao finalizar um agente, deve-se retirar seu cadastro das páginas amarelas Podemos usar o método takeDown() DF – Busca (1/2) public class Busca extends Agent { protected void setup() { DFAgentDescription template = new DFAgentDescription(); ServiceDescription sd = new ServiceDescription(); sd.setType("Tipo"); template.addServices(sd); try{ DFAgentDescription[] result = DFService.search(this, template); //Imprimo os resultados for (int i = 0; i < result.length; i++) { String out = result[i].getName().getLocalName() + " provê "; DF – Busca (2/2) //Para obter os serviços do agente invocamos //o método getAllServices(); Iterator iter = result[i].getAllServices(); while (iter.hasNext()) { //Extraímos os servicos para um objeto ServiceDescription ServiceDescription SD = (ServiceDescription) iter.next(); //Capturamos o nome do serviço out += " " + SD.getName(); } System.out.println(out); } //fim do laço for } catch (FIPAException e) { e.printStackTrace(); } } }