Projet 2024-25:
Simulation d'un modèle «prédateurs-proies»
Détection de proies par vibration

Vous apprendrez à l'aide de ce projet à réaliser un programme complet et de taille plus importante que ceux avec lesquels vous avez travaillé jusqu'à présent. Votre programme comportera également une composante graphique. Sur le plan informatique, ce projet a pour but de consolider vos connaissances en programmation ainsi que de vous faire pratiquer les concepts essentiels de la programmation orientée-objet  : abstraction et encapsulation, héritage, méthodes virtuelles et polymorphisme.

Il est déconseillé d'imprimer tout l'énoncé du projet : des compléments d'informations peuvent y être apporté en cours de route.

Introduction | Étapes | Références 

Introduction

Tout programme doit être conçu avant d'être implémenté. Cette phase de conception a pour but d'établir une modélisation informatique des composants du programme et elle implique que l'on se pose un certain nombre de questions  : Pour répondre à ces questions, il est évidemment important d'avoir une idée assez précise de ce que l'on veut réaliser. Si ce n'est déjà fait, lisez donc la description du projet qui vous éclairera sur la question.

L'explication ci-dessous a pour but d'ébaucher dans les (très) grandes lignes la conception à laquelle nous vous proposerons d'adhérer pour ce projet.

Premiers pas vers la conception d'un programme

Lorsqu'on lance le programme une fenêtre doit s'ouvrir et afficher la vue macroscopique de la simulation (la simulation à l'échelle des populations). Il sera possible au moyen de touches du clavier de visualiser cet environnement à diverses échelles ou à différents endroits:

L'environnement simulé est peuplé de scorpions et de lézards. Il contient des massifs de cactus qui servent de source de nourriture pour ces derniers.

item ← Simulation à l'échelle des populations




Ici zoomée sur une partie du monde
item

On peut se douter que chacun de ces éléments à l'écran devra avoir un équivalent C++ dans votre code.

Au moyen de touches de contrôle, il vous sera possible de basculer en mode "simulation à l'échelle de l'individu". C'est à cette échelle que vous pourrez observer plus finement les mécanismes de la prédation chez le scorpion. La fenêtre n'affichera alors qu'un scorpion et vous pourrez y créer un lézard pour observer comment le scorpion s'en approche.

Avant d'atteindre ce stade, nous aurons recours à une visualisation relativement abstraite du scorpion, où il sera possible d'observer ses senseurs, neurones et les ondes qu'il perçoit.

item

En concevant le programme, il faut non seulement recenser les éléments à modéliser, mais aussi se poser un certain nombre de questions comme :

Nous ébauchons pour vous dans ce qui suit, les éléments fondamentaux qui vont intervenir dans le programme à mettre en oeuvre.

Objets de base

Au vu de la description qui précède, les classes suivantes semblent imposer d'emblée leur présence:

Plus finement, il apparaîtra rapidement qu'il y a des éléments communs à tous les animaux comme, par exemple, le fait qu'ils aient une position dans le monde, une vitesse de déplacement, un genre etc. Il existera aussi des différences évidentes (ou moins) comme la façon de se nourrir.

On peut donc imaginer une classe de base Animal pour spécifier les caractéristiques et méthodes communes à tous les habitants du monde. Il faudra ensuite spécialiser cette classe de base (notion d'héritage), pour caractériser des attributs et méthodes spécifiques aux lézards et aux scorpions etc.

Pour résumer donc, on peut ainsi anticiper les différents éléments intervenant dans la simulation et proposer progressivement une conception possible pour le programme. Vous trouverez au fur et à mesure de votre progression dans le projet, des schémas détaillés vous expliquant l'architecture du programme à laquelle nous vous proposons d'adhérer. Il est indispensable de la comprendre pour pouvoir l'implémenter correctement. Il est évident que d'autres solutions plus simples, plus compliquées, ou simplement différentes existent. Chacune (simple ou compliquée) a généralement ses avantages et ses inconvénients. Toutefois, la modélisation que nous vous proposons est raisonnable, et la suivre vous permettra d'économiser du temps.

Vous pouvez tout à fait dévier de la conception proposée si vous vous sentez plus à l'aise avec une approche différente. Il faudra cependant veiller à ce que les tests proposés restent opérationnels et documenter/justifier vos choix de conception personnels dans un fichier supplémentaire que vous appelerez CONCEPTION.

Noyau de simulation et affichages graphiques
Pour réaliser la simulation, nous allons faire évoluer les composants du programmes au cours du temps (la faune, la flore etc.).

Le temps est échantillonné (on parlera de pas de temps discrets). A chaque pas de temps, chaque animal, par exemple, pourra subir ou être à l'origine d'un certain nombre d'événements selon le contexte (se nourrir, se détourner d'un obstacle etc.). Ces actions déterminent l'évolution du système au cours du temps. Il faudra bien entendu re-afficher les composants après chaque événement pour effctivement visualiser l'évolution du système.

Les éléments du système auront donc de façon générale :

Une bonne conception fera en sorte que ces différentes facettes du programme soient indépendantes : par exemple les aspects comportementaux doivent pouvoir être simulés indépendamment de l'affichage graphique (de sorte à pouvoir par exemple changer l'interface graphique sans avoir à changer le reste du programme).

