Simulación de sistemas M/M/1 sist_len = function(a.acum, s.acum) { Funciones: sólo se i = 1 n = length(a.acum) ejecutan la primera vez. while (i<=n & a.acum[i] < s.acum) i=i+1 return (i-1) } que_len = function(s.acum, a.acum) { j = length(s.acum) loop = 1 while (j>=1 & loop) {loop = s.acum[j] > a.acum; j=j-1} return (ifelse(j==0, 1, j+2)) } cronograma = function(a.acum, s.acum, ini=1, fi=20) { rng = ini:fi lab = paste("Arrivals from", ini, "to", fi) plot(c(a.acum[ini], s.acum[fi]), c(0,1), t="n", xlab="", ylab="", main=lab) segments(a.acum[rng], 0.4, s.acum[rng], 0.6, lty=2) rug(a.acum[rng], tick=0.4, col="red") rug(s.acum[rng], tick=0.4, col="blue", side=3) } Parámetros que se pueden N = 1000 modificar en cada simulación. ta = 0.5 ts = 0.6 N: número de simulaciones; ro = ta/ts ta: tasa de llegadas; Arrivals = rexp(N, ta) ts: tasa de servicio. Services = rexp(N, ts) A.acum = cumsum(Arrivals) S.acum = array(0, dim=N+1) for (i in 1:N) S.acum[i+1] = max(A.acum[i], S.acum[i]) + Services[i] S.acum = S.acum[2:(N+1)] # Al salir cada cliente, cuántos quedan en el sistema Sys = array(0, N) for (i in 1:(N-1)) { Sys[i] = sist_len(A.acum[(i+1):N], S.acum[i]) } Cola = array(0, N) # Al llegar cada cliente, cuántos hay en la cola for (i in 2:N) { j = que_len(S.acum[1:(i-1)], A.acum[i]) Cola[i] = max(0, i-j-1) } P = data.frame(Arrivals, Services, A.acum, S.acum, Sys, Cola) round(P[1:20,], 2) Time.s = S.acum - A.acum Time.q = Time.s - Services opar=par() par(mfrow=c(2,3)) cronograma(A.acum, S.acum) hist(Time.s, xlab="", main="Time in system", br="Scott") pt = prop.table(table(Sys)) barplot(pt, main="Clients in system") plot(S.acum, Sys, xlab="Time", ylab="System", t="l") hist(Time.q, xlab="", main="Time in queue", br="Scott") barplot(prop.table(table(Cola)), main="Clients waiting in queue") par(opar) nn = as.numeric(names(pt)) cbind(pt, (1-ro)*ro^nn) # comparando proporciones obs con geométrica mean(Sys) mean(Cola) mean(Time.s) mean(Time.q) # # # # L Lq W Wq Instrucciones: 1. Ejecute el código, modificando los parámetros cuando sea necesario 2. Examine la salida de round(P[1:20,], 2) y el cronograma: le puede servir para interpretar mejor cómo evoluciona el sistema. 3. Compruebe qué ocurre si cambia el número de simulaciones 4. Compruebe qué ocurre si modifica la magnitud de las tasas, sin alterar su ratio. 5. Experimente con diversas combinaciones de tasas. Repita la simulación para alguna combinación (especialmente si el ratio, o factor de carga, es próximo a 1). Tal vez observe que para las mismas condidiones iniciales el resultado varía sensiblemente. 6. Analice la distribución de la variable “Arrivals” (intervalo de tiempo entre llegadas). ¿A qué modelo corresponde? 7. Repita para la variable “Services” (tiempos de servicio) 8. ¿Qué relación tienen estas variables con las tasas “ta” y “ts”? 9. Observe y describa el comportamiento de la evolución del número de clientes en el sistema. ¿Es una secuencia aleatoria? 10. Examine las variables; ¿reconoce algún modelo para ellas? • Sys • Cola • Time.s (tiempo que cada cliente ha permanecido en el sistema) • Time.q (tiempo que cada cliente ha permanecido esperando) 11. Estudie el promedio de las variables anteriores, y compárelas con sus valores teóricos. Si no encuentra un parecido razonable, quizá deba aumentar el número de simulaciones.