[Next] [Previous] [Up] [Top] [Contents] [Index]

6-2 La modélisation de l'environnement

6-2.2 Un langage de simulation pour la simulation discrète des systèmes dynamiques

Etant donné que nous désirons intégrer les modèles de simulation mathématique à des modèles de simulation orientée objets et à des techniques de modélisation d'intelligence artificielle, nous avons opté pour le modèle initial de Forrester (73) qui possède une grande souplesse et qui est très facile à implémenter. Le cadre théorique développé dans "Industrial Dynamics" possède encore aujourd'hui un attrait conceptuel auprès de beaucoup d'analystes de système qui font des recherches appliquées[79]. En effet, ses notions de niveau et de flux sont assimilables très rapidement et l'on voit plus facilement le rapport entre un modèle de simulation et l'objet modélisé qu'avec d'autres techniques. Pour nos propres besoins, nous avons écrit un interpréteur en Scheme qui permet d'exécuter un modèle de simulation (ayant les équations déjà résolues). Il possède une grande souplesse. L'interaction avec d'autres programmes et la modification du modèle (même totale) en cours de route ne pose pas de grands problèmes. Examinons les objets que l'on utilise et qui ressemblent à peu près à ceux que l'on retrouve dans un modèle "dynamo":

Ces éléments ont plus une signification conceptuelle qu'une signification technique. Sur ce dernier plan, seul l'ordre dans lequel on calcule leur valeur varie. Nous avons également copié la stratégie du premier interpréteur dynamo. On calcule dans l'ordre: (1) les variables auxiliaires, (2) les flux, (3) les niveaux (4) les observations. Voici la syntaxe pour définir un objet de simulation[80]:


Syntaxe:   (def-<type> ?<nom> 
				sbs ( <base de simulation> ... ) 
				ini ( <initialisation-val> ... )
				eq <équation> 

Exemple:   (def-flow ?guerilla 
				sbs (afgh-model) 
				ini (155000) 
				eq  (+ ?guerilla ?guerilla-gains ?guerilla-losses)) 

Il faut donc donner un nom à chaque objet. Ce symbole doit être précédé par un "?" (ex: ?guerilla). Ensuite chaque objet doit faire partie d'au moins une base de simulation (ex: afgh-model). Une valeur d'initialisation est nécessaire si on utilise cette variable pour en calculer d'autres (ex: 155000). Si l'on a besoin d'entrer une série de nombres, c'est également possible. L'équation, précédée par le mot clé "eq" est une simple expression "Scheme"[81] qui doit nécessairement retourner une valeur numérique lorsqu'elle est exécutée. Dans le cas le plus simple, il s'agit d'une expression mathématique qui fait référence à d'autres objets de simulation. Toutefois, il est possible de faire n'importe quoi avant de retourner une valeur, comme d'appeler par exemple un système de simulation orientée objets. Voici un exemple d'une équation un peu plus sophistiquée:

  ;; create a temporary variable guerilla-count   
  (let ((guerilla-count (+ ?guerilla ?guerilla-gains ?guerilla-losses)) 
    (if ;; if the guerilla count is very low 
        (< guerilla-count 100)  
        ;; then print a message and return zero 
        (begin 
           (writeln "?Guerilla too low, set to 0!!) 
           0) 
        ;; else return this value (which will be set to ?guerilla) 
        guerilla-count) 

Dans cette expression, on fait un petit calcul intermédiaire pour voir si un niveau tombe au-delà d'une limite. Si c'est le cas, on imprime un message et on met ce niveau à zéro. Au lieu de simplement jouer sur des valeurs numériques, on peut très bien utiliser ces expressions pour changer le comportement du modèle, par exemple modifier le paramètre qui règle le flux de "?guerilla-gains", l'augmentation des effectifs de la guérilla.

Cet petit exemple met en évidence la puissance conceptuelle d'une simulation discrète. Il devient très facile de changer le comportement du modèle en cours de route sans le recompiler. A noter également que tout changement de paramètres a un effet clair et immédiat sur le système dans le cycle suivant. Dans des modèles continus, les effets de lissage rendent très difficile ce genre d'opération. Afin de montrer qu'on ne perd pas énormément de précision avec un modèle discret par rapport à un modèle continu simple, le lecteur peut consulter la section A-1 "Test du langage de simulation" [p. 376] dans l'appendice. On peut formuler l'hypothèse que notre système calcule avec suffisamment de précision les résultats que l'on pourrait obtenir avec un langage de simulation utilisant des méthodes de calcul plus sophistiqués. Ces langages de simulation offre plusieurs avantages par rapport au notre, notamment la possibilité d'estimation de paramètres ce qui est crucial en simulation numérique de systèmes dynamiques. Cependant, une fois qu'un tel modèle a été créé, on peut le transporter sans grand danger dans notre système qui possède une flexibilité de modélisation très intéressante par rapport aux modèles mathématiques fermés. L'élément "discret" (c'est à dire les décisions) est primordial dans tout système social et une simulation mathématique ne peut pas le modéliser de la même façon[82].


[79] Cette méthodologie est également très populaire pour les applications didactiques (modélisations en sciences et sciences humaines). Le progiciel le plus populaire utilisé en éducation s'appelle Stella. Il est disponible sur MacIntosh.
[80] Il s'agit ici de la définition minimale. La version de ce programme que nous avons développé en LISP pour la modélisation dans le cadre de l'environnement d'apprentissage PEPS permet la définition d'objets plus complexes.
[81] Les équations sont écrites en "polonais inversé", c'est-à-dire comme des expressions Scheme tout à fait ordinaires. D'ailleurs, cette notation est facile à comprendre une fois que l'on connaît le principe. Comme toute autre expression fonctionnelle, une expression arithmétique est toujours une liste. Le premier élément dans une telle liste est donc un opérateur arithmétique qui sera appliqué aux éléments suivants de la liste. S'il tombe sur une sous-liste, il faut d'abord chercher à évaluer le résultat de cette sous-liste, etc. Notons en passant qu'il existe plusieurs façons d'écrire la même équation, par exemple (+ a b (- c)) est égal à (+ a (- b c)). Notons également que les éléments d'une expression arithmétique ne doivent pas nécessairement être des variables, nombres ou autres expressions arithmétiques. L'expression (+ a (rends-moi-un-nombre-en-fonction-de a)) est aussi légale à condition que cette fonction "rends-moi..." rende une valeur numérique. En d'autre termes, notre logiciel n'est rien d'autre qu'une extension d'un langage de programmation interactif, ce qui rend très simple le proto-typage pour tester des concept, ce qui est le cas ici.
[82] Certains langages permettent l'utilisation de "switches" qui ne sont pas très intéressants pour modéliser des décisions.