Graphe - Devoir Maison propagation du Covid-19
Le but de ce devoir maison est d'utiliser l'algorithmique des graphes pour modéliser une version simpliste de la propagation du Covid-19. Le devoir se décompose en 3 parties d'implémentation, tout d'abord nous mettons en place les paramètres (mortalité, durée de maladie) et les différents graphes. Vient ensuite le rajout de paramètres simples comme des tests sur la population etc. Finalement nous avons tenté de rajouter des facteurs plus réalistes et nous nous sommes un peu écartés du sujet pour proposer des compléments sur la propagation d'une épidémie et pour manipuler les notions de l'algorithmique des graphes.
Avant de commencer nous mettons à votre disposition, la documentation de notre code et l'archive contenant nos codes. La date de la dernière modification du site est présente en début de page pour vous assurer que nous n'avons pas dépassé la date limite.
Partie I - Implémentation d'une base (Nathan & Aurélien)
La première partie permet de définir les bases de la modélisation c'est à dire les différents états, les différents paramètres, les règles de changement d'état, les topologies de graphes étudiés et les différents modèles de ces derniers. Nous reprennons précisément les définitions du sujet.
Graphe circulaire
Dans un premier temps nous allons définir la séquence de graphe permettant de réprésenter l'état du graphe au jour . Peu importe le jour, les sommets du graphe ne changent pas. Ainsi dans une première partie d'initialisation nous construisons le graphe en fonction de la topologie choisie, dans tous les cas le graphe possède sommets. Ensuite vient la construction des arêtes du graphe. Pour le graphe circulaire, cela est effectué dans l'initialisation, en effet les individus ne sont reliés qu'à leurs voisins de droite et de gauche, cela est indépendant du jour. Par construction ce graphe est connexe.
De plus chaque jour, nous devons appliquer les règles de changement d'état à tous les individus, ainsi peut importe la topologie du graphe nous parcourons le graphe, si nous tombons sur une personne malade nous appliquons à tous ses voisins une probabilité de tomber malade, si l'un tombe malade nous initialisons un compteur représentant la durée de sa maladie. Si nous tombons sur une personne malade depuis une durée nous appliquons la probabilité de décéder. A noter que si une personne décède la liste de ses voisins est vidée.
Une fois cela présenté, nous pouvons réaliser une base de l'implémentation. Nous
définissons donc une classe python individu. Cela nous permet de renseigner
les informations importantes sur chaque individu, son état, son identificateur,
le nombre de jour depuis lequel il est malade s'il est malade. Finalement dans
cette version un individu possède aussi un tableau avec l'identificateur de ses
actuels voisins.
Résumons la construction de ce modèle. Tout d'abord nous créons une population
de taille . Cela se fait en initialisant individus et donc en temps
linéaire en fonction de . Ensuite nous créons le graphe circulaire, nous
utilisons une matrice d'adjacence, nous parcourons tous les individus et à
chaque fois nous mettons un 1 dans la case et . Dans le
même temps nous remplissons le tableau des voisins de chaque individu. La
création de ce graphe est donc réalisé en O(n) où est
le nombre d'individu. Nous devons ensuite appliquer le modèle en fonction
de ou , cette fonction à une complexité O(n*k') en effet il faut
pour chaque individu lui faire choisir contact parmis ses
fréquentation. Dans le graphe circulaire vaut toujours 2, ainsi
peut valoir 2 et donc cela ne change rien ou 1. A ce stade nous avons initialisé
correctement le graphe, la complexité de l'initialisation est majorée par
O(n*m) où est le nombre moyen de voisins.
Passons maintenant au détail de la propagation jour par jour. Chaque jour nous
devons parcourir tous les individus. Si nous sommes dans un modèle dynamique nous
devons actualiser les voisins. Ensuite si l'individu est malade depuis
jours, lui appliquer une chance de mourir, si l'individu est en contact avec des
malades lui appliquer une chance de devenir malade. Finalement nous ajoutons un jour
de maladie à tous les malades. Ainsi pour calculer l'état du graphe au jour
nous avons une fonction de complexité è O(n+m) où est le nombre
moyen de voisin d'un individu.
Nous pouvons à partir de cela établir notre code final pour le graphe circulaire en modèle
statique et dynamique. Nous initialisons dans un premiers temps le graphe et la
population. Nous faisons ensuite appel à la fonction de propagation jour par
jour le nombre de jours que nous voulons (par défaut 180), nous avons ajouté
certainnes fonctionnalités nous permettant de récupèrer chaque jour une image du
graphe et le nombre de malade, sain, remis ou décédés. In fine notre
algortihme principal à une complexité de O(nbr jours * n * m).
Nous pouvons commencer, comme le sujet nous y invite, à simuler la propagation dans une graphe circulaire, tout d'abord dans le modèle statique et dynamique avec des populations de 50 et 10000 individus en prenant comme paramètres dans cette topologie la variation de influe peu sur les résultats nous prenons . Voici quelques animations permettant de visualiser la propagation dans les différents graphes au fur et à mesure des jours.

Nous pouvons tout d'abord observer la propagation de la maladie sur le graphe circulaire, cela est conforme à nos attentes, la maladie se propage de voisin en voisin et au bout de 14 jours chaque malade devient soit guéri soit mort. Etant donné que nous avons une chance de de mourir nous avons aucun mort car nous avons une population restreinte uniquement de 50 individus.
Nous avons en parallèle tracé l'évolution des quatre groupes (malades, guéris, jamais infectés, décédés) sur une population de 10 000 individus, nous voyons qu'à cause de la faible propagation du virus la maladie ne s'est pas diffusé dans la population. Cependant il apparaît clairement que les résultats sont peu satisfaisants, en effet le graphe circulaire est relativement simpliste et ne représente que très peu les connexions humaines. Nous devons alors parfaire notre modèle.