Conceptos básicos

Una cola se define como el número de clientes en espera de obtener un servicio. Supondremos que los clientes tienen tiempos de interarribos los cuales siguen una distribución definida sobre \(\mathbb{[0,\infty)}\), y los tiempos de servicio de cada cliente se distribuyen idénticamente por cliente y de manera independiente entre ellos. Los sistemas FIFO (first in-first out) con un servidor, corresponden a los sistemas más sencillos de filas que podemos simular. En estos, el primero en llegar, será el primero en ser atendido y la fila se organiza por orden creciente de la hora de llegada. En el estudio de las colas, líneas o filas de espera, es de interés práctico conocer las siguientes variables aleatorias:
  1. Número de Cliente (NC).
  2. Tiempo de Interarribos de Clientes (TIC).
  3. Hora de Llegada (HL), definida como la suma acumulada de los tiempos de interarribos de los clientes.
  4. Clientes en Espera (CE), definido como el número de clientes que estan en la FILA al momento de la llegada de un nuevo cliente.
  5. Tiempo de Espera (TE), definido como la hora a la que inicia el servicio, menos la Hora de Llegada.
  6. Hora de Inicio (HI), definido como el máximo entre la hora de llegada del cliente \(i\) y la hora de salida del cliente \(i-1\).
  7. Tiempo de Servicio (TS), correspondiente al tiempo que tarda el servidor en atender a un cliente.
  8. Hora de Salida (HS), definida como HI+TS.
  9. Tiempo Total de Atención (TTA), definido como TE+TS.

Ejemplo: simulación sistema FIFO con un único servidor

Primero simularemos las llegadas de todos los clientes que serán atendidos durante una jornada de 8h (480 min) a un centro de atención con un único servidor. Supondremos que los tiempos de interarribos son exponenciales de parámetro \(\lambda\), el cual podremos ajustar a nuestro gusto en el código. Este tiempo esta medido en minutos.
rm(list=ls())
set.seed(1987)
lambda                = 1/5
i                     = 1
t_inter_clientes      = rep(0)
while (sum(t_inter_clientes)<=8*60) {
      t_inter_clientes[i] = rexp(1,lambda)
      i                   = i+1
      }
n                     = i-2                # restamos 2 porque 
# asi obtenemos todos los clientes que llegaron antes de cerrar el servicio (antes de 8*60=480 min)
clientes              = 1:n                # NC para cada cliente: 1,2,3,...,n
# Si digitan sum(t_inter_clientes[1:n]) obtendran la hora de llegada del
# ultimo cliente
Supondremos también que el tiempo de servicio por cliente sigue una distribución uniforme \(\mathcal{U}[x_{\min},x_{max}]\) de parámetros ajustables \(x_{\min}\) y \(x_{\max}\), medido en minutos. Definimos los valores para el primer cliente.
xmin                = 10
xmax                = 15
t_servicio          = runif(n,xmin,xmax)                  # TS
t_inter_clientes    = t_inter_clientes[1:n]               # TIC
h_llega_clientes    = cumsum(t_inter_clientes)            # HL
h_inicio            = rep(0)
h_inicio[1]         = h_llega_clientes[1]                 # HI del cliente 1
h_salida            = rep(0)
h_salida[1]         = h_llega_clientes[1]+t_servicio[1]   # HS=HL+TS del cliente 1, o equivalentemente, HS=HI+TS solo para el cliente 1
t_espera            = rep(0)
t_espera[1]         = h_inicio[1]-h_llega_clientes[1]     # TE=HI-HL del cliente 1
t_total_atencion    = rep(0)
t_total_atencion[1] = t_espera[1]+t_servicio[1]           # TTA=TE+TS del cliente 1
Una vez atendido el cliente \(1\), para los siguientes clientes, definimos las variables de interés para cada cliente \(l\geq 2\). Observa que el número de clientes se modela de la siguiente forma: si el cliente \(l\) llega después de, o inmediatamente en la hora de salida del cliente \(l-1\), entonces su tiempo de espera es \(0\); en caso contrario, habra que restar al número del cliente \(l\), el único cliente que está siendo atendido entre los \(l-1\) clientes anteriores, y también restar todos los demás clientes que ya fueron atendidos (es decir, también restar todos los clientes cuya HS es inferior a la HL del cliente \(l\)).
for (i in 2:n) {
    h_inicio[i]          = max(h_llega_clientes[i],h_salida[i-1])
    # En efecto, si el cliente i llega antes de la hora de salida 
    # del cliente i-1, entonces la hora de inicio del cliente i sera
    # hora de salida del cliente i-1. Ahora bien, si el cliente i llega
    # despues de la hora de salida del cliente i-1, entonces la hora
    # de inicio del cliente i sera la hora de llegada del cliente i
    h_salida[i]          = h_inicio[i]+t_servicio[i]
    t_espera[i]          = h_inicio[i]-h_llega_clientes[i]
    t_total_atencion[i]  = t_espera[i]+t_servicio[i] 
    }
