Projet : étape 6
Extensions
But:
Mettre en oeuvre des extensions libres (optionnel).
Il existe toute sorte d'extensions possibles au projet. Quelques pistes vous sont données en vrac dans ce qui suit en guise de source d'inspiration. Libre cours à votre imagination. Toute «jolie» (intellectuellement ou visuellement) extension non triviale de votre travail est bienvenue !
Aucun matériel n'est fourni pour cette étape. Si vous l'abordez, vous veillerez à placer le code correspondant dans un nouveau répertoire partie6 de sorte à garder intacte la partie obligatoire du projet dans partie5.
Introduction d'obstacles
On peut imaginer d'introduires des obstacles (de simples corps circulaires pour commencer). Les obstacles peuvent permettre de créer des zones autonomes dans les boites de culture où telle ou telle catégorie de bactéries pourrait évoluer en autarcie par exemple.
Il s'agira de :
- modéliser les obstacles;
- les incorporer à la représentation du système;
- faire en sorte que la présence d'obstacles impacte le déplacement des bactéries : celle-ci devront rebondir en cas de collision avec un obstacle. Les bactéries à grappin ne pourront lancer leur tentacule au delà d'un obstacle.
Interactions entre bactéries
Le projet, tel que développé jusqu'ici, ne gère pas d'interactions entres les bactéries. Vous pouvez y remédier en introduisant des interactions :
- indirectes : un type de bactérie altère l'environnement, par exemple en y lâchant du poison, et cette altération a une incidence sur la vie des autres;
- directes : un type de bactérie agresse les autres (ou certaines autres).
Il s'agira dans les deux cas d'introduire un nouveau type de bactéries dont la représentation et les caractéristiques sont laissées à votre libre choix pour ce qui est des divisions, mutations, etc. Quelques indications sur les problématiques à traiter sont données ci-dessous.
Interactions indirectes
Si l'on prend l'exemple de bactéries lâchant du poison, il s'agira de se pencher sur les questions suivantes :
- comment modéliser la présence de poison dans l'environnement ?
- comment faire en sorte que les bactéries soient impactées par le poison?
- quelles bactéries seront impactées (toutes ? uniquement celles de type différents que celles diffusant le poison? ...) et comment?
- introduit-on des mutations liées à la résistance au poison?
- etc.
On peut par exemple considérer que la quantité de poison lâchée à un endroit est similaire à une source de nutriments (avec perception du gradient par les bactéries) qui pourront alors être impactées dans leur niveau d'énergie et/ou adopter un comportement de fuite.
Interactions directes
On peut introduire une nouvelle catégorie de bactéries causant des dommages aux autres (voir ces exemples ou ceux-ci).
Il s'agira alors :
-
de définir la notion de voisinage (rayon dans lequel la bactérie peut effectivement en attaquer une autre);
- de trouver les bactéries vulnérables à l'attaque (présentes dans le voisinage) et de définir si toutes sont vulnérables ou seulement certaines (en fonction de leur type);
- de définir concrètement les modalités de l'"attaque" et son impact.
Les problèmes principaux qui se poseront alors seront les suivants:
- Identifier les bactéries du voisinage peut-être coûteux (cela implique potentiellement de balayer à chaque fois toute la collection de bactéries !).
- Si des interactions différenciées sont gérées (la bactérie agressive n'agresse pas ceux de son type mais les autres au certaines autres et peut-être pas toutes de la même façon). Comment procéder sans recourir au test de type?
Un réalisation informatique soignée pourra apporter des réponses adéquates à ces questions :
- Pour le problème 1 : Plutôt que de regarder si chacune des autres bactéries est dans le voisinage d'une bactérie (agressive) donnée, il est possible d'échantillonner l'espace par un certain nombre de «cases» (portions de l'espace quadrillant les boites de culture). L'idée est que chaque bactérie sait à tout moment dans quelle case elle se trouve et chaque case connaît la liste des bactéries qu'elle contient. A chaque déplacement d'une bactérie, on la supprime de sa case et on l'ajoute dans sa nouvelle case. Ceci permettrait de retrouver très rapidement les bactéries voisines d'une autre bactérie. Pour accéder à une case depuis une bactérie, le plus simple est de choisir une convention de représentation, par exemple bien choisir les unités des positions de sorte que la partie entière des coordonnées donne directement accès à la case correspondante, les différentes cases étant alors gardées en mémoire sous forme d'un tableau tridimensionnel.
- Pour le problème 2: vous pourrez vous inspirer de l'effet "double dispatch" obtenu à l'étape 5 au moyen de la surcharge de méthodes.
Simulation avec points de reprise
Il est intéressant de pouvoir sauvegarder l'état d'une simulation (nombres et type de bactéries ainsi que leurs caractéristiques, nutriments présents etc.) pour pouvoir la relancer dans le même état plus tard.
L'idée est de stocker les données caractérisant la simulation dans un fichier en format json afin de pouvoir relancer la simulation sur la base de ce fichier plus tard. Il faudra pour cela étudier les fonctionnalités offertes par les fichiers JSON/JSONSerialiser.[hpp][cpp]
Il faudra également compléter la classe Application en y ajoutant la gestion de nouvelles touches ainsi que des fonctionnalités permettant la mise en oeuvre de la simulation avec points de reprise.
Autres pistes encore ...
De nombreuses possibilités existent encore, en vrac quelques unes:
- simuler d'autres comportements de groupe pour les bactéries (attaque groupée ou encerclement de bactéries ennemies);
- introduire d'autres facteurs environnementaux agissant sur la simulation (lumière, PH etc);
- introduire des comportements plus sophistiquées des sources de nutriments (se dégradant, changeant d'aspects en fonction de la température ou du temps etc.)
- libre cours à votre imagination ...
Retour au document principal