Simulação de Sistema de Fila

Marcos da Silva Medeiros

18 de fevereiro de 2023

Entendendo matematicamente o problema da fila, por meio de uma função exponencial

Podemos utilizar a distribuição exponencial para modelar o comportamento da fila em um sistema de atendimento. Seja \(\lambda\) a taxa de chegada de clientes ao sistema (em clientes por unidade de tempo) e \(\mu\) a taxa de atendimento dos atendentes (em clientes por unidade de tempo). Suponha que o tempo de serviço de cada cliente seja uma variável aleatória com distribuição exponencial de parâmetro \(\mu\).

A probabilidade de que um cliente chegue ao sistema em um intervalo de tempo \([t, t + \Delta t]\) é dada por:

\[P(\text{não chegou em [0,t]}) \cdot P(\text{chega em [t, t + }\Delta \text{t]}) = e^{-\lambda t} \cdot \lambda \Delta t\]

A probabilidade de que um cliente seja atendido em um intervalo de tempo \([t, t + \Delta t]\) é dada por:

\[P(\text{cliente em atendimento em t}) \cdot P(\text{tempo de serviço} \leq \Delta t) = (1 - e^{-\mu t}) \cdot (1 - e^{-\mu \Delta t})\]

Se considerarmos que os eventos de chegada e atendimento de clientes são independentes, a probabilidade de que um cliente chegue e seja atendido em um intervalo de tempo \([t, t + \Delta t]\) é dada pelo produto das duas probabilidades:

\[P(\text{cliente chega e é atendido em [t, t + }\Delta \text{t]}) = e^{-\lambda t} \cdot \lambda \Delta t \cdot (1 - e^{-\mu t}) \cdot (1 - e^{-\mu \Delta t})\]

A taxa de variação da fila ao longo do tempo é dada pela diferença entre a taxa de chegada de clientes e a taxa de atendimento dos atendentes. Assim, a taxa de variação da fila no instante \(t\) é dada por:

\[\lambda - \mu \cdot (1 - e^{-\mu t})\]

A função que modela o comportamento da fila ao longo do tempo é então dada pela integral dessa taxa de variação ao longo do tempo:

\[f(t) = \int_{0}^{t} (\lambda - \mu \cdot (1 - e^{-\mu s})) ds\]

\[f(t) = \lambda t - \frac{\mu}{2} t^2 + \frac{\mu}{\lambda} (1 - e^{-\lambda t})\]

Observe que essa função tem um componente linear, que representa o acúmulo de clientes na fila ao longo do tempo, e um componente exponencial, que representa a redução da fila à medida que os clientes são atendidos. A função pode ser utilizada para prever a evolução da fila em um sistema de atendimento em que os parâmetros \(\lambda\) e \(\mu\) sejam conhecidos.

Proposta de cenário de simulação

Iremos simular o comportamento geral do sistema em uma fila em uma repartição pública, usando a teoria das filas. Nessa teoria, usamos algumas métricas para avaliar o desempenho do sistema, como o tempo médio de espera na fila, o número médio de clientes na fila, a utilização do serviço e a probabilidade de não haver atendentes disponíveis. Consideraremos 4 horas de funcionamento ininterrupto, 3 atendentes disponíveis inicialmente, tempo médio de atendimento de 5 minutos para cada cliente e durante toda a simulação uma taxa de chegada de clientes de 1 cliente por minuto. Apresentaremos uma série temporal em R do número remanescente de clientes em espera na fila do início até o minuto 240, considerando as novas entradas de clientes, subtraindo as saídas do sistema após o atendimento. Consideraremos o intervalo entre a saída de um cliente e a chegada de um novo cliente no balcão livre desprezível. Também consideraremos que nenhum cliente desistirá da fila, levando em conta que o primeiro cliente chega no minuto 1 e é atendido imediatamente.