# Redondeamos los tiempos a dos decimales para hacer mas 
# agradable la presentacion de los datos

t_inter_clientes = round(t_inter_clientes,2)
h_llega_clientes = round(h_llega_clientes,2)
t_espera         = round(t_espera,2)
h_inicio         = round(h_inicio,2)
t_servicio       = round(t_servicio,2)
h_salida         = round(h_salida,2)
t_total_atencion = round(t_total_atencion,2)
clientesespera   = rep(0)                    # LLenamos al vector CE

for (l in 2:n) {
    if (h_llega_clientes[l]>=h_salida[l-1]) {
       clientesespera[l] = 0   
    }else{
       clientesespera[l] =l-1-sum(h_salida[1:l]<h_llega_clientes[l])
    }
}
# Esta es la forma de hacer un ifelse cuando dentro del mismo, definimos
# mas variables. Esta forma del if else es mas general que la forma
# ifelse(si_condicion,entonces, si_no)
Finalmente, resumimos la información en una tabla y cambiamos los nombres de las columnas en términos de sus abreviaciones.
tabla = cbind(clientes,
              t_inter_clientes,
              h_llega_clientes,
              clientesespera,
              t_espera,
              h_inicio,
              t_servicio,
              h_salida,
              t_total_atencion
              )
colnames(tabla) = c("NC","TIC","HL","CE","TE","HI","TS","HS","TTA")
# Simplemente colocando tabla, se muestra en pantalla 
# la tabla completa. Con el comando head podemos 
# indicar hasta que fila mostrar (ya que la fila de 
# clientes puede ser demasiado larga)
head(tabla,10) 
##       NC   TIC    HL CE    TE     HI    TS     HS   TTA
##  [1,]  1 13.30 13.30  0  0.00  13.30 11.29  24.59 11.29
##  [2,]  2  3.05 16.35  1  8.24  24.59 12.36  36.95 20.60
##  [3,]  3  1.08 17.42  2 19.52  36.95 12.82  49.76 32.34
##  [4,]  4  6.12 23.55  3 26.22  49.76 12.03  61.80 38.25
##  [5,]  5  0.81 24.35  4 37.44  61.80 14.89  76.69 52.34
##  [6,]  6  5.38 29.73  4 46.96  76.69 13.27  89.96 60.23
##  [7,]  7  1.06 30.79  5 59.17  89.96 14.49 104.46 73.67
##  [8,]  8  2.44 33.23  6 71.23 104.46 11.23 115.69 82.46
##  [9,]  9  2.18 35.41  7 80.28 115.69 13.49 129.19 93.77
## [10,] 10  9.06 44.47  7 84.72 129.19 13.76 142.94 98.47
tabla
##       NC   TIC     HL CE     TE      HI    TS      HS    TTA
##  [1,]  1 13.30  13.30  0   0.00   13.30 11.29   24.59  11.29
##  [2,]  2  3.05  16.35  1   8.24   24.59 12.36   36.95  20.60
##  [3,]  3  1.08  17.42  2  19.52   36.95 12.82   49.76  32.34
##  [4,]  4  6.12  23.55  3  26.22   49.76 12.03   61.80  38.25
##  [5,]  5  0.81  24.35  4  37.44   61.80 14.89   76.69  52.34
##  [6,]  6  5.38  29.73  4  46.96   76.69 13.27   89.96  60.23
##  [7,]  7  1.06  30.79  5  59.17   89.96 14.49  104.46  73.67
##  [8,]  8  2.44  33.23  6  71.23  104.46 11.23  115.69  82.46
##  [9,]  9  2.18  35.41  7  80.28  115.69 13.49  129.19  93.77
## [10,] 10  9.06  44.47  7  84.72  129.19 13.76  142.94  98.47
## [11,] 11  4.41  48.87  8  94.07  142.94 10.43  153.37 104.50
## [12,] 12  3.94  52.82  8 100.56  153.37 10.37  163.74 110.92
## [13,] 13  3.18  56.00  9 107.74  163.74 13.48  177.22 121.22
## [14,] 14  6.07  62.06  9 115.16  177.22 10.75  187.97 125.91
## [15,] 15  4.57  66.63 10 121.34  187.97 10.61  198.59 131.96
## [16,] 16 24.14  90.77  9 107.82  198.59 10.28  208.86 118.09
## [17,] 17  0.42  91.19 10 117.67  208.86 14.50  223.36 132.17
## [18,] 18  0.52  91.71 11 131.65  223.36 10.84  234.20 142.50
## [19,] 19  3.61  95.32 12 138.88  234.20 11.76  245.96 150.64
## [20,] 20  1.00  96.32 13 149.64  245.96 11.37  257.33 161.01
## [21,] 21  2.17  98.48 14 158.84  257.33 10.60  267.92 169.44
## [22,] 22  9.89 108.38 14 159.55  267.92 14.11  282.03 173.66
## [23,] 23  4.86 113.24 15 168.79  282.03 10.64  292.67 179.43
## [24,] 24  5.03 118.27 15 174.39  292.67 11.86  304.52 186.25
## [25,] 25  5.65 123.92 16 180.60  304.52 11.42  315.94 192.02
## [26,] 26  2.87 126.79 17 189.15  315.94 11.11  327.05 200.26
## [27,] 27  4.11 130.90 17 196.16  327.05 13.34  340.39 209.49
## [28,] 28  2.38 133.28 18 207.11  340.39 14.13  354.52 221.24
## [29,] 29  5.56 138.84 19 215.68  354.52 12.90  367.42 228.59
## [30,] 30  4.00 142.83 20 224.59  367.42 12.38  379.80 236.97
## [31,] 31  8.72 151.56 20 228.25  379.80 13.96  393.76 242.20
## [32,] 32  4.73 156.29 20 237.47  393.76 11.29  405.05 248.76
## [33,] 33  3.66 159.95 21 245.10  405.05 12.59  417.64 257.69
## [34,] 34  4.70 164.65 21 252.99  417.64 12.27  429.90 265.26
## [35,] 35  8.92 173.56 22 256.34  429.90 11.51  441.41 267.84
## [36,] 36  9.74 183.30 22 258.11  441.41 10.67  452.08 268.78
## [37,] 37 20.29 203.59 21 248.49  452.08 13.35  465.43 261.84
## [38,] 38  9.16 212.76 21 252.68  465.43 10.42  475.86 263.10
## [39,] 39  2.54 215.30 22 260.56  475.86 13.44  489.30 274.00
## [40,] 40  6.70 221.99 23 267.30  489.30 11.68  500.97 278.98
## [41,] 41 25.60 247.59 21 253.38  500.97 11.04  512.01 264.42
## [42,] 42  0.92 248.51 22 263.50  512.01 11.57  523.58 275.08
## [43,] 43  1.96 250.47 23 273.11  523.58 10.03  533.61 283.14
## [44,] 44  3.55 254.01 24 279.60  533.61 12.96  546.57 292.55
## [45,] 45  5.92 259.94 24 286.63  546.57 11.88  558.45 298.51
## [46,] 46  3.75 263.69 25 294.76  558.45 14.22  572.67 308.98
## [47,] 47  1.21 264.90 26 307.77  572.67 11.08  583.76 318.86
## [48,] 48  0.26 265.16 27 318.60  583.76 14.81  598.56 333.40
## [49,] 49  7.10 272.26 27 326.30  598.56 11.33  609.89 337.63
## [50,] 50  0.37 272.64 28 337.26  609.89 13.10  622.99 350.36
## [51,] 51  0.86 273.49 29 349.50  622.99 13.62  636.61 363.12
## [52,] 52  0.45 273.95 30 362.66  636.61 10.04  646.65 372.71
## [53,] 53  5.02 278.97 31 367.68  646.65 11.98  658.63 379.66
## [54,] 54  1.25 280.23 32 378.41  658.63 10.54  669.17 388.94
## [55,] 55  2.20 282.42 32 386.75  669.17 12.23  681.40 398.98
## [56,] 56 12.76 295.18 32 386.22  681.40 12.13  693.54 398.36
## [57,] 57  0.94 296.12 33 397.41  693.54 13.41  706.95 410.83
## [58,] 58  2.58 298.71 34 408.24  706.95 10.12  717.07 418.36
## [59,] 59  2.97 301.68 35 415.38  717.07 10.15  727.22 425.53
## [60,] 60  2.47 304.15 36 423.07  727.22 11.95  739.17 435.02
## [61,] 61  1.54 305.69 36 433.47  739.17 10.39  749.56 443.86
## [62,] 62  5.54 311.23 37 438.33  749.56 11.86  761.42 450.19
## [63,] 63  6.47 317.70 37 443.72  761.42 14.48  775.90 458.20
## [64,] 64  0.39 318.09 38 457.81  775.90 10.59  786.49 468.41
## [65,] 65  8.24 326.33 39 460.17  786.49 11.02  797.52 471.19
## [66,] 66  9.07 335.40 39 462.12  797.52 10.25  807.77 472.37
## [67,] 67 12.94 348.34 39 459.43  807.77 12.63  820.40 472.06
## [68,] 68 10.60 358.94 39 461.46  820.40 11.50  831.90 472.96
## [69,] 69  5.68 364.62 40 467.28  831.90 13.94  845.84 481.22
## [70,] 70  4.75 369.37 40 476.47  845.84 14.32  860.15 490.79
## [71,] 71  9.60 378.97 41 481.18  860.15 12.84  872.99 494.02
## [72,] 72  2.96 381.93 41 491.06  872.99 14.83  887.82 505.89
## [73,] 73  0.33 382.26 42 505.56  887.82 13.86  901.68 519.42
## [74,] 74  2.01 384.27 43 517.41  901.68 12.29  913.97 529.70
## [75,] 75 13.26 397.53 43 516.44  913.97 14.19  928.16 530.63
## [76,] 76 19.87 417.40 43 510.76  928.16 10.70  938.86 521.46
## [77,] 77 12.54 429.93 42 508.93  938.86 13.19  952.05 522.12
## [78,] 78  3.63 433.57 43 518.48  952.05 10.57  962.62 529.06
## [79,] 79  7.07 440.64 44 521.99  962.62 12.62  975.24 534.61
## [80,] 80  5.78 446.41 44 528.83  975.24 12.28  987.52 541.11
## [81,] 81  6.70 453.12 44 534.41  987.52 10.58  998.10 544.99
## [82,] 82  7.80 460.91 45 537.19  998.10 14.96 1013.07 552.15
## [83,] 83  2.34 463.25 46 549.81 1013.07 10.26 1023.33 560.08
## [84,] 84  9.76 473.01 46 550.32 1023.33 11.90 1035.23 562.22
## [85,] 85  3.89 476.91 46 558.33 1035.23 14.33 1049.56 572.66

