Simulation de population
Qualité de Développement - R4.02
Le thème de ce TP est d’améliorer une preuve de concept de simulation de population.
L’objectif de cette simulation de population est à terme d’évaluer l’influence de mesure sanitaires sur l’évolution d’une épidémie.
Vous trouverez un prototype dans cette archive.
Vous devriez être en mesure de compiler puis lancer l’exécutable en lançant la
commande cargo run dans un terminal à l’intérieur du projet.
La première compilation peut prendre un peu de temps puisque qu’elle requiert
l’installation de la bibliothèque egui.
Vous devriez obtenir une fenêtre semblable à ceci :
Le code du prototype est organisé comme suit :
-
le fichier
main.rscontient le code permettant de lancer l’interface graphique, soit dans une fenêtre, soit dans un navigateur web. Vous ne modifierez pas ce fichier. -
le fichier
lib.rsest le module racine de votre package. Il contient les déclarations des modules de celui-ci. -
le fichier
app.rscontient la logique de l’interface graphique et de la simulation. -
Dans ce fichier, vous trouverez la structure
SocialSimulationAppqui contient pour le moment les données des individus. -
La logique de déplacement des individus est implémentée dans la méthode
updatede cette structure.
Première impression
En examinant le code, remplissez le document "EvaluationQualite.md" qui se trouve dans le projet. Vous devrez l’ajouter à votre Git, il sera évalué.
Améliorations attendues
Ne vous lancez pas tout de suite dans la réalisation de ces améliorations. Le travail commencera par une structuration du code, notamment en séparant la logique de simulation de la logique d’affichage.
Structuration
Afin de clarifier le code, commencez par séparer la partie simulation de la partie graphique. Pour cela, vous allez créer des modules et des structures de données pour organiser le code implémentant la logique de la simulation.
Organisez les données et leurs méthodes, sans hiérarchie de classe puisqu’il n’y a pas d’héritage en Rust, mais à l’aide de modules.
Une proposition de hiérarchie de modules est représentée ci-dessous :
Vous n’aurez pas besoin des "Traits" pour obtenir une structure déjà cohérente. Vous pouvez vous référer au support de cours sur la structuration pour construire votre hiérarchie de modules.
Seules les fonctions new et update de SocialSimulationApp sont à modifier
pour utiliser les nouvelles structures de données.
Structures de données
Commencez par déclarer les structures de données dont vous aurez besoin.
Fonctions
En utilisant la méthodologie TDD, implémentez les fonctions dont vous aurez besoin.
À ce stade vous devez avoir obtenu le même fonctionnement que le prototype mais avec une qualité de code bien meilleure.
Pensez à commiter et pousser votre travail.
C’est une bonne idée de faire un "tag" sur cette version (ce commit)
Épidémie - Propagation
Ne commencez pas cette partie tant que vous n’avez pas terminé la partie précédente.
Comme première amélioration et toujours en mode TDD, faites en sorte que l’état des individus évolue en fonction de :
-
Leur état courant
-
L’état des autres individus dans un rayon de contamination
-
Une probabilité de contamination
-
Une probabilité de survie
Commitez, poussez et taguez cette version.
Configuration depuis un fichier
Ajoutez la possibilité de configurer la simulation à partir d’un fichier. Choisissez un format de fichier pour lequel des parseurs existent, json ou toml sont des exemples.
Mesures sanitaires globales
Ajoutez la possibilité d’activer des mesures sanitaires globales :
-
Port du masque : influence la probabilité de contamination lorsque des individus sont à proximité.
-
Vaccination : influence sur la probabilité de contamination et sur la probabilité éde décès.
Production de résultats
Maintenant que vous avez une première version de simulation il est temps de produire des résultats.
Pour exploiter les résultats, vous pouvez au choix :
-
Tracer les nombres de personnes dans chaque état à l’aide de egui_plot ou
-
Produire des fichiers de log contenant les différentes données intéressantes. Dans ce deuxième cas, vous choisirez le format du fichier judicieusement pour pouvoir générer des graphs.
Évaluation
L’ordre des critères est pertinent : un code de meilleure qualité mais avec moins de fonctionnalités sera plus valorisé lors de l’évaluation.
Extensions bonus suggérées
Si vous avez terminé les fonctionnalités attendues avec un niveau de qualité satisfaisant et que le sujet vous intéresse, vous pouvez proposer des améliorations de la simulation.
Vous pouvez par exemple travailler sur :
-
L’amélioration de l’aspect graphique de la simulation.
-
La possibilité de lancer la simulation en mode "headless", sans l’affichage graphique pour rendre la simulation plus rapide.
Ajout de lieux particuliers dans l’environnement
Vous ajouterez dans l’environnement différents types de lieux :
-
Domicile
-
Travail
-
Magasins
-
Lieu publique
-
École (pour certains individus)
Vous ferez ensuite en sorte que les individus possèdent une liste de lieux et naviguent entre ces lieux pour simuler les croisements plus fréquents que lors de déplacements aléatoires. Procédez de manière incrémentale.
Comportements individuels
Afin de pouvoir évaluer l’impact de mesures sanitaires s’appliquant aux individus comme le télé-travail ou la restriction des contacts sociaux à un groupe restreint, vous allez ajouter un comportement individuel de déplacement aux individus.
Mesures sanitaires liées aux déplacements
Ajoutez la possibilité d’activer des mesures sanitaires liées aux déplacements :
-
Télétravail, les individus ne vont plus au travail.
-
Confinement : seuls quelques individus vont au travail, les écoles sont fermées, les fréquences de déplacement sont réduites.
Parallèlisation de la simulation
Utiliser des threads ou une bibliothèque comme rayon pour paralléliser la simulation.