Skip to content

Seu primeiro modelo ​

Vamos modelar uma fila com um atendente — um caixa de mercado, um guichê, um servidor web. É o modelo mais simples que ainda ensina tudo: como representar o que espera, o que atende, e quanto cada coisa demora.

Ao final você vai ter quatro números sobre o sistema, e vai saber conferir se estão certos.

O sistema ​

Clientes chegam de tempos em tempos. Se o atendente estiver livre, são atendidos na hora; se não, esperam na fila. O atendimento leva um tempo, e ao terminar o atendente fica livre para o próximo.

Três perguntas que queremos responder:

  • Quantos clientes ficam esperando, em média?
  • Quanto o atendente trabalha, em porcentagem do tempo?
  • Quantos clientes o sistema conclui por minuto?

As peças ​

Um modelo tem lugares (círculos), que guardam fichas, e transições (retângulos), que movem fichas de um lugar para outro. Aqui, cada ficha é um cliente.

LugarO que representa
Filaclientes esperando
Atendenteo atendente, quando está livre
EmAtendimentoo cliente que está sendo atendido agora
TransiçãoO que fazTempo
Chegadacria um cliente novo na Fila10 min entre chegadas, em média
Iniciotira um cliente da fila e ocupa o atendenteinstantânea
Fimconclui o atendimento e libera o atendente5 min, em média

Repare em duas coisas.

Chegada não tem entrada. Ela só produz. É assim que se representa algo que vem de fora do sistema.

Inicio é instantânea. Pegar o próximo da fila não demora — o que demora é atender, e isso está no Fim. Separar as duas coisas é o que permite medir a ocupação do atendente: enquanto a ficha está em EmAtendimento, ele está ocupado.

Montando o modelo ​

Você tem dois caminhos. Importar o modelo pronto leva um minuto e deixa você direto na parte de rodar e interpretar — é o que sugerimos na primeira vez. Desenhar do zero ensina a mexer no editor, e as páginas de Modelar cobrem isso peça por peça.

Caminho rápido: importar ​

  1. Na tela inicial, clique em Novo Projeto e dê um nome (por exemplo, Fila com um atendente).
  2. No editor, abra o menu Arquivo → Importar (Local).
  3. Baixe o modelo de exemplo e escolha o arquivo fila.json salvo na sua máquina.

O conteúdo do arquivo é este:

json
{
  "modelName": "Fila com um atendente",
  "timeUnit": "min",
  "definitions": [
    { "name": "TEMPO_ENTRE_CHEGADAS", "type": "DOUBLE", "value": "10" },
    { "name": "TEMPO_DE_ATENDIMENTO", "type": "DOUBLE", "value": "5" },
    { "name": "ATENDENTES", "type": "INTEGER", "value": "1" }
  ],
  "places": [
    { "name": "Fila",          "initialMarking": 0, "stringMarking": "0",          "initialStringMarking": "0" },
    { "name": "Atendente",     "initialMarking": 1, "stringMarking": "ATENDENTES", "initialStringMarking": "ATENDENTES" },
    { "name": "EmAtendimento", "initialMarking": 0, "stringMarking": "0",          "initialStringMarking": "0" }
  ],
  "rewardMeasures": [
    { "name": "fila_media",   "expression": "E{#Fila}" },
    { "name": "ocupacao_pct", "expression": "(E{#EmAtendimento} / ATENDENTES) * 100" },
    { "name": "vazao",        "expression": "E{#EmAtendimento} / TEMPO_DE_ATENDIMENTO" },
    { "name": "no_sistema",   "expression": "E{#Fila} + E{#EmAtendimento}" }
  ],
  "transitions": [
    { "name": "Chegada", "type": "TIMED", "firingPolicy": "SINGLE_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY", "priority": 1,
      "distribution": { "type": "exponential", "parameters": { "Mean delay": "TEMPO_ENTRE_CHEGADAS" } },
      "inputArcs": [],
      "outputArcs": [{ "type": "OUTPUT", "place": "Fila", "multiplicity": 1 }],
      "inhibitorArcs": [] },

    { "name": "Inicio", "type": "IMMEDIATE", "firingPolicy": "SINGLE_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY", "priority": 1, "weight": 1,
      "inputArcs":  [{ "type": "INPUT", "place": "Fila", "multiplicity": 1 },
                     { "type": "INPUT", "place": "Atendente", "multiplicity": 1 }],
      "outputArcs": [{ "type": "OUTPUT", "place": "EmAtendimento", "multiplicity": 1 }],
      "inhibitorArcs": [] },

    { "name": "Fim", "type": "TIMED", "firingPolicy": "INFINITY_SERVER",
      "raceType": "RACE_WITH_ENABLING_MEMORY", "priority": 1,
      "distribution": { "type": "exponential", "parameters": { "Mean delay": "TEMPO_DE_ATENDIMENTO" } },
      "inputArcs":  [{ "type": "INPUT",  "place": "EmAtendimento", "multiplicity": 1 }],
      "outputArcs": [{ "type": "OUTPUT", "place": "Atendente",     "multiplicity": 1 }],
      "inhibitorArcs": [] }
  ]
}

