|
Demo_FireAutomate cellulaire feu de forêtChristophe Le Page, François Bousquet, Pierre Bommel (Cirad) ObjectifCe modèle illustre les principes des automates cellulaires implémentés avec Cormas. L'entité spatiale du modèle, Plot, peut se trouver dans quatre états: #fire (rouge); #forest (vert); #ash (gris); #empty (blanc). Chaque cellule de la grille spatiale est initialement, selon une probabilité p, une forêt, et selon une probabilité 1-p, vide. On met le feu à une cellule et on suit la diffusion du feu de proche en proche à travers la grille spatiale selon la fonction de transition suivante: une cellule en forêt prend feu au temps t si l'une au moins de ses 4 voisines (nord, est, sud, ouest) est en feu au temps t-1. Les cellules en feu passeront en cendres au temps suivant, les cellules en cendres deviendront vides au temps suivant.
La probabilité d'observer un incendie restreint est très grande
si p est inférieur à 0.55, et au contraire si p
est supérieur à 0.55, c'est un incendie global qui a de fortes
chances de se produire. Ce seuil dit de "percolation"
caractérise ce type d'automate cellulaire représentant des
processus de diffusion.
Les quatre versions suivantes décrivent quatre manières différentes d'implémenter un modèle de diffusion du feu sur une grille. Pour ces 4 versions, nous considérons uniquement trois états possibles : en forêt, en feu, ou vide (#forest, #fire, #empty). Le feu ne s'éteind pas de lui-même (sauf pour la version 4b).
Version 1 : automate cellulaire** Sélectionner Fire_1_CA.pcl du modèle Demo_Fire ** Cette version propose une version classique d'automate cellulaire. Ici, seule une classe est créée (Plot), sous classe de SpatialEntityCell. Elle contient donc déjà deux attributs : state et bufferState. Ici, nous déclarons #empty comme valeur par défaut : Pour créer l'espace initial, il faut sélectionner une des 3 méthodes d'initialisation : init_4 (qui créé un espace de voisinage 4), init_6 (voisinage de 6, ou init_8 (voisinage de Moore). Chacune de ces méthodes utilise l'initialisation générale suivante : A noter que xSize et ySize ont été déclarés comme 2 attributs du modèle (avec 50 comme valeur par défaut). Pour la dynamique du feu, il faut redéfinir la méthode #newState (aussi appelée "Fonction de transition") au niveau de la classe Plot, de la façon suivante : Il est important de noter ici que l'état de la cellule n'est pas modifié mais uniquement son état tampon (bufferState). Par exemple, dans le cas d'une cellule en forêt en contact avec un feu, celle-ci garde son état forêt, mais modifie juste son état tampon (self bufferState: #fire), ce qui fait que cette cellule continue pour ce tour d'être considérée par les autres cellules comme étant encore une forêt. Et au niveau de la méthode #step: t de l'ordonnanceur, il faut faire un simple appel à : self stepSynchronouslyCA: t.La méthode #stepSynchronouslyCA: est défini au niveau de CormasModel. Elle exécute 2 boucles complètes de l'ensemble des cellules. La 1ère boucle fait exécuter la méthode #newState à chaque cellule (donc sans changement effectif de l'état), puis une deuxième boucle fait exécuter la méthode #updateState. C'est seulement à ce moment-là que l'état des cellules est effectivement modifié. Version 2 : propagation à partir des cellules en feu** Sélectionner Fire_2_CAoptimized.pcl du modèle Demo_Fire **Cette version propose une diffusion par les cellules en feu uniquement. Il s'agit donc à chaque pas de temps de sélectionner les cellules en feu, puis d'activer pour chacune la propagation du feu sur les voisines. Par rapport à la version 1, deux méthodes sont ajoutées dans la classe Plot : #ignite (qui change l'état de la cellule en feu) et #spreadFire (qui propage le feu sur les cellules forets voisines). Pour éviter les artéfacts liés au parcours régulier des cellules, l'ordonnanceur doit sélectionner au préalable les cellules en feu, puis activer leur diffusion : Cette version propose également une procédure plus optimisée qui évite le parcours au préalable de la grille pour ne sélectionner que les cellules en feu (cf. methode #step: t). Version 3 : une entité spatiale (agrégat) se répand sur les cellules en forêt** Sélectionner Fire_3_FireAggregate.pcl du modèle Demo_Fire **Dans cette version, le feu représente une étendue spatiale qui se répand sur les cellules en forêt qui la bordent. Cette entité est appelée FireAggregate ; c'est une sous-classe de SpatialEntityAggregate. Ici, seules les entités FireAggregates sont activées : self theFireAggregates do: [: f | f spread].Chaque agrégat exécute alors la méthode #spread qui se compose de l'instruction suivante : self swellConstraint: [: p | p state = #forest].Une entité fireAggregate (avec son contour) A noter que l'affichage du contour des agrégats ralenti la simulation. Sans cet affichage (pov -> FireAggregate -> #nil), les simulations sont aussi rapides que dans la version 2. Version 4 : des entités Feu se déplacent** Sélectionner Fire_4_FireEntity.pcl du modèle Demo_Fire **Dans cette version, des entités Feu (FireEntity) sont créées. Ce sont les seules entités activées par l'ordonnanceur. Considérées comme des agents actifs, ces entités se propagent en créant de nouvelles entités feu sur les cellules voisines : La méthode #moveTo: a été redéfinie afin d'activer l'ignition des cellules lors d'un déplacement : Version 4b : des entités Feu se consument et s'éteignent** Sélectionner Fire_5_FireEntityAging.pcl du modèle Demo_Fire **
|
|