Simulations 2D d'individus J.M. Vanel IRD 2003/12 Etat des lieux ● ● On a généralisé la notion de modèle, qui sait se calculer, qui représente un être vivant qui se déplace en 2D On a une notion d'afficheur qui fait une exploitation des résultats en temps réel Aller plus loin - modèles ● Avoir plusieurs modèles – Avoir différents exemplaires de RandomSimpleModel dans la même simulation (changer la méthode initCoord() ) – Avoir différentes classes qui implémentent l'interface Modele2DIndividu, avec des fonctionalités supplémentaires ● Multiplication des individus ● Mort des individus ● Dans la classe principale, ne plus stocker dans un tableau mais dans un ArrayList Comportement déterministe, e.g. Tendance grégaire ● Avoir des calculs auxiliaires sur le « troupeau », par exemple le centre de gravité ● Les modèles élementaires, tels que RandomSimpleModel, doivent connaître le « troupeau » ==> interface SuperModele prédateurs – – – Combiner réglages différents et implémentations différentes Aller plus loin - exploitation des résultats Interface ExploitationResultats qui va généraliser Afficheur ● Implémenter des ExploitationResultats tels que: ● ● ● Traçage de courbes brutes Post-traitements (moyennes, écarts types) Organiser la classe principale pour pouvoir brancher (et débrancher) des exploitation de résultats ● Accéder au même objet avec plusieurs types ● ● Modele2DIndividu mm = new RandomSimpleModel(); Object o = mm; RandomSimpleModel rm = (RandomSimpleModel)mm; mm , o , et rm sont 3 références pointant vers le même objet Restructurations de code (refactorings) ● Renommer RandomSimple : la classe a été rebaptisée AppliMultiplesModeles Emballer et exécuter notre application mkdir classes # Compilation javac -d classes numeric/*.java # Vérification ls -lR classes/ cd classes/ #Création de l'archive jar avec tous les fichiers récursivement jar -cvf numeric.jar * # Exécution : on nomme la classe à exécuter: java -classpath numeric.jar numeric/TestRungeKutta # Variante où on nomme la classe à exécuter: c:/j2sdk1.4.2_02/bin/jar.exe -cvfm numeric.jar '..\manifest.txt' * # manifest.txt contient ceci: Main-Class: numeric.TestRungeKutta # ATTENTION: il faut éditer manifest.txt avec un éditeur non Windows # pour les fins de ligne # REMARQUE: quand utilise cygwin il y a jar (et java) de Cygwin, # distincts de ceux de Sun Exécuter notre application sans machine virtuelle sous Linux ou Cygwin gcj --main=TestSimple TestSimple.java ./a.exe Remarque: pour l'instant, il n'y a pas suffisamment de classes pour IHM disponibles avec gcj, cela serait pour du calcul pur. Programme de vendredi ● Runge Kutta ● Écriture sur fichiers ● Chaînes de caractères: split() et StringBuffer ● XML ● ● ● – XMLEncoder – DOM, Xpath (comment parcourir et exploiter) Rétro-ingéniérie UML (analyser du code Java avec ArgoUML) Avancer sur notre appli. de simulation: pouvoir brancher des traitement de résultats et des modélisations Montrer les techniques JavaBeans et introspection (génériquement parcourir des objets) Modèle explicite Avant: modèle caché dans des syntaxes non-standard while(population.next()) { idIndiv = population.nextElement(); //-------------------------------budget=(Nombre) budgets.val(idIndiv); position = positions.val(idIndiv); ressource = (Nombre)ressources.val(position); effectif = (Nombre)effectifs.val(position); //-------------------------------charge = effectif.divi(surface); if(ressource.isInférieur(charge)) { budget.moins(1.0); } else{ budget.plus(1.0); } } Après : modèle dans une syntaxe C/C++/Java standard for (Iterator individu = population.iterator(); iter.hasNext();) { double budget = individu.budget; double ressource = individu.position.ressource; double effectif = individu.position.effectif; // THE modèle ! double charge = effectif / surface; if ( ressource < charge ) budget--; else budget++; Persistance ● ● ● Stocker un graphe d'objets avec XMLEncoder Avantages / inconvénients Autres solutions: Castor, XMLBeans Fait par J.M. Vanel avant session janvier ● Valider la classe RungeKutta solveur d'équations différentielles ordinaires; ● Compiler avec gcj; mesurer les gains de performance par rapport à une JVM Thèmes Java/développement proposés pour janvier ● ● ● ● ● ● Configurer et mettre à jour eclipse Partager du code et gérer les modifications/versions avec CVS + sourceforge.net Réutiliser des bibliothèques externes: exemple JFreechart, PtPlot de Ptolemy (traçage de courbes) Javadoc (documentation automatique de code Java) Gestion des dépendances entre paquetages internationalisation à l'aide d'eclipse Environnement modélisation - reste à faire ● Séparer traitement fichiers CSV dans une classe à part ● Introduire IterativeSimulationImpl dans un programme graphique tel que AppliMultiplesModeles, comme on a fait en introduisant IterativeSimulationImpl dans AppliLigneDeCommande ● concevoir un pont entre objets métiers et le solveur d'équations différentielles ordinaires ● Sauver et relire les données de simulation avec XMLEncoder et XMLDecoder ● Brancher l'éditeur générique JavaBeans dans AppliMultiplesModeles pour pouvoir saisir les paramètres de modèles ● Pouvoir configurer l'éditeur générique JavaBeans pour avoir des Sliders en plus ou à la place des champs de saisie ● Écrire un modèle superposant une tendance aléatoire avec une tendance grégaire ● Trouver une solution de traçage de courbes avec (OpenOffice trop long à l'exécution) ● Renommer run() de Model en runModel() pour ne pas interférer avec le run() de Runnable() ● Comprendre pourquoi il y a une image fantôme du bouton dans le programme graphique AppliMultiplesModeles, Développement environnement simulation Geodes ● Gestion de terrain: proximité, obstacles, champs scalaires, etc Intégrer modèles de Patrice et Fadia ● Multiplication, division, mort des individus ●