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         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

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] <- 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

Conclusiones

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