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:
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).
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.
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.
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.
Simular a fila utilizando apenas funções básicas do R.
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.