Os elementos aparecem no quadro, e o painel da direita já mostra os três parâmetros e as quatro métricas do modelo:

O modelo importado no editor

O desenho não vem no arquivo

Este JSON descreve a rede, não o desenho — ele não tem posições. Ao importar, a ferramenta distribui os elementos da esquerda para a direita seguindo os arcos. Arraste o que quiser reposicionar; a posição é salva junto do projeto.

Caminho longo: desenhar ​

Na barra de ferramentas à esquerda, escolha Lugar e clique no quadro para criar Fila, Atendente e EmAtendimento. Depois escolha Trans. Exponencial para Chegada e Fim, e Trans. Imediata para Inicio. Com a ferramenta Arco, clique na origem e depois no destino para ligar cada par, seguindo as tabelas acima.

Clicando num elemento, o painel da direita mostra as propriedades dele — é ali que se dá o nome e o tempo. Os parâmetros e as métricas se declaram nas seções Parâmetros e Métricas do mesmo painel, cada uma com o botão +.

Os números aparecem por parâmetro ​

Repare que os tempos não estão escritos direto nas transições — estão em parâmetros: TEMPO_ENTRE_CHEGADAS, TEMPO_DE_ATENDIMENTO e ATENDENTES.

Vale sempre fazer assim. Com o número num parâmetro, você muda num lugar só, e depois consegue pedir à ferramenta que varie aquele valor automaticamente para comparar cenários.

As métricas ​

Quatro perguntas viraram quatro métricas:

MétricaExpressãoResponde
fila_mediaE{#Fila}quantos esperam, em média
ocupacao_pct(E{#EmAtendimento} / ATENDENTES) * 100quanto o atendente trabalha
vazaoE{#EmAtendimento} / TEMPO_DE_ATENDIMENTOclientes concluídos por minuto
no_sistemaE{#Fila} + E{#EmAtendimento}quantos estão no sistema, esperando ou sendo atendidos

E{ } quer dizer "a média de". A página Médias e probabilidades explica em detalhe.

Elas ficam na seção Métricas do painel da direita — se você importou o modelo, já estão lá:

Parâmetros e métricas no painel da direita

Executando ​

Clique em Simular, no rodapé do painel da direita. Abre a configuração da execução:

O modal de configuração da execução

Dois campos importam agora:

  • Tipo de Execução: escolha Simulação Estacionária — é a que responde "como o sistema se comporta em regime normal".
  • Tempo de Simulação: troque para 500000. Isso dá margem confortável para os números assentarem.

O resto pode ficar no padrão. Clique em Simular no rodapé do modal e espere — leva alguns segundos.

Terminado, clique em Analisar para ver os resultados. A aba Resultados traz o gráfico e, abaixo dele, os valores finais de cada métrica:

A tela de análise com os resultados

Conferindo o resultado ​

Esta é a melhor parte de começar por um modelo simples: dá para saber a resposta antes de rodar.

O atendimento leva 5 minutos e chega um cliente a cada 10. Ou seja, o atendente tem trabalho para metade do tempo:

MétricaO que a teoria dizO que a ferramenta dá
ocupacao_pct50%50,01
vazao0,1 cliente por minuto0,1000
fila_media0,5 cliente0,5011
no_sistema1,0 cliente1,0012

Por que 0,5 na fila se o atendente só trabalha metade do tempo?

Porque as chegadas não são regulares. Às vezes dois clientes chegam quase juntos e o segundo espera, mesmo que na média sobre folga. É exatamente esse efeito que um modelo estocástico captura e uma conta de média simples não captura.

Experimente mudar ​

Volte ao editor (botão Voltar, no topo), mexa num parâmetro de cada vez na seção Parâmetros e rode de novo:

MudançaOcupaçãoFila média
nada (referência)50,0%0,50
TEMPO_DE_ATENDIMENTO para 990,1%8,12
ATENDENTES para 225,0%0,03

Dobrar o tempo de atendimento multiplicou a fila por 16. Sistemas perto da saturação degradam muito rápido, e nada proporcionalmente — é o principal motivo para modelar em vez de estimar de cabeça.

Já dois atendentes praticamente eliminam a espera. Repare que a transição Fim precisa estar configurada para atender vários em paralelo, senão o segundo atendente não muda nada — é um engano comum, e a página Quantos em paralelo explica.

O caso em que não existe resposta ​

Coloque TEMPO_ENTRE_CHEGADAS em 5. Agora chega um cliente a cada 5 minutos e cada atendimento leva 5: a demanda iguala a capacidade.

Rode duas vezes, mudando o Tempo de Simulação na configuração da execução (o botão Simular, ou a engrenagem no topo da tela de análise):

Tempo de simulaçãoFila média
20.00045,6
80.00091,4

O número dobrou quando o tempo dobrou. Isso não é imprecisão da simulação: é o modelo dizendo que não existe equilíbrio. A fila cresce para sempre, e não há valor médio para ela convergir.

Como reconhecer

Se um resultado muda muito ao aumentar o tempo de simulação, desconfie de saturação antes de desconfiar da ferramenta. Rode de novo com o dobro do tempo: se o número acompanhar, o sistema está sobrecarregado.

Próximos passos ​