Les directives de l'énoncé du projet vous aideront à aboutir à une conception qui va dans ce sens.

Le noyau de simulation, qui va faire évoluer le monde au cours du temps et tenir compte des éventuelles interventions de l'utilisateur, sera fourni. Ce noyau permettra de :

C'est une classe Application fournie qui sera chargée de cette mission (elle se déclinera en nombreuses variantes, par le biais de l'héritage, afin de vous permettre de tester différents aspects de votre programme). Le principe de fonctionnement du noyau de simulation vous sera expliqué en temps voulu. Il fait appel aux fonctionnalités de la librairie SFML que vous avez déjà eu l'occasion de pratiquer un peu en séance de TP.

Bibliothèque graphique

Il n'existe pas de bibliothèque standard en C++ pour définir des interfaces graphiques. Chacune des bibliothèques existantes a donc ses propres spécificités (fonctionnalités, prototypes, etc).

Parmi les possibilités :

C'est cette dernière option que nous avons retenue, pour sa simplicité d'utilisation. Elle vous fournira les fonctionnalités nécessaires au graphisme et à la gestion d'événements dans votre programme.

Le support de l'équipe enseignante n'est garanti que pour l'environnement suggéré. Si vous travaillez dans vos propres environnements, il est impératif que vos programmes tournent aussi sur les VMs de l'EPFL.

Inscription

Si vous n'êtes pas encore inscrits, faites-le avant le lundi 17 Mars à 18h!


Étapes

Créez un sous-répertoire projet dans le répertoire ~/myfiles/cpp. Tous les fichiers concernant ce projet devront se trouver dans le répertoire ~/myfiles/cpp/projet.

Un échéancier des différentes étapes est donné dans la description du projet. De plus, vous trouverez ci-dessous des conseils sur les classes à implémenter et comment le faire. Il est recommandé de suivre ces indications, mais vous pouvez évidemment ajouter ou modifier les éléments que vous désirez afin de personnaliser votre programme.

Le projet est conçu pour être fait à deux. Donc partagez vous le travail dès que vous commencerez à vous sentir à l'aise avec le sujet.
Développer en parallèle et de façon complémentaire est à coup sûr une expérience instructive, mais qui nécessite évidemment une bonne communication entre vous pour être efficace.

Vous pouvez tout au long du développement vérifier votre programme à l'aide de petits programmes de test. Pour débugger votre programme, vous avez deux possibilités (qui souvent sont utilisées en conjonction) :

  1. utiliser des cout (ou, beaucoup mieux, des cerr) pour identifier l'endroit où le programme "plante" ainsi que la valeur des attributs à cet endroit
  2. utiliser "debugger", est indispensable pour certains types d'erreurs.

Important: L'énoncé fourni est assez détaillé mais ne donnera pas nécessairement toutes les indications. Il faut donc compléter ce qui vous est fourni par un peu d'investigation personnelle. Les assistant.es - en particulier votre coach - sont là pour vous aider. Il est aussi possible que des compléments d'indications soient fournis en cours de route si cela s'avérait nécessaire.