Análisis estadístico

Podemos ver a partir de la tabla anterior, cómo se distribuyen de manera independiente tanto el Tiempo de Espera (TE) así como el Tiempo Total de Atención (TTA). Primero, un resumen de dichas variables para el día simulado.
summary(tabla[,c(5,9)])
##        TE             TTA        
##  Min.   :  0.0   Min.   : 11.29  
##  1st Qu.:159.6   1st Qu.:173.66  
##  Median :273.1   Median :283.14  
##  Mean   :296.6   Mean   :308.75  
##  3rd Qu.:457.8   3rd Qu.:468.41  
##  Max.   :558.3   Max.   :572.66
# Si digitan summary(tabla[,5]) y summary(tabla[,9]) obtendran
# los resumenes separados de las columnas 5 y 9, que son las que 
# contienen las variables de interes TE y TTA, respectivamente.
# Los resumenes son de utilidad porque muestran los estadisticos
# del boxplot (tambien llamado diagrama de cajas y bigotes).
# Pueden digitar hist(tabla[,5]) y boxplot(tabla[,5]) para obtener 
# por separado tanto el histograma como el diagrama de cajas y bigotes
# de la variable TE (columna 5 de la tabla)
A continuación vemos los histogramas y boxplots (usando la libreria packHV, la cual permite poner en una misma gráfica tanto histogramas como boxplots). Recuerda que primero se debe instalar dicha librería.
library(packHV)
## Loading required package: survival
par(mfrow=c(1,2))
hist_boxplot(tabla[,5],
             freq = F, # esto es para que el hitograma quede normalizado 
             # y tenga area 1.
             main="Tiempo de Espera del dia",
             xlab="Datos TE",
            ylab="Densidad")
lines(density(tabla[,5])) # con esta linea agregamos una densidad 
# teorica, la cual se obtiene a partir de los datos mediante un 
# metodo de interpolacion. 

hist_boxplot(tabla[,9],
             freq = F,
             main="Tiempo Total de Atencion del dia",
             xlab="Datos TTA",
            ylab="Densidad")
lines(density(tabla[,9]))