Du modèle au graphe

19/06/2018

Une tentative de structuration du modèle

Une fois ma mission de portage du modèle à peu près terminée, il faut ranger un peu le code.

L’idée ici est d’utiliser des algorithmes d’analyse de graphe pour pouvoir structurer le modèle. Le premier découpage proposé par Forrester est déjà très pertinent, et permet plusieurs niveau de “zoom” sur le modèle. Cependant, appliquer des techniques d’analyse automatique nous permet d’avoir un nouveau point de vue sur la représentation de W3.

J’ai déjà implémenté cette structuration, utilisée dans l’implémentation Vensim. Cette première version de la structuration est disponible sur le repo Git de mon stage.

Du modèle de DS au graphe orienté

« Stephen Flanders, DYNAMO flow diagram of the world model (1972) »   Tirée de Club de Rome, Dynamics of the growth in a finite world (1974)
« Stephen Flanders, DYNAMO flow diagram of the world model (1972) »
Tirée de Club de Rome, Dynamics of the growth in a finite world (1974)

La première étape consiste à traduire le modèle. J’ai défini un graphe tel que les noeuds sont les variables et les arcs (A,B)(A, B) définissent une relation « B dépend de A ». J’ai effectué cette traduction à partir du code Python et d’AST. J’ai filtré les variables peu représentatives de la dynamique, à savoir les constantes, les « lookup tables », et j’ai réduit certaines relations du type :

en

si A est une fonction « complexe »1.

Ensuite j’ai tout importé dans un graphe networkx (bibliothèque Python pour l’analyse et la représentations de graphes).

Analyse structurelle

J’ai utilisé la méthode de Louvain pour la détection de communautés afin d’essayer de trouver des composantes relativement « connexes »… On ne parle en fait plus de connexité, mais plutôt d’un degré de connexion pour un noeud à un groupe de noeuds. On fait plutôt ici une sorte de « clustering » ou partitionnement. On doit rajouter une nouvelle simplification pour pouvoir appliquer cette méthode, à savoir ignorer le sens des flèches (avec des flèches, le graphe est dit orienté, sinon il est non orienté). Ça enlève une quantité non négligeable d’informations à propos du modèle si on compte en plus le fait qu’on ignore toutes les relations algébriques entre les variables : toutes les formules sont ignorées, seul le fait qu’une variable dépende d’une autre est conservé. La méthode de Louvain est implémentée dans la bibliothèque python-louvain.

J’ai utilisé la méthode de génération dendrogramme qui permet de générer plusieurs niveaux de clustering. Avec les simplifications que j’ai opérées, on obtient 3 niveaux de séparations que j’ai listés du plus élevé (le plus de communautés) au plus faible (le moins de communautés).

Voici les sorties générées par GraphViz (clic droit puis Afficher l’image pour l’agrandir) :

Troisième niveau de séparation
Troisième niveau de séparation
Deuxième niveau de séparation
Deuxième niveau de séparation
Premier niveau de séparation
Premier niveau de séparation

On retrouve des regroupements de variables plus ou moins pertinents sauf pour le troisième niveau de séparation qui est trop exhaustif. On trouve des bonnes surprises, comme la famille jaune dans le premier niveau qui regroupe à peu près toutes les variables en rapport avec la fertilité.

Globalement, le résultat brut de l’application de cette méthode ne nous permet pas d’avoir une organisation pertinente du modèle. Nous pourrons l’utiliser par la suite, mais seulement avec quelques interventions manuelles.

Une autre application de l’analyse de graphe

Can System Dynamics learn from Social Network Analysis? (La Dynamique des systèmes peut-elle apprendre de l’analyse de réseaux sociaux ?) a été publié précisément pour étudier la pertinence de ce type d’analyse dans le domaine de la DS. De la même manière que j’ai opéré, les auteurs ont transformé le modèle en graphe en représentant les dépendances entre les variables.

Ils étudient dans ce graphe quatre types de centralité pour chacune des variables du modèle W3 (une sorte d’importance de la variable dans le système, de même qu’elle représente l’influence d’une personne dans un réseau social) et compare les résultats aux choix qu’a fait Forrester dans son analyse.

Forrester avait choisi cinq leviers d’actions pour errayer l’effondrement :

Parmis ces cinq paramètres, au moins trois sont présents parmi les dix paramètres les plus centraux. Je vous invite à lire le papier dont le lien est ci-dessus et où vous pouvez retrouver les précisions et les résultats.

La suite : une histoire de systèmes récurrents

Le modèle HANDY est une sorte de W3 ultra simplifié avec 4 variables. Pour ceux qui ne le connaissent pas, un article le présente complètement, mais on l’aborde également dans le livre Comment tout peut s’effondrer de Pablo Sevigne.

Scénarios du modèle HANDY
Scénarios du modèle HANDY

On constate dans ce modèle qu’avec certains paramètres (voir graphique c) on atteint un régime oscillatoire, qui pourrait modéliser dans notre monde les apparitions et disparitions de civilisations, qui chacune atteignent une apogée puis un déclin.

Il est possible que W3 puisse atteindre une dynamique semblablement oscillatoire, sur une très longue période, qui commencerait par notre déclin puis l’émergence d’une nouvelle civilisation, etc.

Cette hypothèse nous permettrait d’appliquer sur W3 des analyses sur des systèmes récurrents existantes afin de sortir des données intéressantes comme des temps caractéristiques du système (période, temps d’équilibre, etc). Je rapproche cette analyse de l’analyse de Fourier, appliquée à un modèle DS.

De même, on peut se rendre compte que dans cette hypothèse, la transition après un équilibre mène vers un autre équilibre : jusqu’à la civilisation thermoindustrielle, le système Terre a connu un équilibre ; nous sommes en train de vivre une période de transition avant un nouvel équilibre.

Quoiqu’il en soit, ce type d’analyse est une piste qu’on pourrait explorer dans l’avenir. En attendant, l’analyse de sensibilité est une étape importante.


  1. les variables peuvent soit directement dépendre d’autres variables, soit dépendre d’une fonction qui dépend d’autres variables quand celle ci demande plus de paramètres – voir billet Du Vensim au Python