Dans sa généralité, le déroulement d'une simulation utilise les générateurs décrits au chapitre précédent pour instancier les "événements élémentaires" d'un système, puis fait évoluer le système en fonction de ces instanciations. Il existe alors plusieurs façons de procéder pour extraire l'information utile (qui consiste le plus souvent en un petit nombre d'encadrements portant sur les grandeurs intéressantes).
On peut essayer d'extraire au vol cette information, ce qui permet un évident gain de place (et de temps), ou bien enregistrer tout et ne traiter les données qu'une fois la simulation terminée. De telles traces peuvent prendre une place considérable, mais il est clair que la compréhension d'un "comportement inattendu" (dû à une erreur, de calcul ou de modélisation) nécessite de disposer d'une plus grande masse de données que pour un calcul direct.
De toutes façons, l'utilisation de générateurs pseudo-aléatoires permet une réexécution à l'identique d'une simulation : il suffira d'extraire au deuxième passage les informations qui manquaient à la compréhension du phénomène.
Un programme de simulation doit donc distinguer clairement entre la
routine principale, qui se contente de simuler, et un ensemble de
routines d'observation appelées par la routine principale. Cette remarque
s'applique d'autant plus qu'il est intéressant de découper une simulation
de taille
en une suite de
lots, constitués chacun d'une
simulation de taille
(avec
) : il faut donc disposer
d'une hiérarchie d'observateurs, les uns étant des observateurs par
lot, et les autres des observateurs globaux.
Avant de décrire le fonctionnement détaillé de ces routines d'observation,
commençons par décrire les résultats que nous en attendons. Le tableau
ci-dessous résume les résultats d'une simulation d'une file d'attente,
composée de
événements, découpée en
lots de
événements, au cours de laquelle nous avons observé
variables
(inter-arrivées, service résiduel, service de l'éventuel deuxième
client, longueur de la file).
| arriv | resid | serv2 | queue | |
| n_tot | 1600 | 1222 | 947 | 1600 |
| moy_t | 13.449 | 10.201 | 9.9659 | 3.2863 |
| var_t | 192.38 | 99.239 | 100.06 | 11.617 |
| sum_j | 20 | 20 | 20 | 20 |
| moy_n | 80 | 61.10 | 47.35 | 80 |
| var_n | 0 | 76.590 | 188.83 | 0 |
| moy_x | 13.449 | 10.031 | 9.7916 | 3.2863 |
| var_x | 1.6213 | 3.9498 | 2.8267 | 4.0023 |
| moy_y | 193.26 | 94.777 | 96.131 | 7.9135 |
| var_y | 3034.2 | 1919.4 | 1945.0 | 42.991 |
Pour chaque variable observée,
est le nombre total d'événements
favorables. Ainsi, à chacune des
observations, la file d'attente
avait une longueur, tandis qu'un service résiduel (c'est à dire une
file non vide) n'a été observé que
fois. Les quantités
et
sont, à l'issue de la simulation, les meilleurs estimateurs
possible de
et
, respectivement moyenne
et variance de la variable
étudiée.
La quantité
compte le nombre de blocs dans lesquels la variable
a été observée au moins deux fois, permettant le calcul de la variance
d'échantillon pour le lot considéré. Les quantités
et
sont les estimations obtenues pour les paramètres de dispersion de
la variable "nombre d'événements par lot".
Les quantités
et
sont les estimations obtenues
pour les paramètres de dispersion de la variable "moyenne par
lot". La quantité
permet d'estimer la variance de
en tant qu'estimateur de
. La quantité
est
un estimateur de
, mais d'une qualité inférieure à
.
Les quantités
et
sont les estimations obtenues
pour les paramètres de dispersion de la variable "variance d'échantillon
par lot". La quantité
permet d'estimer la variance de
en tant qu'estimateur de
. La quantité
est un estimateur de
, mais d'une qualité inférieure
à
.
Décrivons maintenant les routines d'observation. Si nous voulons évaluer
une variable apparaissant à chaque observation, la procédure OBSV4
(algorithme 41) permet de cumuler les valeurs et leurs
carrés. La moyenne et l'écart-type seront obtenus en fin de cycle
sachant qu'il est survenu
événements par lot. Lorsque l'objectif
est d'évaluer une variable conditionnelle (comme un service résiduel,
qui n'a lieu que si la file est non vide), il faut disposer d'un booléen
permettant de décider si le cumul doit avoir lieu, et il faut en outre
enregistrer le nombre d'événements (compteur
de OBS4).
Lorsque l'objectif est de dresser l'histogramme des valeurs prises
par une variable, le choix des points de subdivision est évidemment
décisif. Dans l'algorithme 42, nous supposons
que les valeurs se répartissent dans l'intervalle
,
une valeur
servant à coder l'absence d'observation. Les
valeurs supérieures à
sont regroupées en une seule classe. En
outre un cumul global, avant troncature, est effectué de façon à disposer
d'une estimation non perturbée de la moyenne et de l'écart-type de
la variable.
Bien entendu, les accumulateurs doivent être initialisés en début de chaque lot (algorithme 43).
A la fin de chaque lot, les paramètres de dispersion pour le lot sont
calculés, fournissant des estimateurs
pour les variables
"nombre par lot", "moyenne par lot" et "variance par
lot". Afin d'obtenir une estimation des paramètres de dispersion
de ces nouvelles variables, de nouveaux cumuls doivent être gérés
à la fin de chaque lot. Dans l'algorithme 44, le
paramètre
est le nombre de variables à gérer, tandis que les
quantités
contiennent les cumuls globaux concernant
la variable
étudiée, tandis que les quantités
contiennent
les cumuls relatifs aux variables "estimateurs par lot".
Bien entendu, les accumulateurs doivent être initialisés en début de simulation (algorithme 45).
En fin de simulation, un ultime traitement donne les moyennes et les
variances des observateurs par lots et des observateurs globaux (algorithme
50). Pour des raisons de lisibilité, nous avons choisi
de border le tableau par une colonne
donnant les
légendes, et le tableau lui même est accédé par des indices nominaux
comme
plutôt que par des numéros (
) anonymes.