AGENTES – EXERCÍCIO COMPUTACIONAL 5
REDES DE AGENTES – SNTOOL – PIZZA
DELIVERY
Luiz Felipe S. Peixoto , lfsp@iname.com, 05-Dezembro-2002
Objetivo: O objetivo deste trabalho é representar um processo organizacional do
mundo real, através de um modelo de rede de agentes utilizando o software SNTool.
Processo:
O processo organizacional escolhido foi uma
pizzaria delivery, com a seguinte rotina:
- O cliente telefona para o call
center da pizzaria;
- O call center fornece
o menu com as opções de pizza e bebidas;
- Baseado no menu fornecido o cliente
escolhe uma opção de pizza e de bebida;
- O call center transmite
o pedido para a loja;
- Na loja um assistente emite o pedido da
pizza para o pizzaiolo e separa as bebidas solicitadas;
- O pizzaiolo ao receber o pedido retira os
ingredientes necessários do estoque e produz a pizza;
- Quando a pizza está pronta um empacotador
reúne a pizza e a bebida em sua embalagem para viagem;
- Um entregador é encarregado então de
realizar a entrega e recolher o pagamento do cliente;
- Ao retornar, o pagamento é passado para o
caixa e o processo se encerra;
- Paralelamente o fornecedor monitora o
estoque de ingredientes da loja, reabastecendo-a sempre que o estoque
atinge um determinado nível.
Modelo:
Para representar o processo acima, foi
desenvolvido um modelo utilizando rede de agentes, representado graficamente
abaixo, usando o software SNTool :

Configuração
inicial da rede
Para tanto foram criadas as seguintes
classes de objetos:
- PhoneCall:
representa a ligação do cliente para o call center; possui
- 1 estado interno:
- sCallingNumber: armazena o número do cliente que está ligando.
- Pizza:
representa uma pizza; possui:
- 3 estados internos:
- sCode:
código da pizza no menu;
- sName:
nome da pizza;
- sPrice:
preço da pizza;
- Drink:
representa uma bebida; possui:
- 3 estados internos:
- sCode:
código da bebida no menu;
- sName:
nome da bebida;
- sPrice:
preço da bebida.
- Menu:
representa o menu com as opções de pizza e bebidas e seus respectivos
preços; possui:
- 2 estados internos:
- sPizzas:
lista com as opções de pizzas e seus preços;
- sDrinks:
lista com as opções de bebidas e seus preços;
- Order:
representa o pedido do cliente; possui:
- 3 estados internos:
- sPizza:
a pizza escolhida pelo cliente;
- sDrink:
a bebida escolhida pelo cliente;
- sNumber:
número do pedido; é utilizado o número do telefone do cliente;
- Payment:
representa o pagamento; possui:
- 3 estados internos:
- sValue:
valor do pagamento;
- sOrderNumber: número do pedido que está sendo pago.
- Package:
representa o pacote com o pedido a ser entregue ao cliente; possui:
- 3 estados internos:
- sDrink:
a bebida a ser entregue para o cliente;
- sPizza:
a pizza a ser entregue para o cliente;
- sOrderNumber: o número do pedido do cliente;
- Ingredients: representa o estoque de ingredientes da pizzaria; possui:
- 1 estado interno:
- sStock:
o número de itens disponível no estoque.
- PizzaOrder:
representa o pedido de pizza para o pizzaiolo; possui:
- 1 estado interno:
- sPizza:
a pizza a ser fabricada.
E as seguintes classes de agentes:
- Customer:
representa o cliente; possui:
- 2 sensores: inMenu e inPackage;
- 2 atuadores: outPhoneCall e outPayment
- 2 estados internos:
- sPhoneNumber: armazena o número do telefone do cliente e serve para
identificar os seus pedidos
- sWaitingOrder: flag que indica se o cliente realizou um pedido que ainda
não foi entregue, impedindo desta forma que o cliente emita um novo
pedido antes que o anterior seja entregue;
- 3 funções:
- makePhoneCall: representa a chamada telefônica do cliente para a pizzaria;
- makeOrder: recebe as informações do menu fornecidas pelo call center,
realiza a escolha da pizza e da bebida e emite o pedido;
- makePayment: recebe a entrega da pizza, calcula o valor a ser pago,
emite o pagamento para o entregador e altera o estado interno sWaitingOrder
para 0 indicando que o cliente já recebeu o seu pedido.
- CallCenter:
representa o call center da pizzaria, possui:
- 2 sensores: inPhoneCall e inOrder;
- 2 atuadores: outMenu e outOrder;
- 2 funções:
- sendMenu:
recebe a ligação do cliente e informa ao cliente o menu com as opções de
pizzas e bebidas;
- takeOrder: recebe o pedido do cliente e o transmite para a loja.
- Assistant:
representa um assistente da pizzaria; possui:
- 1 sensor: inOrder;
- 3 atuadores: outPizzaOrder, outDrink
e outOrder;
- 1 função:
- divideOrders: recebe o pedido do cliente transmitido pelo call center,
emite o pedido de fabricação da pizza ao pizzaiolo, separa a bebida e
repassa o pedido do cliente para o empacotador (Packager).
- Cooker:
representa o pizzaiolo; possui:
- 2 sensores: inPizzaOrder e inIngredients;
- 1 atuador: outPizza;
- 1 função:
- makePizza: recebe o pedido de fabricação da pizza, retira os
ingredientes do estoque e passa a pizza pronta para o empacotador (Packager).
- Packager:
representa o empacotador; possui:
- 2 sensores: inPizza, inDrink
e inOrder;
- 1 atuador: outPackage;
- 1 função:
- makePack:
recebe o pedido e coloca a pizza e a bebida em uma embalagem para
entrega, repassando a embalagem para o entregador (DeliveryBoy);
- DeliveryBoy: representa o entregador; possui:
- 2 sensores: inPackage e inPayment;
- 2 atuadores: outPackage e outPayment;
- 1 estado interno:
- sOrderNumber: armazena o número do pedido do cliente, identifica de qual
pedido ele deve receber o pagamento e caso seu valor seja 0 significa
que o entregador está disponível para fazer uma nova entrega;
- 2 funções:
- deliveryPackage: recebe a embalagem do empacotador, armazena o número do
pedido no estado interno sOrderNumber e entrega o pedido ao
cliente;
- getPayment: recebe do cliente o pagamento relativo ao número de pedido
que entregou, entrega o pagamento ao caixa da pizzaria (Cashier)
e altera o estado interno sOrderNumber para 0 indicando que está
disponível para fazer uma nova entrega.
- Cashier:
representa a caixa da pizzaria; possui:
- 1 entrada: inPayment;
- 1 função:
- getPayment: recebe o pagamento do entregador; este objeto é um
sumidouro pois recebe os objetos do tipo Payment e os destrói.
- Supplier:
representa o fornecedor de matéria-prima; possui:
- 1 sensor: inIngredients;
- 1 atuador: outIngredients;
- 1 função:
- deliveryIngredients: consulta o estado interno sStock do objeto Ingredients
e caso esteja abaixo de um valor determinado, realiza um ressuprimento
alterando este valor.
Resultados:
O modelo apresentado nos permite simular
diversas situações variando alguns parâmetros:
1.
Número de Agentes:
Alterando o número de agentes em cada
função pode-se verificar os gargalos no processamento dos pedidos.
Nas figuras abaixo podemos verificar
algumas destas situações:

Ligações
aguardando atendimento pelo call center e
processamento
dos pedidos acumulado

Pedidos
prontos aguardando entrega
2.
Probabilidade dos Pedidos:
Na classe Customer, na função makePhoneCall,
a freqüência com que um cliente realiza pedidos é aleatória. Para isso é gerado
um número aleatório entre 0 e 1.0, caso este número esteja abaixo de um
parâmetro fornecido o cliente efetua uma ligação. Logo, quanto mais próximo de
1.0 maior é a freqüência com que o cliente efetua novos pedidos.

Clientes
com probabilidade 0,9 de solicitar pedidos
(19
clientes de 20 emitiram pedidos)

Clientes
com probabilidade 0,3 de solicitar pedidos
(7
clientes de 20 emitiram pedidos)
3.
Ponto de Reabastecimento do Estoque:
O objeto da classe Ingredients
possui um estado interno (sStock) que indica o número de pizzas que é
possível fazer com os ingredientes disponíveis. Na classe Supplier, a
função deliveryIngredients verifica o valor deste estado interno e caso
esteja abaixo deste nível reabastece a pizzaria. Com a mudança deste parâmetro
pode-se ajustar a freqüência de reabastecimento da pizzaria. Como em uma mesma
iteração apenas um dos agentes consegue acessar o estoque (Supplier ou Cooker),
uma freqüência de abastecimento muito alta pode causar o aumento na fila de
pizzas a serem fabricadas.

Reabastecimento
com estoque menor que 5

Reabastecimento
com estoque menor que 2
4.
Opções de Pizzas e Bebidas do Menu:
O objeto da classe Menu possui 2
estados internos (sPizzas e sDrinks) que são formados por vetores
de elementos da classe Pizza e Drink respectivamente. Quando um
objeto da classe Menu é inicializado ele adiciona as opções de pizzas e
bebidas que estarão disponíveis para o cliente. Na configuração atual, são oferecidas
as seguintes opções de pizza: 1 – Pepperoni, 2 – Muzzarela, 3 – Champignon, 4 –
Presunto e 5 – Alho e de bebida: 1 – Coke, 2 – Diet Coke, 3 – Pepsi, 4 – Diet Pepsi
e 5 – Cerveja.