Universidade Estadual de Campinas
Faculdade de Engenharia Elétrica e de Computação
IA009 - Introdução à Teoria de Agentes Inteligentes
Professor Dr. Ricardo Ribeiro Gudwin
Modelagem usando Rede de Agentes Semiônicos
de um Posto de Gasolina
Icaro Nunes Saggioro - 004251
Novembro de 2002
Introdução
O objetivo deste exercício é a representação de uma situação organizacional real no âmbito dos Agentes Semiônicos, utilizando para isso a ferramenta SNTool Kit.
Inicialmente será apresentado o processo organizacional escolhido de maneira descritiva, para que se tenha idéia de sua natureza de funcionamento. Em seguida será mostrado o trabalho de modelagem do processo de acordo com os paradigmas suportados pela ferramenta. Será feita também uma análise sobre o processo de simulação do modelo gerado. Finalmente serão feitas algumas considerações finais sobre o objeto de análise e particularidades do processo de modelagem e sobre a ferramenta.
O Objeto de Modelagem
Apresentação
A análise será realizada sobre o processo de revenda de combustíveis derivado de petróleo para uso em veículos automotivos em geral – mais conhecido como venda de gasolina no varejo em postos de serviços.
O processo básico é simples. O cliente dirige-se com seu veículo ao posto de gasolina e solicita ao frentista que encha o tanque do carro. Terminada a operação o cliente se dirige ao caixa e paga a conta diretamente ao funcionário encarregado de receber as contas dos clientes. A conta é calculada multiplicando-se a quantidade de litros que foram colocados no tanque do veículo pelo preço por litro de combustível.
Embora o sistema completo tenha inúmeras outras entidades e interações, um número reduzido será considerado para que se tenha uma boa modelagem semiônica sem que se atinja uma alta complexidade para entende-lo, modela-lo e simula-lo.
O produto a ser comercializado, a gasolina, fica depositado em grandes tanques no subsolo do posto e de lá é retirado por uma bomba elétrica manuseada pelo frentista. Várias bombas podem estar ligadas ao mesmo tanque de combustível.
A gasolina é comprada junto à Distribuidora de Combustíveis periodicamente. Assim que os estoque atingem um limite mínimo o Gerente do estabelecimento, Posto de Gasolina, faz um pedido à companhia distribuidora e esta abastece o posto através de grandes caminhões ou linhas diretas de distribuição.
A partir do momento que o combustível é entregue ao posto, a Distribuidora gera uma fatura a ser paga. O valor a ser pago é calculado multiplicando-se a quantidade entregue (em litros) pelo preço por litro. Como esta é uma análise pouco profunda, desconsideramos gastos com frete.
A fatura gerada pela empresa de distribuição deve ser paga assim que o combustível for entregue com parte do dinheiro faturado com a revenda do combustível para os consumidores.
Identificação de Entidades
Abaixo encontram-se as principais entidades identificadas na descrição textual do sistema e uma classificação inicial quanto ao quisito Agente/Objeto. São elas:
Por se basear na descrição textual, esta lista pode mudar consideravelmente durante a modelagem utilizando-se a ferramenta já que precisamos "encaixar" o mundo real dentro dos conceitos utilizados. Entidades vão provavelmente desaparecer, outras serão criadas, algumas vão mudar de classificação, etc, etc.
Modelagem usando a ferramenta SNTool Kit
Com o intuito de facilitar o desenvolvimento foram adotados algumas fases para o desenvolvimento todo. Estas serão descritas em parágrafos distintos nesta seção.
Levantamento Inicial
A primeira fase foi a de levantamento e descrição textual do processo. Essa descrição será referencia básica para todas as outras fases e dela já se pode ter uma lista preliminar de entidades que estarão presentes na modelagem.
Definições básicas para o uso da ferramenta
Com base nessa lista preliminar são tomadas algumas decisões sobre abordagem, abrangência e escopo do projeto. Então cria-se a net e adiciona-se o número de páginas necessárias para acomodar todo o sistema – apenas uma para esta modelagem. A Figura 1, abaixo, mostra a criação de uma net e atribuição de nome.
|
Figura 1 – Criação de uma net e adição de página |
Construção básica dos Agentes
O maior desafio da modelagem é determinar quais entidades do sistema original serão considerados agentes, quais serão meros objetos e, não menos importante, quais serão as interações entre Agentes e Objetos.
O SNTool Kit representa agentes e objetos da seguinte maneira:
Cada uma das classes criadas dentro do SNTool será implementada através de uma classe Java para a simulação.
As funções de avaliação e de transformação, embora sejam tratadas como uma só no momento da criação, têm tratamentos diferentes na implementação, possuindo códigos e ativação separados para seguir os conceitos de Agentes Semióticos.
A medida que se têm definidos os agentes deve-se cadastrar seus sensores, atuadores, estados e funções e fazer a associação dos sensores e atuadores às funções pertinentes. A Figura 2 a mostra a criação de um sensor e serve como base para a criação de todos os outros componentes de um agente. A Figura 2 b mostra a associação de sensores a funções.
|
Figura 2 – Adição de sensor e sua posterior associação com a função |
Desenho da Topologia da Rede
O conceito de "Lugar" é, dentro do SNTool, utilizado para representar aglomerações de entidades de mesmo tipo, facilitando a organização do projeto e melhorando a performance das simulações por reduzir os escopos habilitantes possíveis. A figura abaixo mostra um modelo de referencia para interação entre Objetos e Agentes levando em consideração o conceitos de "Lugar".
|
Figura 3 – Modelo de referência para ligação de Agentes e Objetos |
|
Figura 4 – Criação de um lugar |
Deve-se criar "lugares" e especificar seu nome e tipo de acordo com tipo da entidade que existirá ali. A Figura 4, acima, ilustra a criação de um lugar.
Em seguida deve-se fazer a ligação dos "lugares" através de setas de interação pois são elas q especificam como é a correspondência entre sensores e atuadores de um determinado agente, presente em algum "lugar", com os objetos de um outro determinado "lugar". Para isso basta clicar numa das setas presentes na barra de ferramentas de modelagem, clicar no objeto origem e depois no objeto destino. É interessante notar que a seta ficará da cor vermelho até que se escolha o sensor/atuador ao qual ela esta ligada.
|
Figura 5 – Criação de um link público-privado |
A Figura 5, acima, mostra a criação de um link entre "lugares" e a Figura 6 mostra o resultado da rede de agentes para simulação do Posto de Gasolina
|
Figura 6 – A topologia construída para representação de um posto de gasolina |
Implementação dos agentes
É sugerido que a implementação dos códigos fique para o final da modelagem para que fique mais simples.
Todos os códigos fonte das diferentes partes do projeto podem ser acessados da mesma maneira: deve-se clicar no objeto (rede, página, agente) com o botão direito e escolher a opção "Edit Java code".
O primeiro código a ser escrito é o código da rede. O código setInitialBalance(1.0) deve ser deixado exatamente como foi criado pela rede. Não é necessária nenhuma alteração.
O próximo a ser editado é o código fonte das páginas da rede. Aqui deve ser inserida a codificação necessária para inicializar a rede como por exemplo a instanciação de agentes e objetos.
Na seqüência se edita o código das classes criadas. Para isso basta clicar com o botão direito do mouse e selecionar "Edit Java Code". Uma pequena janela será mostrada contendo o código a ser executado na inicialização de cada nova instância (init), o código executado na destruição de uma instância (clean) e, na sequência, os códigos para as funções de transformação (perform) e avaliação (match) para cada função adicionada à classe durante a criação básica do agente. A Figura 7 mostra a janela de edição com o código para perform e match do agente
|
Figura 7 – Tela de edição de código |
Como já comentado anteriormente a implementação é feita em Java.
Simulação – validação, compilação e testes
Validação
Depois de terminada a rede e inserido todo o código necessário, deve-se passar pela etapa de validação. Esta funcionalidade pode ser ativada com a opção "Compile – Validate" do menu principal da ferramenta ou pressionando a tecla <F7>.
Compilação
O passo seguinte é a compilação do modelo. Esta é uma tarefa simples e para isso basta pressionar <F9>.
|
Figura 8 – Validação e Compilação |
É importante notar que a saída deste procesos em caso de erro de compilação o log gerado pelo compilador Java utilizado (o javac), que, infelizmente, não cobre todos tipos de problemas que podem ocorrer durante a modelagem. Haverá na seção Considerações Finais serão dadas algumas dicas sobre o desenvolvimento para evitar maiores transtornos.
Simulação e Testes
Iniciar a Simulação também é uma tarefa simples, basta clicar no botão presente na barra de ferramentas ou teclar <F8>. Será criada uma nova janela chamada SNTool Debugger que contém uma barra de ferramentas em sua borda superior.
Deve-se clicar no primeiro botão da barra de ferramentas para que se carregue as informações atualizadas para a simulação. Será possível ver uma pequena janela com as páginas definidas para o sistema.
Deve-se também escolher quais páginas serão visualizadas durante a simulação e qual o modo de visualização. Faz-se isso clicando com o botão direito do mouse sobre a página e escolhendo-se o viewer. Recomenda-se o page-viewer.
A Figura 9 apresenta uma tela básica para simulação usando page-viewer para a página principal.
|
Figura 9 – Tela simples utilizada para testes |
Será possível acompanhar o ciclo de vida de cada objeto presente na rede ou que venha a ser criado durante os testes. Para isso pode-se fazer as seguintes ações:
A Figura 10 mostra uma tela preparada para um teste da rede do posto de gasolina enfocand especificamente o processo de fornecimento de produto (gasolina) para o posto. O Sistema Inteligente de Pedidos (SIP) analisa o estoque no tanque subterrâneo e envia um pedido para a Distribuidora de Combustíveis caso o estoque esteja abaixo do limite mínimo. A distribuidora irá entregar a quantidade de produto solicitada e gerará uma nota fiscal para que seja paga a quantia devida pelo posto. Enquanto o Gerente do Posto paga a nota com fundos que ele extrai dos cofres da firma, o Descarregador cuida do abastecimento do tanque subterrâneo com o produto que foi liberado pela Distribuidora.
|
Figura 10 – Tela para simulação da compra e entrega de produto (gasolina) |
Indiferente a essa movimentação temos o cliente que precisa que o frentista opere a bomba elétrica (não representada nesta modelagem) e encha seu tanque. Só o Cliente sabe quantos litros cabem em seu tanque de combustível. Assim que seu tanque é cheio o Cliente calcula o quanto deve levando em conta quantos litros de foram utilizados e multiplicando esse valor pelo preço do combustível para o consumidor final e paga o valor devido diretamente ao Caixa, que por sua ver coloca o dinheiro recebido direto no cofre por segurança. Veja na figura abaixo.
|
Figura 11 – Tela simulação da interação do cliente c/ posto |
Nada impede que os objetos e agentes vistos nas duas figuras acima sejam visualizados simultaneamente durante a simulação, as figuras são apenas sugestões para simplificação da depuração levando-se em conta a divisão uma macro divisão do sistema em sub-sistemas.
A melhor maneira de acompanhar a simulação é utilizar o avanço passo-a-passo. Para isso basta que se clique no botão presente na barra de ferramentas.
Será fácil de visualizar já nas primeiras iterações que um pedido de entrega de gasolina será gerado pois o estoque foi propositadamente colocado em 750 litros, o que está abaixo do limite mínimo de 1000 litros em estoque. Repare que a todo momento o SIP tenta checar os limites mínimos do tanque de combustível, mas um pedido só é feito caso um outro não esteja com sua entrega pendente. Uma olhada mais próxima do Agente SIP mostrará o estado interno que controla este mecanismo. A Figura 12 abaixo ilustra isso.
|
Figura 12 – Visualização dos estados internos |
Uma olhada no lugar pCofre mostrará a evolução do capital de giro do posto já que entram recursos vindos dos pagamentos feitos pelos clientes e saem recursos pois o Gerente deve pagar as notas de compra de gasolina. Para a implementação foi criado um lugar chamado pCofre e a ele foi atribuído o tipo Int e assim consegue-se que o lugar pCofre abrigue um objeto do tipo Int que representa o montante de dinheiro contido no cofre.
Outro objeto que recebeu tratamento semelhante durante a modelagem foi o estoque de combustíveis. Foi criado um place chamado pSubsolo que conterá objetos do tipo Int. Com isso consegue-se que o objeto contido em pSubsolo represente o estoque de combustíveis em litros.
Aqui o ideal seria que se tivesse objeto tanqueDeCombustivel dotado de métodos colocar(int x) e retirar (int x) para representar a entrada e a saída de combustível do tanque, respectivamente, mas a falta de conhecimento sobre a ferramenta forçou o uso de uma solução mais simples. Uma análise análoga pode ser feita para o objeto Cofre.
Os outros objetos foram modelados levando-se em conta as mesmas idéias. Devido à maneira que os objetos Cofre e Tanque de Combustível foram implementados foi necessário criar um mecanismo para ler o objeto através de um sensor, consumi-lo, realizar com ele a operação desejada, criar um objeto que é resultante desta operação e devolvê-lo ao "lugar" de origem alterado. Os objetos afetados foram Cliente , que retira do estoque de combustíveis a quantidade necessária para encher o tanque de seu carro, Caixa, que adiciona ao cofre o dinheiro pago pelos abastecimentos, e Gerente, que retira dinheiro do cofre para pagar as contas.
Considerações Finais
Os recursos apresentados pelo paradigma da modelagem semiônica são poderosos e apresentam-se como uma alternativa interessante e rica para representação de sistemas que exigem alto grau de simulação de comportamentos do mundo real e autonomia de comportamento dos componentes de um sistema.
O processo produtivo mostrou-se bem definido e a ferramenta mostrou-se poderosa, podendo representar sistemas tão complexos quanto se possa modelar.
No entanto todo trabalho com um novo paradigma é um grande desafio e acaba sendo necessário um bom tempo de maturação do usuário/projetista para que se possa tirar todo o proveito da teoria e da ferramenta. No caso do SNTool a falta de familiaridade soma-se a falta de uma documentação extensiva e exemplos abrangentes.
Esses fatores levaram a um processo bastante interativo e iterativo de trabalho com a ferramenta. Não foi possível inserir todos os agentes numa rodada só devido a falta de de conhecimento de detalhes do comportamento e implementação da ferramenta. A abordagem de modelagem acabou sendo de muita iteração: cada novo agente inserido requeria revisões de modelagem e implementação pelo menos dos objetos que interagiriam diretamente com o agente a ser inserido.
Como já mencionado, é necessária muita atenção durante o desenvolvimento. Abaixo vão algumas dicas práticas:
Com relação à modelagem realizada muito há para se fazer. No estudo de caso aplicado há possibilidade de se aumentar a complexidade da interação do cliente com o sistema do posto dando-lhe mais serviços a serem utilizados ou introduzindo situação de solução não trivial como falta de combustível para abastecer o tanque do cliente ou mesmo falta de fundos do cliente para pagamento da conta. Outra modificação interessante seria implementar uma troca de mensagens entre agentes para que o Gerente só pagasse a nota de compra de gasolina depois que o produto fosse devidamente entregue - descarregado para dentro do tanque subterrâneo.