150 likes | 234 Views
J.M. Vanel IRD 2003/12. Simulations 2D d'individus. 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.
E N D
J.M. Vanel IRD 2003/12 Simulations 2D d'individus
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 applicationsans 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(Iteratorindividu=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