Simscript III/ACCUMULATE/TALLY
Les énoncés accumulate et tally permettent de calculer des quantités statistiques et de préparer des histogrammes sur une variable x dépendant du temps. Elles s’utilisent uniquement dans le preamble.
On emploie tally dans le cas où x est définie en des instants t1, t2, ..., tn et accumulate dans le cas où x est définie sur tout l’intervalle [O,T] :
ACCUMULATE / TALLY
La syntaxe est la même dans les deux cas :
x peut être une variable globale, ou un attribut d’entité(s) permanente(s) ou encore un attribut d’entité(s) temporaire(s) (sauf pour un histogramme), un attribut d’une ressource ou d’une entité composée ou un attribut du système. La variable x doit être numérique; c’est-à-dire le mode doit être integer, integer2, integer4, alpha, double, real; la variable ne peut être une variable de mode pointer, text, reference ou subprogram. Cette variable peut avoir une dimension et peut être monitorée. Elle peut être définie explicitement ou implicitement. Ce variable ne peut être une fonction attribut, une variable aléatoire ou une statistique recueillie par un autre énoncé accumulate/tally.
Si l’énoncé accumulate/tally apparaît à l’intérieur d’un bloc begin class … end, la variable sur laquelle on recueille des statistiques est un attribut d’un objet ou d’une classe définie par la classe ou hérité d’une autre classe. Si la variable est un attribut d’objet, chaque statistique est un attribut d’objet, tandis que si la variable est un attribut de la classe, chaque statistique est un attribut de la classe. Si la variable est définie dans le préambule public, et l’ énoncé accumulate/tally apparaît dans le préambule privé, la variable doit être un attribut d’objet. En d’autres mots, les statistiques privées ne peuvent être recueillies sur les attributs publics d’une classe.
Nom1,...,Nomn sont des noms de fonctions qui n’ont pas besoin d’être déclarées par ailleurs et qui calculent automatiquement les quantités demandées par les mots-clés de l’énoncé, lorsqu’on y fait référence (généralement en fin de simulation).
Voici les mots-clés et les calculs effectués par un tally :
number | num | N = nombre de mesures de xi |
sum | |
sum.of.squares | ssq | Somme des x2: |
average | avg | mean | |
mean.square | msq | |
variance | var | variance de x = mean.square – mean**2 |
std.dev | std | écart-type de x = sqrt.f(variance) |
maximum | max | maximum des x |
minimum | min | minimum des x |
Pour un accumulate, les mots-clés sont les mêmes, mais les calculs effectués sont évidemment différents :
Notations : | T(0) | = | instant 0 | |||
T(n) | = | instant du n-ème changement de valeur de x | ||||
x | = | valeur de x dans l’intervalle [T(n-1),T(n)] | ||||
time | = | instant d’appel des fonctions calculées |
number | num | N = nombre de changements de valeurs de x |
sum | Somme de (T(n)-T(n-1))*x |
sum.of.squares | ssq | Somme de (T(n)-T(n-1))*(x**2) |
average | avg | mean | sum/(time-T(0)) |
mean.square | msq | sum.of.squares/(time-T(0)) |
variance | var | mean.square – mean**2 |
std.dev | std | écart-type de x = sqrt.f.(variance) |
maximum | max | maximum de x sur [T(0), time.v] |
minimum | min | minimum de x sur [T(0), time.v] |
Nomh est un nom de tableau défini automatiquement avec une dimension de plus que la variable x, tableau qui contiendra l’histogramme de x pour les valeurs comprises entre q1 et q2, par tranches de q3 unités (les qi doivent être des constantes numériques, ou des variables globales initialisées une fois pour toute avant la première utilisation du tally). Par exemple, si x est un attribut de couple d’entités permanentes (E1,E2) Nomh sera un tableau à 3 indices i, j, k avec i = 1, ..., n.E1; j = 1, ..., n.E2 et k = 1, ..., n avec n = (q2 – q1) / q3 + 1.
tally compte le nombre de fois où (accumulate cumule la durée pendant laquelle) la variable x(i, j) est tombée dans l’intervalle : [q1+(k-1)q3 , q1+kq3[ pour k = 1,...,n et met ce nombre (cette durée) dans Nomh(i, j, k).
N.B. : les valeurs x < q1 vont aussi dans la case 1 et les valeurs x ≥ q2 vont dans la case n.
Exemples :
Soit Occupé une variable globale qui manque l’occupation d’un serveur (Occupé = 0 quand il est libre et Occupé = 1 quand il est occupé). Alors:
- accumulate R0 as the mean of Occupé
donnera le taux d’occupation du serveur durant la simulation.
Si Bac est un ensemble et si on place dans le preamble :
accumulate | L_Bac as the mean, |
p (0 to 100 by 1) as the histogram of N.Bac |
on aura en fin de simulation L_Bac = longueur moyenne de la file Bac et p(k) / time.v = probabilité d’avoir k 1 clients dans la file Bac pour k = 1,...,101.
Remarque: si Bac est indicée par une entité permanente Canal, on aura avec ce même énoncé les quantités demandées pour toutes les files en faisant référence à L_Bac(i) et p(i,k) pour i = 1,...,N.Canal.
3. Si w est une variable globale qui mesure le temps passé par chaque client dans la file Bac (on a donc "w = time.v Heure_Arrivee(Client)" derrière "remove first Client from Bac" dans un routine), alors:
tally | Nw = number, |
Ew = mean, | |
Sw = std.dev, | |
Hw (0 to 20 by 0.1) = histogram of w |
donnera: | Ew = temps moyen d’attente des paquets |
Sw = écart type du temps d’attente | |
Nw = nombre de mesure de w effectuées |
et | HW(1) / Nw = probabilité que w < 0.1 unités de temps |
HW(2) / Nw = 0.1 < w < 0.2 | |
.... | |
HW(200) / Nw = 19.1 < w < 20 | |
HW(201) / Nw = 20.0 < w |