Exercices

Exercices session mars 2004

  1. faire tourner la classe training.AppletGetSize
    1. quand est-ce que paint() est appelé?
  2. comparer SimpleCanibalModel avec DelegationWithCanibalism
    1. comment peut-on ajouter du canibalisme à n'importe quel modèle Individual sans écrire une nouvelle classe à chaque fois ?
    2. ouvrir le diagramme Bluej : cette possiblité d'amélioration était-elle visible ?
  3. inventer des nouveaux modèles; on pourra avoir des équipes qui créent des modèles, et d'autres qui les testent et les intègrent; suggestions de modèles :
    1. modèle qui tue tout le monde : rapidement, ou de proche en proche : épidémie, ou attiré par les groupes
    2. changer le SimplePredatorModel pour qu'il fasse la mise à mort
    3. changer un modèle proie pour qu'elle passe à un état "mort" mais reste là
    4. créer un modèle charognard
    5. modifier le modèle alétoire de base pour qu'il ait un comportement d'exploration, cà dire qu'il ne repasse pas trop vite au même endroit
    6. comment faire pour programmer le "jeu de la vie" de John Conway en changeant le minimum de choses dans notre application ? Une Applet du "jeu" de la vie 
    7. simuler un comportement territorial
    8. simuler une entrave, c à dire quelque chose qui limite la vitesse d'un modèle existant
  4. initialisation: voir le paragraphe du 2004-01-29 dans README.html
    1. quelles pourraient être les variantes de l'initialisation, c à dire les manières possibles d'initialiser ?
    2. suggérer une interface Java qui convienne pour les différentes variantes
    3. en implémenter une au choix
    4. comment peut-donner le choix à l'utilisateur de la manière d'initialiser ( conseil : examiner la classe IterativeSimulationChoiceWrapper)
  5. modèle de terrain: voir le paragraphe du 2004-01-29 dans README.html
    1. proposer un modèle minimal pour prendre ne compte le domaine physique (au moins un rectangle)
    2. où faire la conversion des coordonnées domaine physique ==> coordonnées graphiques ?
    3. en tirer les conséquences au niveau de l'application MultipleModelsAppWithEditor, et implémenter cela
  6. proposer une conception Java pour des modèles à base d'équations Differentielles; on garde la notion d'individu qui a son propre modèle (voir exercice 8 janvier)
    1. on voudrait que la gestion de l'avancement du temps de la simulation soit commune aux modèles itératif et différentiels : intégrer ce besoin et proposer une modification de la conception Java pour cela
    2. on voudrait qu'une simulation puisse mélanger des modèles itératif et différentiels : intégrer ce besoin et proposer une modification de la conception
    3. en tirer les conséquences au niveau de l'application MultipleModelsAppWithEditor, et implémenter cela
  7. ajouter dans l'entrée des données générique (éditeur des propriétés JavaBean) la classe de TROUPEAUX de de Mr Treuil qui permet d'entrer les données numériques à la fois avec un curseur (Slider) et un champ de saisie
    1. s'arranger pour que le curseur et le champ de saisie soient synchronisés

Exercices session janvier 2004

Exercice 10 : dessiner en mémoire (sur un bitmap) pour pouvoir avoir un rafraîchissement même si la fenêtre a été cachée

Exercice 9 : terminer la simulation. pouvoir appliquer un critère de terminaison de la simulation

Exercice 8 : équations différentielles. Analogue à Simulation, on aura une interface Java pour des modèles s'exprimant avec une équation différentielle ordinaire. Plus précisément, chaque individu élémentaire i sera représenté par un vecteur Xi dont les premières composantes seront les coordonnées spatiales. Le système différentiel sera:

dXi/dt = F(X, t) i=0, N-1

Où F est une fonction du vecteur X de tous les individus élémentaires.

Pour un individu élémentaire aussi bien que pour le système entier, on s'inspirera de l'interface ecolosim.numeric.FunctionRn1 pour créer DifferentialIndividual analogue à Individual. Pour la résolution, on utilisera ecolosim.numeric.RungeKutta .

Il faut aussi imaginer une interface DifferentialSimulation analogue à IterativeSimulation pour rassembler les modèles élémentaires et générer le système différentiel global à partir des modèles élémentaires. Cette interface DifferentialSimulation sera implementée par DifferentialSimulationImpl .

Enfin il faut une application graphique analogue à MultipleModelsApp, disons DifferentialModelsApp, qui va montrer les trajectoires.

Exercice 7 bis : initialisation avec de multiples modèles. Pour chacun des types de modèles disponibles, on permettra à l'utilisateur de saisir :

Exercice 7 : introduire BeanPeelerPane dans la fenêtre MultipleModelsApp pour éditer les propriétés du modèle

Exercice 6 : pouvoir modifier en temps réel l'effectif de la population. Pour cela on modifiera l'interface Individual:

public void runModel(IterativeSimulation population);

et on ajoutera dans IterativeSimulation :

public Individual[] getIndividuals();

Pour tester on implémentera 2 comportements:

  1. avec une certaine périodicité, les individus se dédoublent
  2. quand la distance entre 2 individus devient trop faible, un des deux mange l'autre

Exercice 5 : pouvoir lire un fichier tabulaire de positions initiales : on créera une classe utilitaire CSVBridge, avec une méthode :

Simulation createSimulation ( String fileName, Class modelClass)

On ajoutera un bouton "Read initial position" dans l'application MultipleModelsApp

Exercice 4 :

Créer un "emballage" (wrapper) autour de deux classes Individual qui va ajouter les vecteurs déplacements de ces 2 modèles.

On l'appelera VectorAddWrapperModel.

Pour tester on "ajoutera" SimpleAgregationModel et RandomSimpleModel .

Je suggère le squelette suivant où l'on peut "ajouter" un nombre quelconque de modèles :

package ecolosim.simu.models;
public class VectorAddWrapperModel implements Individual {
 public addDisplacement(Individual model) {
   //????
 }
}

Exercice 3 bis : créer une classe prédateur simple, SimplePredatorModel, qui suit le plus proche non-prédateur. On pourra utiliser une interface "marqueur" Predator.

Exercice 3 : raffiner la classe précédente pour faire un barycentre des animaux qui sont à l'intérieur d'un cercle de rayon R. Ce rayon R sera donné par une méthode setVisibilityRadius(double r) .

On l'appelera SimpleAgregationWithVisibilityModel.

Exercice 2 bis : Refactoring: pendant qu'on y est, dans l'application MultipleModelsApp, on remplacera :

Individual modeles[];

par :

IterativeSimulation simul = new IterativeSimulationImpl();

et on supprimera :

Displayer[] afficheurs;

en conséquence, dans afficherPoints() on appelera :

simul.process((Graphics2D)g);

NOTE: Si on veut créer des afficheurs personalisés en fonction du type de modèle et de ses propriétés, il convient de sous-traiter ça à un DisplayerManager.