Simulación de sistemas MM1

Anuncio
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.
Descargar