Para realizar a simulação, vamos seguir os seguintes passos:

  1. Definir as variáveis de entrada: taxa média de chegada de um cliente por minuto (\(\lambda = 1/1 = 1\)), número inicial de atendentes (\(s = 3\)), tempo médio de atendimento de cada cliente (\(\mu = 1/5 = 0.2\)) e tempo de operação do sistema (\(T = 4\) horas = \(240\) minutos).

  2. Calcular a taxa de serviço (\(\mu \cdot s = 0.2 \cdot 3 = 0.6\)). A taxa de serviço representa quantos clientes podem ser atendidos por minuto com a quantidade de atendentes disponíveis.

  3. Calcular a utilização do serviço (\(\rho = \lambda / \mu \cdot s = 1 / (0.2 \cdot 3) = 1/0.6 = 1.67\)). A utilização do serviço representa a fração do tempo em que os atendentes estão ocupados. Nesse caso, a utilização é maior que 1, o que indica que o sistema não será capaz de atender a todos os clientes que chegam.

  4. Definir a distribuição de chegada dos clientes e a distribuição de tempo de serviço. Vamos assumir que a chegada de clientes segue uma distribuição Poisson e que o tempo de serviço segue uma distribuição exponencial.

  5. Simular a fila utilizando apenas funções básicas do R.

  6. Analisar os resultados da simulação para oferecer melhorias ao sistema.

Simulação do cenário

library(kableExtra)
library(knitr)

# Definindo os parâmetros da simulação
tempo_simulacao <- 240
taxa_chegada <- 1
tempo_atendimento <- 5
num_atendentes <- 3

# Inicializando as variáveis
fila <- numeric(tempo_simulacao)
atendentes <- numeric(num_atendentes)
clientes_atendidos <- 0

# Simulação do modelo
for (t in 1:tempo_simulacao) {
    # Verifica se chegou um novo cliente
    if (t == 1) {
        fila[t] <- 0 # Não há cliente no minuto 0
    } else if (t == 2) {
        fila[t] <- 1 # O primeiro cliente chega e é atendido imediatamente
    } else if (runif(1) < taxa_chegada) {
        fila[t] <- fila[t-1] + 1 # Adiciona o novo cliente na fila
    } else {
        fila[t] <- fila[t-1]
    }
    
    # Verifica se algum atendente está livre
    for (i in 1:num_atendentes) {
        if (atendentes[i] > 0) {
            atendentes[i] <- atendentes[i] - 1 # O servidor i continua ocupado
        } else if (fila[t] > 0) {
            atendentes[i] <- tempo_atendimento - 1 # O servidor i começa a atender o cliente da fila
            fila[t] <- fila[t] - 1 # Remove o cliente da fila
            clientes_atendidos <- clientes_atendidos + 1
        }
    }
}

# Cálculo do tamanho da fila a cada minuto
queue_size <- fila

# Criação da tabela
results <- data.frame(
    minute = 0:(tempo_simulacao - 1),
    queue_size = queue_size
)

library(psych)
headtail(results)
##     minute queue_size
## 1        0          0
## 2        1          0
## 3        2          0
## 4        3          0
## ...    ...        ...
## 237    236         94
## 238    237         94
## 239    238         94
## 240    239         95

Visualizando graficamente o aumento da fila

library(ggplot2)

# criando o gráfico

ggplot(results, aes(x = minute, y = queue_size)) +
  geom_line(color = "#0072B2", size = 1.5) +
  labs(title = "Comportamento da fila de atendimento",
       x = "Minuto",
       y = "Fila") +
  theme_minimal() +
  theme(plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))

# plotando o gráfico dos 15 primeiros minutos

plot(results$minute[1:15], results$queue_size[1:15], 
     type = "l", col = "#0072B2", lwd = 2, 
     xlab = "Minuto", ylab = "Fila",
     main = "Comportamento da fila de atendimento (primeiros 15 minutos)")

Conclusões

Com base na simulação proposta, é possível concluir que a repartição pública apresenta um problema de atendimento aos seus clientes, uma vez que a fila de espera chegou a ter 95 pessoas ao final dos 240 minutos da simulação (ou 96, a depender do minuto de chegada do primeiro cliente; consideramos o primeiro minuto de funcionamento sem a chegada de nenhum cliente), numa demanda total de 240 clientes no período de funcionamento. A utilização de três atendentes, com um tempo de atendimento constante de 5 minutos, não foi suficiente para suprir a demanda de um cliente por minuto pelo período de funcionamento de 4 horas.

Algumas sugestões de solução seriam, por exemplo, aumentar o número de atendentes, reduzir o tempo de atendimento por cliente ou ainda adotar um sistema de agendamento de atendimento prévio para evitar a formação de filas. Além disso, é importante avaliar a eficiência do processo de atendimento e buscar formas de otimizar o fluxo de trabalho dos funcionários.

A simulação mostra que a repartição precisa tomar medidas para melhorar o atendimento aos seus clientes, de forma a evitar longas filas de espera e garantir uma experiência satisfatória para os usuários do serviço.