Les archives nécessaires sont fournies au fur et à mesure qu'elles deviennent nécessaires.

N'oubliez pas de commenter votre code et de coder proprement. Une partie de la note finale en sera impactée. De plus, cela vous facilitera la tâche lorsque vous devrez relire votre code après plusieurs semaines.


Étape 1 : Classe utilitaire (échauffement)

But: Implémentation d'une classe de base permettant de modéliser des entités abstraites que l'on peut positionner et déplacer dans un monde torique.

Concepts nécessaires: classes, encapsulation, constructeurs, destructeurs et surcharge d'opérateurs

Ces concepts sont expliqués dans le cours 16, 17 & 18.

Durée prévue pour le codage : 1 semaine encadrée de TP (depuis le mardi de la semaine 5 compris, jusqu'au mardi de la semaine 6 non-compris, selon la numérotation du plan du cours)

Cliquez ici pour accéder à l'énoncé de cette partie.


Étape 2 : Promenade au hasard

But: Implémenter des animaux abstraits capables de se déplacer aléatoirement dans leur environnement et de se diriger vers des cibles.

Concepts nécessaires: classes d'objets, constructeurs/destructeurs, surcharge d'opérateurs et héritage

Ces concepts sont expliqués dans les cours 16, 17, 18 & 19.

Durée prévue pour le codage: 2 semaines de TP (depuis le mardi de la semaine 6 compris, jusqu'au mardi de la semaine 8 non-compris, selon la numérotation du plan du cours)

Cliquez ici pour accéder à l'énoncé de cette partie.


Étape 3 : Cycles de vie

But: Simuler le cycle de vie complet des lézards et des scorpions (consommation de nourriture, reproduction, prédation, fuite et mort).

Au terme de cette étape, les fonctionnalités nécessaires à simuler la dynamique des populations seront toutes mises en oeuvre.

Concepts nécessaires: classes d'objets, constructeurs/destructeurs, héritage et polymorphisme.

Ces concepts sont expliqués dans les cours 16, 17, 18, 19 & 20.

Durée prévue pour le codage: 2 semaines encadrées de TP (depuis le mardi de la semaine 8 compris, jusqu'au mardi de la semaine 10 non-compris, selon la numérotation du plan du cours)

Cliquez ici pour accéder à l'énoncé de cette partie.


Étape 4 : Modèle neuronal du scorpion

Buts: Simuler les mécanismes de prédation à l'échelle du scorpion (modèle neuronal).

Concepts nécessaires: classes, constructeurs/destructeurs, héritage et polymorphisme

Ces concepts sont expliqués dans les cours 16, 17, 18, 19, 20 & 21.

Durée prévue pour le codage: 2 semaines encadrées de TP (depuis le mardi de la semaine 10 compris, jusqu'au mardi de la semaine 12 non-compris, selon la numérotation du plan du cours.

Cliquez ici pour accéder à l'énoncé de cette partie.


Étape 5 : Statistiques

Buts: Compléter le système de sorte à afficher des statistiques de simulation.

Concepts nécessaires: classes, constructeurs/destructeurs, héritage et polymorphisme

Ces concepts sont expliqués dans les cours 16, 17, 18, 19, 20 & 21.

Durée prévue pour le codage: 1 semaine encadrée de TP (depuis le mardi de la semaine 12 compris, jusqu'au mardi de la semaine 13 non-compris, selon la numérotation du plan du cours.

Cliquez ici pour accéder à l'énoncé de cette partie.


Étape 6 : Extensions libres

Buts: Coder des extensions librement choisies.

Concepts nécessaires: classes, constructeurs/destructeurs, héritage et polymorphisme

Ces concepts sont expliqués dans les cours 16, 17, 18, 19, 20 & 21.

Durée prévue pour le codage: 1 semaine encadrée de TP (depuis le mardi de la semaine 11 compris, jusqu'au mardi de la semaine 13 non-compris, selon la numérotation du plan du cours.

Cliquez ici pour accéder à l'énoncé de cette partie.


Quelques références

Vous trouverez également des références sur le langage C++ ici.