Especificaciones

Distribucion de llegadas

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

Distribucion de servicio

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

Calculo de la cola

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         8           8               4               8           12
## 2        15           7               3              15           18
## 3        16           1               4              18           22
## 4        17           1               2              22           24
## 5        22           5               3              24           27
## 6        24           2               3              27           30
## 7        29           5               3              30           33
## 8        35           6               1              35           36
## 9        38           3               4              38           42
## 10       41           3               3              42           45
## 11       47           6               2              47           49
## 12       49           2               1              49           50
## 13       56           7               4              56           60
## 14       57           1               3              60           63
## 15       64           7               2              64           66
## 16       72           8               2              72           74
## 17       77           5               3              77           80
## 18       79           2               3              80           83
## 19       83           4               3              83           86
## 20       90           7               6              90           96

Calculos de rendimiento de la cola

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] <- 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.1788   0.61245         1.303            3.1865
##   promedio_en_sis promedio_llegada
## 1          4.3653          4.48975

Conclusiones

De acuerdo a los datos de rendimiento, podemos ver que la cola se comporta de buena forma: