Questão 6

Função para calcular o tempo médio de resposta (M/M/c)

Essa função calcula o tempo médio de resposta R em um sistema M/M/c. Primeiro, verifica se o sistema está estável (ρ < 1). Se não estiver, retorna Inf. Depois, aplica:

  • p_queue: probabilidade de haver espera

  • Wq: tempo médio na fila

  • R = 1/μ + Wq: tempo total de resposta (serviço + espera)

library(ggplot2)

calc_response_time <- function(lambda, mu, c) {
  rho <- lambda / (c * mu)
  if (rho >= 1) return(Inf)
  
  sum_term <- sum(sapply(0:(c-1), function(k) (lambda/mu)^k / factorial(k)))
  last_term <- ((lambda/mu)^c / factorial(c)) * (1 / (1 - rho))
  p_queue <- ((lambda/mu)^c / factorial(c)) * (1 / (1 - rho)) / (sum_term + last_term)
  Wq <- p_queue / (c * mu - lambda)
  R <- 1 / mu + Wq
  return(R)
}

Definição dos parâmetros

Define os 5 tipos de servidores, cada um com um valor de μ.

  • ρ = 0.97 é a condição dada pelo enunciado.

  • rmax_seq é o intervalo de tempos máximos de resposta que queremos avaliar.

mu_list <- c(10, 20, 30, 40, 45)
rho_target <- 0.97
rmax_seq <- seq(0.4, 1.4, by = 0.01)

Loop principal + Gráfico

Para cada servidor (μ) e cada Rmax, buscamos o menor c tal que o tempo de resposta seja menor ou igual a Rmax. Como λ = ρ * c * μ, o valor de λ depende do número de servidores. Assim que encontramos esse c, o loop interno é interrompido para eficiência. Os resultados são armazenados e enviados para construção do gráfico:

result <- data.frame()

for (i in 1:length(mu_list)) {
  mu <- mu_list[i]
  
  for (rmax in rmax_seq) {
    best_c <- NA
    for (c in 1:100) {
      lambda <- rho_target * c * mu
      R <- calc_response_time(lambda, mu, c)
      if (R <= rmax) {
        best_c <- c
        break
      }
    }
    result <- rbind(result, data.frame(
      Servidor = paste0("Servidor ", i, "\nμ=", mu),
      Rmax = rmax,
      Servidores_Necessarios = best_c
    ))
  }
}

ggplot(result, aes(x = Rmax, y = Servidores_Necessarios)) +
  geom_step(linewidth = 1, color = "#0072B2") +
  facet_wrap(~ Servidor, ncol = 3, scales = "free_y") +
  labs(
    title = "Mínimo de servidores em função de Rmax",
    x = "Tempo máximo de resposta",
    y = "Servidores necessários"
  ) +
  theme_minimal(base_size = 14)

Conclusão

À medida que μ aumenta, ou seja, o servidor é mais rápido, o gráfico tem:

  • Menos degraus

  • Degraus maiores

Vemos que, quando a taxa de serviço μ aumenta, o número mínimo de servidores necessários se torna menos sensível ao tempo máximo de resposta (Rmax)​. Isso ocorre porque servidores mais rápidos reduzem o tempo de atendimento individual, o que diminui a espera total no sistema. Matematicamente, como o tempo médio de resposta \(R=\frac{1}{\mu}+W_q\), um aumento em μ reduz a fração e também o tempo médio na fila Wq​, já que o sistema se aproxima mais rapidamente da estabilidade.