| Tiempo entre llegadas | Probabilidad | Probabilidad acumulada |
|---|---|---|
| 1 | 0.125 | 0.125 |
| 2 | 0.125 | 0.250 |
| 3 | 0.125 | 0.375 |
| 4 | 0.125 | 0.500 |
| 5 | 0.125 | 0.625 |
| 6 | 0.125 | 0.750 |
| 7 | 0.125 | 0.875 |
| 8 | 0.125 | 1.000 |
| Tiempo de servicio | Probabilidad | Probabilidad acumulada |
|---|---|---|
| 1 | 0.100 | 0.100 |
| 2 | 0.200 | 0.300 |
| 3 | 0.300 | 0.600 |
| 4 | 0.250 | 0.850 |
| 5 | 0.100 | 0.950 |
| 6 | 0.050 | 1.000 |
La solucion tiene dos partes: (1) El calculo de la cola para 20 usuarios y (2) Los datos de rendimiento de la cola: Tiempos promedio y probabilidades de espera.
Para la primera parte desarrollamos una funcion que recibe como parametro el numero de clientes y devuelve la cola para el numero de clientes:
queue_simulator <- function(N=20) {
c <- 0
# Interarrival times
interarrival_prob <- rep(0.125,8)
inter_times <- c(1,2,3,4,5,6,7,8)
interarrival_times <- sample(inter_times,N,replace = T,prob = interarrival_prob)
arrival_times <- cumsum(interarrival_times)
# Service times
sprob <- c(0.10,0.20,0.30,0.25,0.10,0.05)
serv_t <- c(1,2,3,4,5,6)
service_times <- sample(serv_t,N,replace = T,prob = sprob)
# vectors to track service time and departure
enter_service_times <- rep(0,N)
completion_times <- rep(0,N)
idle_time_server <- rep(0,N)
# first customer
enter_service_times[1] <- arrival_times[1]
completion_times[1] <- enter_service_times[1]+service_times[1]
# Loop through the remaining customers
for (i in 2:N) {
enter_service_times[i] <- max(arrival_times[i],completion_times[i-1])
completion_times[i] <- enter_service_times[i]+service_times[i]
}
waiting_time_q <- enter_service_times - arrival_times
total_time <- completion_times - arrival_times
df <- data.frame(llegadas=arrival_times,interarribo=interarrival_times,tiempo_servicio=service_times,inicio_servicio=enter_service_times,finalizacion=completion_times)
return(df)
}
queue_simulator()
## llegadas interarribo tiempo_servicio inicio_servicio finalizacion
## 1 6 6 2 6 8
## 2 13 7 3 13 16
## 3 20 7 2 20 22
## 4 28 8 1 28 29
## 5 29 1 2 29 31
## 6 37 8 5 37 42
## 7 45 8 2 45 47
## 8 47 2 5 47 52
## 9 54 7 3 54 57
## 10 56 2 4 57 61
## 11 63 7 4 63 67
## 12 68 5 3 68 71
## 13 75 7 2 75 77
## 14 77 2 3 77 80
## 15 83 6 4 83 87
## 16 90 7 1 90 91
## 17 92 2 3 92 95
## 18 97 5 2 97 99
## 19 99 2 5 99 104
## 20 107 8 4 107 111
Para los calculos de rendimiento de la cola usamos el metodo Montecarlo. Usamos la funcion anterior y a partir de los datos de la cola de 20 clientes corremos la simulacion 1,000 veces.
Las variables que se calculan son:
* Tiempo promedio de espera en la cola: promedio_espera
* Probabilidad de que un cliente tenga que hacer cola: prob_cola
* Tiempo que pasa el servidor desocupado: servidor_idle
* Tiempo promedio de servicio: promedio_servicio
* Tiempo promedio que pasa un cliente en el sistema: promedio_en_sis
* Tiempo promedio de llegada: promedio_llegada
M <- 1000
w_bar <- rep(0,M)
t_bar <- rep(0,M)
s_bar <- rep(0,M)
i_bar <- rep(0,M)
idle_bar <- rep(0,M)
prob_queue <- rep(0,M)
for (l in 1:M) {
# Initialize
N <- 20
c <- 0
idle_time_server <- rep(0,N) # Vector de tiempo desocupado
# Queue for 20 clients
x <- queue_simulator()
waiting_time_q <- x$inicio_servicio-x$llegadas
total_time <- x$finalizacion-x$llegadas
service_times <- x$tiempo_servicio
interarrival_times <- x$interarribo
arrival_times <- x$llegadas
completion_times <- x$finalizacion
enter_service_times <- x$inicio_servicio
# Performance Calculations
w_bar[l] <- mean(waiting_time_q) # tiempo promedio de espera en la cola
t_bar[l] <- mean (total_time) # tiempo promedio en el sistema
s_bar[l] <- mean(service_times) # tiempro promedio de servicio
i_bar[l] <- mean(interarrival_times) # tiempo promedio de arribo
for (j in 2:N) {
idle_time_server[j] <- arrival_times[j]-completion_times[j-1]
if (idle_time_server[j] >= 0) {
idle_time_server[j] <- idle_time_server[j]
} else {idle_time_server[j] <- 0}
}
idle_bar[l] <- mean(idle_time_server)
for (k in 1:N) {
if (arrival_times[k] == enter_service_times[k]) {c <- c + 1}
}
prob_queue[l] <- 1-(c/N)
}
W <- mean(w_bar)
Tot_time <- mean(t_bar)
S <- mean(s_bar)
I <- mean(i_bar)
Id <- mean(idle_bar)
P <- mean(prob_queue)
df2 <- data.frame(promedio_espera=W,prob_cola=P,servidor_idle=Id,promedio_servicio=S,promedio_en_sis=Tot_time,promedio_llegada=I)
df2
## promedio_espera prob_cola servidor_idle promedio_servicio
## 1 1.1579 0.3827 1.31085 3.2024
## promedio_en_sis promedio_llegada
## 1 4.3603 4.51055
De acuerdo a los datos de rendimiento, podemos ver que la cola se comporta de buena forma: