On crée une data frame pour simuler une file simple (on prend des lois exponentielles)
genereDFExpo <- function(N, lambdaMin, lambdaMax, lambdaPas, muMin, muMax, muPas) {
df = data.frame()
for (lambda in seq(lambdaMin, lambdaMax, lambdaPas)) {
for (mu in seq(muMin, muMax, muPas)) {
A <- rexp(N, lambda)
S <- rexp(N, mu)
T1 <- c()
T2 <- c()
R <- c()
T1[1] = 0
T2[1] = 0
R[1] = 0
for (i in 2:N) {
T1[i] = T1[i - 1] + A[i]
T2[i] = max(T1[i], T2[i - 1]) + S[i]
R[i] = T2[i] - T1[i]
}
df = rbind(df, data.frame(A = A, S = S, T1 = T1, T2 = T2, R = R,
lambda = lambda, mu = mu, loi = "expo"))
}
}
df
}
# function(N,lambdaMin,lambdaMax,lambdaPas,muMin,muMax,muPas)
N <- 1000
df <- genereDFExpo(N, 0.1, 1, 0.05, 1, 1, 0.1)
library(plyr)
df_adapted <- ddply(df, c("lambda", "mu"), summarise, Time = mean(R), CI = sd(R)/sqrt(length(R)),
nR = length(R))
df_adapted
## lambda mu Time CI nR
## 1 0.10 1 1.099 0.03564 1000
## 2 0.15 1 1.132 0.03436 1000
## 3 0.20 1 1.184 0.03872 1000
## 4 0.25 1 1.469 0.04569 1000
## 5 0.30 1 1.527 0.05062 1000
## 6 0.35 1 1.397 0.04544 1000
## 7 0.40 1 1.509 0.05051 1000
## 8 0.45 1 1.792 0.05291 1000
## 9 0.50 1 2.029 0.06953 1000
## 10 0.55 1 2.094 0.05912 1000
## 11 0.60 1 2.454 0.07544 1000
## 12 0.65 1 2.897 0.09179 1000
## 13 0.70 1 3.515 0.12538 1000
## 14 0.75 1 3.701 0.10520 1000
## 15 0.80 1 3.618 0.09763 1000
## 16 0.85 1 4.223 0.10468 1000
## 17 0.90 1 12.029 0.30409 1000
## 18 0.95 1 8.091 0.18700 1000
## 19 1.00 1 13.780 0.23935 1000
library(ggplot2)
ggplot(df_adapted, aes(x = lambda, y = Time, ymin = Time - CI, ymax = Time +
CI)) + geom_pointrange() + ylim(0, max(df_adapted$Time + df_adapted$CI))
Tests à faire avec différentes lois pour les temps de service :
genereDF <- function(N, lambdaMin, lambdaMax, lambdaPas, loi) {
df = data.frame()
for (lambda in seq(lambdaMin, lambdaMax, lambdaPas)) {
A <- rexp(N, lambda)
if (loi == "exp") {
S = rexp(N, 1)
} else if (loi == "unif") {
S = runif(N, 0, 1)
} else if (loi == "det") {
S = array(1, N)
} else if (loi == "erlang") {
S = rgamma(N, 1, 1)
}
T1 <- c()
T2 <- c()
R <- c()
T1[1] = 0
T2[1] = 0
R[1] = 0
for (i in 2:N) {
T1[i] = T1[i - 1] + A[i]
T2[i] = max(T1[i], T2[i - 1]) + S[i]
R[i] = T2[i] - T1[i]
}
df = rbind(df, data.frame(A = A, S = S, T1 = T1, T2 = T2, R = R, lambda = lambda,
Loi = loi))
}
df
}
df <- genereDF(N, 0.1, 1, 0.02, "exp")
df <- rbind(df, genereDF(N, 0.1, 1, 0.02, "unif"))
df <- rbind(df, genereDF(N, 0.1, 1, 0.02, "det"))
df <- rbind(df, genereDF(N, 0.1, 1, 0.02, "erlang"))
df_adapted <- ddply(df, c("lambda", "Loi"), summarise, Time = mean(R), CI = sd(R)/sqrt(length(R)),
nR = length(R))
ggplot(df_adapted, aes(x = lambda, y = Time, ymin = Time - CI, ymax = Time +
CI, color = Loi)) + geom_pointrange() + ylim(0, max(df_adapted$Time + df_adapted$CI))
Si on coupe quand lambda est trop grand (on ne peut pas mesurer efficacement l'intervalle de confiance, on risquerait donc de conclure trop vite…)
ggplot(df_adapted, aes(x = lambda, y = Time, ymin = Time - CI, ymax = Time +
CI, color = Loi)) + geom_pointrange() + ylim(0, 5) + xlim(0, 0.5)
## Warning: Removed 25 rows containing missing values (geom_segment).
## Warning: Removed 25 rows containing missing values (geom_point).
## Warning: Removed 25 rows containing missing values (geom_segment).
## Warning: Removed 25 rows containing missing values (geom_point).
## Warning: Removed 25 rows containing missing values (geom_segment).
## Warning: Removed 25 rows containing missing values (geom_point).
## Warning: Removed 25 rows containing missing values (geom_segment).
## Warning: Removed 25 rows containing missing values (geom_point).
Conclusion :
La loi qui régit le temps de service semble avoir un impact sur le temps de traitement (certaines lois sont meilleures que d'autres –> loi déterministe ?)
Je pense qu'il y a un problème avec la loi uniforme. Au début de la courbe (peu d'arrivés de “clients”), le temps de traitement devrait être le même pour toutes les lois. Or la loi uniforme est inférieure. Par ailleurs, elle ne croît que très peu. Peut-on vraiment concevoir un système dont le temps de traitement de varie jamais en fonction de la fréquence des inter-arrivés ?
Lorsque les arrivés sont trop fréquentes, le calcul de l'intervalle de confiance CI n'a plus de sens (on peut considérer que les evenements ne sont pas indépendants les uns des autres puisque le temps d'attente dans la file est fonction des arrivés précédentes). On peut donc difficilement interprettés les points qui “décollent” car on ne connait pas leurs intervalles de confiance (et donc on ne sait pas quel crédit accorder à ces valeurs).