Ce guide est divisé en trois parties :
Les systèmes dynamiques sont un type de modélisation où l'on essaie de comprendre comment les choses sont en relations les unes avec les autres. Cette approche est un peu différente de celle basée sur les agents qui est normalement utilisée par les modèles NetLogo.
Avec l'approche basée sur les agents, vous programmez le comportement individuel des agents et observez ce qui « émerge » de leurs interactions. Dans un modèle de prédation loups-moutons par exemple, vous fournissez des règles décrivant comment les loups, les moutons et l'herbe interagissent les uns avec les autres. Quand vous exécutez la simulation, vous observez le comportement émergeant au niveau des « agrégats « : par exemple, comment les populations de loups et de moutons évoluent au cours du temps.
Avec le modélisateur de systèmes dynamiques, vous ne programmez pas le comportement individuel des agents. Vous programmez à la place comment les populations d'agents se comportent de manière globale. Par exemple, en utilisant les systèmes dynamiques pour modéliser la prédation loups-moutons, vous spécifiez comment le nombre total de moutons sera modifié quand le nombre total de loups augmentera ou diminuera, et vice-versa. Vous lancez alors la simulation pour voir comment les deux populations évoluent au cours du temps.
La programmation du modélisateur de systèmes dynamiques se fait en dessinant un diagramme définissant d'une part les populations en causes ou "stocks" et d'autre part comment ces populations interagissent les unes avec les autres. Le modélisateur lit alors votre diagramme et génère le code NetLogo approprié – les variables globales, les procédures et les reporters – permettant de faire « tourner » votre système dynamique dans NetLogo.
Un diagramme de système dynamique est formé de quatre types d'éléments : les stocks, les variables, les flux et les liens.
Un stock est une collection de choses, un agrégat. Par exemple, un stock peut représenter une population de moutons, l'eau d'un lac ou le nombre de machines dans une usine.
Un flux (flow) transporte ces choses, remplissant ou vidant un stock. Les flux ressemblent à des tuyaux munis d'un robinet, le robinet permettant de contrôler la quantité de choses qui s'écoulent dans le tuyau.
Une variable est une valeur utilisée dans le diagramme. Elle peut être soit une équation qui dépend d'autres variables, soit une constante.
Un lien (link) permet qu'une valeur présente dans une partie du diagramme soit aussi disponible dans une autre partie. Un lien transmet un nombre d'une variable ou d'un stock à un autre stock ou à un flux.
Le Modélisateur de systèmes dynamiques calcule comment les valeurs des stocks changent au cours du temps en les évaluant encore et encore. L'estimation n'est pas toujours parfaite, mais vous pouvez influencer sa précision en changeant la valeur de dt. Quand dt diminue, les valeurs du modèle sont évaluées plus fréquemment, ce qui fait qu'il devient plus précis. Toutefois, la diminution de la valeur de dt ralentit aussi la vitesse de la simulation.
La bibliothèque des modèles NetLogo "NetLogo Models Library" contient dans sa section "Sample Models" quatre exemples qui utilisent le Modélisateur de systèmes dynamiques. Ces quatre modèles explorent la croissance de populations (et, dans les modèles avec prédation, aussi les déclins de populations). Ce sont :
"Exponential Growth" (Croissance exponentielle) et "Logistic Growth" (Croissance logistique) sont de simples exemples de la croissance d'un stock.
"Wolf Sheep Predation (aggregate)" (Prédation loups-moutons (agrégat)) est un exemple de système avec de multiples stocks qui s'influencent les uns les autres. Il modélise un écosystème de prédateurs-proies en utilisant le Modélisateur de systèmes dynamiques.
"Wolf Sheep Predation (docked)" est un exemple de modèle qui fait tourner côte à côte un modèle de système dynamique et un modèle à base d'agents. En fait, il fait tourner l'implémentation en système dynamique de la Prédation loups-moutons à côté de la Prédation loups-moutons à base d'agents qui de trouve dans la section "Biology" des "Sample Models".
Pour ouvrir le Modélisateur de systèmes dynamiques "System Dynamics Modeler", sélectionnez la commande "System Dynamics Modeler" dans le menu "Tools". La fenêtre "System Dynamics Modeler" s'ouvre alors.
Le panneau "Diagram" (diagramme) est l'endroit où dessiner le diagramme de votre système dynamique. Sa barre d'outils contient les boutons pour éditer, supprimer ou créer des éléments dans le diagramme.
Le diagramme d'un système dynamique est formé de quatre types de composants : les stocks, les variables, les flux (flows) et les liens (links).
Pour créer un stock, pressez le bouton "Stock" de la barre d'outils et cliquez dans la zone de dessin située en-dessous. Un nouveau stock apparaît. Chaque stock demande un nom unique, qui deviendra une variable globale. Les Stocks requièrent aussi une valeur initiale ("Initial value"). Cette dernière peut être un nombre, une variable, une expression NetLogo complexe ou un appel à un reporter NetLogo.
Pour créer une variable, pressez le bouton "Variable" et cliquez dans la zone de dessin du diagramme. Chaque variable d'un Système dynamique doit recevoir un nom unique, qui deviendra le nom d'une procédure ou d'une variable globale. Les variables demandent aussi une expression. Cette expression peut être un nombre, une variable, une expression NetLogo complexe ou un appel à un reporter NetLogo.
Pour créer un flux, pressez le bouton "Flow". Cliquez et maintenez pressé là où le flux doit commencer – soit sur un Stock, soit sur une zone vide – et tirez jusqu'à l'endroit où vous voulez qu'il aboutisse – sur un Stock ou une zone vide. Chaque flux doit avoir un nom unique, qui deviendra celui d'un reporter NetLogo. Les flux demandent une aussi expression, qui doit représenter le « débit » du flux de l'entrée à la sortie du « tuyau ». Cette expression peut être un nombre, une variable, une expression NetLogo complexe ou un appel à un reporter NetLogo. Si sa valeur est négative, le flux s'écoule dans l'autre direction
Quand plus d'un flux est connecté à un stock, il est important de prendre en compte la manière dont ces flux vont interagir les uns avec les autres. NetLogo n'oblige pas les flux qui sortent d'un stock de le faire dans un ordre particulier. De plus, NetLogo ne regarde pas si la totalité des flux qui sortent d'un stock est inférieure ou égale au contenu du stock. Ces comportements peuvent être implémentés explicitement dans l'expression exigée par le flux.
Par exemple, si un flux est défini par une valeur constante, disons 10, vous pouvez vous assurer qu'il ne draine jamais plus que la valeur du stock en utilisant la primitive min : min (list stock 10). Si je veux qu'un flux A vide un stock avant que flux B ne soit calculé, je peux lier le flux A au flux B et modifier flux B pour soustraire la valeur de flux A du stock : min (list (max (list 0 (stock - flow-a))) 10).
Pour créer un lien, cliquez et maintenez pressé sur le point de départ du lien – une variable, un stock ou un flux – et tirez jusqu'à la variable ou le flux de destination.
Quand vous créez un stock, une variable, ou un flux, NetLogo affiche un point d'interrogation rouge sur le nouvel élément. Ce point d'interrogation indique que l'élément en question n'a pas encore reçu de nom. Un nom d'élément rouge indique que le stock n'est pas complet : il manque une ou plusieurs des valeurs requises pour pouvoir créer un modèle de système dynamique. Quand un élément du diagramme est complet, son nom est affiché en noir.
La sélection. Pour sélectionner un élément d'un diagramme, cliquez-le. Pour sélectionner plusieurs éléments, pressez la touche Majuscule et cliquez sur les éléments à sélectionner. Vous pouvez aussi sélectionner un ou plusieurs éléments en tirant une boîte de sélection avec la souris.
L'édition. Pour éditer un élément du diagramme, sélectionnez l'élément et pressez le bouton "Edit" de la barre d'outils. Il suffit aussi de double-cliquer l'élément. (Vous pouvez éditez les stocks, les flux et les variables, mais vous ne pouvez pas éditer les liens).
Le déplacement. Pour déplacer un élément du diagramme, sélectionnez-le et tirez-le vers son nouvel emplacement.
Dans la partie droite de la barre d'outils est affiché le dt par défaut, c'est-à-dire la durée écoulée entre deux calculs des états des paramètres du système dynamique. Cette durée dt correspond à un pas de la simulation. Pour modifier cette valeur par défaut, pressez le bouton "Edit" (à droite de la valeur de dt affichée) et entrez une nouvelle valeur.
Quand vous cliquez le bouton "Check" ou éditez un stock, un flux ou une variable, le modélisateur génère automatiquement le code NetLogo correspondantau diagramme et tente de le compiler. S'il y a une erreur, le nom de l'onglet "Procedures" devient rouge, un message est affiché et la portion de code qui est à l'origine de l'erreur est mise en évidence.
Ces informations devraient vous aider à avoir une meilleure idée de l'élément du diagramme qui est à l'origine du problème.
Le Modélisateur de Systèmes dynamiques génère des variables et des procédures NetLogo basées sur le contenu du diagramme construit. Ce sont en fait ces procédures qui permettent à NetLogo d'effectuer les calculs nécessaires à la simulation décrite par le diagramme. Le panneau "Procedures" de la fenêtre du Modélisateur de Systèmes dynamiques affiche les procédures NetLogo générées.
Le contenu du panneau "Procedures" n'est pas éditable. Pour modifier le système dynamique, vous devez éditer le diagramme.
Examinons d'un peu plus près comment le code généré se rapporte au diagramme :
Les stocks correspondent à des variables globales qui ont été initialisées avec la valeur ou l'expression fournie dans le champ "Initial value". Chaque stock est mis à jour à chaque pas, mise à jour basée sur les flux entrant et sortant.
Les flux correspondent aux procédures qui contiennent les expressions fournies dans le champ "Expression".
Les variables peuvent être soit des variables globales, soit des procédures. Si l' "Expression" fournie est une constante, elle est devenue une variable globale et a été initialisée avec cette valeur. Si vous avez utilisé une "Expression" plus complexe pour définir la variable, elle a été transformée en une procédure, comme pour les flux.
Les variables et les procédures définies dans ce panneau sont accessibles depuis la fenêtre principale de NetLogo, de la même manière que le sont les procédures et les variables définies dans le panneau "Procedures" principal de NetLogo. Vous pouvez appeler ces procédures depuis le panneau "Procedures" principal, depuis le Centre de commande ou avec les boutons placés sur le panneau "Interface". Vous pouvez faire référence aux variables globales à partir de n'importe où, y compris à partir du panneau "Procedures" principal et dans les moniteurs.
Il y a trois procédures importantes à signaler, qui sont : system-dynamics-setup, system-dynamics-go et system-dynamics-do-plot.
system-dynamics-setup initialise le modèle de Système dynamique. Il donne sa valeur à dt, appelle reset-ticks et initialise les stocks et les convertisseurs. Les convertisseurs à valeur constante sont initialisés en premier, suivis par les stocks à valeur constante. Les autres stocks sont initialisés ensuite par ordre alphabétique.
system-dynamics-go fait tourner le Système dynamique par pas d'unité de temps dt. Il calcule les valeurs des flux et des variables et met à jour la valeur des stocks. Il appelle aussi tick-advance avec la valeur de dt. Les convertisseurs et les flux avec des "Expressions" non-constantes ne sont calculés que lorsque cette procédure est appelée, toutefois, l'ordre de leur évaluation n'est pas défini.
system-dynamics-do-plot affiche les valeurs des stocks du Système dynamique. Pour utiliser cette procédure, il faut d'abord créer un traceur de courbes dans le panneau "Interface" de NetLogo. Il faut définir un crayon pour chaque stock dont vous voulez représenter le graphique. Cette procédure utilise le traceur courant, que vous pouvez changer au moyen de la commande set-current-plot.
Le diagramme que vous créez dans le Modélisateur de Systèmes dynamiques et les procédures générées à partir de ce diagramme font partie du modèle NetLogo. Quand vous sauvegardez ce modèle, le diagramme est sauvegardé dans le même fichier.
Nous allons maintenant créer un modèle de « Prédation loups-moutons » avec le Modélisateur de Systèmes dynamiques.
- Ouvrez un nouveau modèle en NetLogo.
- Lancez le "System Dynamics Modeler" dans le menu "Tools".
![]()
Notre modèle aura une population de loups et une population de moutons. Commençons par les moutons. Il faut d'abord créer le stock qui contiendra la population de moutons.
- Pressez le bouton "Stock" dans la barre d'outils.
![]()
- Cliquez dans la zone du diagramme.
Vous voyez un stock avec un point d'interrogation rouge au centre.
- Double-cliquez ce stock pour l'éditer.
- Nommez ce Stock sheep (moutons).
- Mettez la valeur initiale "Initial value" à 100.
- Désactivez la case à cocher "Allow Negative Values" (autoriser les valeurs négatives). Un nombre de moutons négatif n'a pas de sens!
![]()
La population de moutons peut s'accroître si un mouton naît. Pour ajouter ce fait à notre diagramme, il faut créer un flux entrant dans le stock de moutons.
- Cliquez le bouton "Flow" de la barre d'outils et pressez le bouton de la souris dans une partie vide à gauche du stock de moutons. Tirez le flux vers la droite jusqu'à ce qu'il se connecte avec le stock de moutons. Relâchez le bouton de la souris.
- Éditez le flux et nommez-le sheep-births.
Le nombre de moutons nés pendant une période de temps dt dépend du nombre de moutons vivants : plus il y a de moutons vivants, plus il y a de nouveaux-nés.
- Dessinez un lien partant du stock sheep et allant vers le flux sheep-births.
- Pour le moment, entrez une constante, par exemple 1, dans le champ "Expression".
Le taux de natalité des moutons dépend aussi de certains facteurs constants dont la discussion sort du cadre de ce modèle, comme le taux de reproduction par exemple.
- Créez une variable et nommez-la sheep-birth-rate.
- Donnez-lui une valeur de 0.04
- Dessinez un lien de la variable sheep-birth-rate au flux sheep-births.
Votre diagramme devrait ressembler maintenant à ceci :
L'étiquette du flux sheep-births est rouge parce que nous ne lui avons pas encore donné d'expression. La couleur rouge indique toujours qu'il manque quelque chose à cette partie du diagramme.
Le nombre de moutons entrant dans notre stock dépendra positivement du nombre de moutons et du taux de natalité sheep-birth-rate.
- Éditez le flux sheep-births et écrivez l'expression suivante : sheep-birth-rate * sheep.
Nous avons maintenant un diagramme complet. Pour voir le code NetLogo généré par ce diagramme, cliquez l'ongleL "Procedures" de la fenêtre du Modélisateur de Systèmes dynamiques. Ce code devrait être le suivant :
Une fois que le modèle d'agrégats a été créé avec le Modélisateur de Systèmes dynamiques, nous pouvons interagir avec ce modèle par l'intermédiaire de la fenêtre "Interface" de NetLogo. Construisons maintenant le modèle NetLogo nous permettant d'exécuter le code généré par le diagramme. Nous avons besoin des boutons setup et go pour appeler les procédures system-dynamics-setup et system-dynamics-go créées par le Modélisateur de Systèmes dynamiques. De plus, pour pouvoir bien suivre l'évolution des populations il nous faut aussi un moniteur et un traceur.
- Sélectionnez la fenêtre NetLogo principale.
- Dans le panneau "Procedures", écrivez :
to setup ca system-dynamics-setup end
to go system-dynamics-go system-dynamics-do-plot end- Allez dans le panneau "Interface".
- Créez un bouton setup.
- Créez un bouton go (n'oubliez pas d'en faire un bouton « pour-toujours » dans la case à cocher "Forever").
- Créez un moniteur sheep.
- Créez un traceur appelé "populations" avec un crayon nommé sheep.
Nous sommes maintenant prêt à faire tourner notre modèle.
- Pressez le bouton "setup".
- Ne pressez pas le bouton "go" maintenant. Écrivez plutôt quatre ou cinq fois de suite go dans la Ligne de commandes du Centre de commande en pressant la touche Retour après chaque go.
Observez ce qui se passe. La population de moutons s'accroît exponentiellement. Après quatre ou cinq itérations, nous avons une énorme quantité de moutons. Nous aboutissons à cette situation parce que nous avons des moutons qui se reproduisent mais qui ne meurent jamais.
Pour résoudre ce problème, terminons notre diagramme en introduisant une population de loups qui mangent des moutons.
- Revenez à la fenêtre "System Dynamics"
- Ajoutez un stock de loups appelé "wolfes".
- Ajoutez des flux, des fariables et des fiens pour que le diagramme ressemble à :
![]()
- Ajoutez encore un lien allant du stock wolves au flux qui sort du stock sheep.
- Nommez les éléments du diagramme de la manière suivante : this:
![]()
où
la valeur initiale des loups ( wolves ) est 30,
wolf-deaths vaut wolves * wolf-death-rate,
wolf-death-rate vaut 0.15,
predator-efficiency vaut 0.8,
wolf-births vaut wolves * predator-efficiency * predation-rate * sheep,
predation-rate vaut 3.0E-4,
et sheep-deaths vaut sheep * predation-rate * wolves.
Nous en avons maintenant vraiment terminé avec le diagramme, mais il faut encore mettre le modèle NetLogo à jour.
- Retournez dans la fenêtre principale de NetLogo.
- Ajoutez un crayon appelé "wolves" au traceur "populations".
- Pressez setup et go pour voir le diagramme de votre Système dynamique en action.
Vous devriez voir un graphique des populations qui ressemble à ceci :
Le Modélisateur de Systèmes Dynamiques est toujours en cours de développement.
Parmi les fonctionnalités, nous avons prévu d'ajouter :
Si vous découvrez des bogues (bugs) dans le Modélisateur de Systèmes dynamiques, faites-nous le savoir à l'adresse bugs@ccl.northwestern.edu.
Nous aimerions aussi que vous nous fassiez part de vos désirs concernant de nouvelles fonctionnalités qui pourraient être utiles pour vos travaux. Si vous avez des questions, des commentaires ou des suggestions, écrivez-nous à l'adresse feedback@ccl.northwestern.edu.