Apprendre Maple Automate cellulaire feu de forêt

 
  Page d'accueilPage d'accueil   RechercherRechercher   Forum de discussionForum de discussion   ContactContact   SommaireSommaire 
  Cours MapleCours Maple   Travaux dirigésTravaux dirigés   Thèmes d'activitésThèmes d'activités   Thèmes d'activitésMaplets
Ecran MapleEcran Maple  TéléchargementTéléchargement  BibliographieBibliographie  LiensLiens  

 

 

Page d'accueil   Thèmes d'activités   << Thème précédent  Thème suivant >>


Automate cellulaire feu de forêt

Chaque cellule d'une grille carrée n x n peut se trouver dans l'un des quatre états:
vide (blanc: code 0) ; arbre (vert: code 1) ; cendre (gris: code 2); feu (rouge: code 3);
Dans la configuration d'origine, chaque cellule de la grille est selon une probabilité p, un arbre, et selon une probabilité 1-p, est vide.
On met le feu à une cellule et on suit la diffusion du feu à travers la grille selon la fonction de transition suivante:
une cellule
arbre prend feu à la génération t si l'une au moins de ses 4 voisines (nord, est, sud, ouest) est en feu à la génération t-1.
Les cellules en feu passeront en cendres à la génération suivante.
Les cellules en cendres deviendront vides à la génération suivante.
(source: CIRAD)

Implémentation de l'algorithme en Maple:

> with(plots):with(geometry):with(plottools):

Dessin de la cellule de la position ( ligne,colonne ) dans la grille n x n , avec une couleur RGB( a,b,c)  avec a,b,c entre 0 et 1:

> dessin:=proc(ligne::posint,colonne::posint,n::posint,a,b,c)
local x,y;
x:=colonne-1;y:=n-ligne;
polygon([[x,y],[colonne,y],[colonne,y+1],[x,y+1]],color=COLOR(RGB,a,b,c));
end proc;

dessin := proc (ligne::posint, colonne::posint, n::...
dessin := proc (ligne::posint, colonne::posint, n::...
dessin := proc (ligne::posint, colonne::posint, n::...
dessin := proc (ligne::posint, colonne::posint, n::...

> display([seq(seq(dessin(i,j,10,i/10,j/10,i*j/100),j=1..10),i=1..10)]);

[Maple Plot]

Configuration initiale: grille n x n, probabilité p (entre 0 et 1) cf préambule

> init:=proc(n::posint,p::numeric)
local hasard,h,i,j,L,T,V;
T:=NULL;
hasard:=rand(1..n^2);
for i to n^2 do
h:=hasard();
if h<=n^2*p then T:=T,1 else T:=T,0 end if;
# on met un code 1 (arbre) avec une probabilité p
# et un code 0 (vide) avec une probabilité 1-p
end do;
# construction d'une liste de n sous-listes
# (chaque sous-liste correspond à une ligne de la grille)
V:=NULL;
for i to n do
L:=NULL:
for j to n do
L:=L,T[n*(i-1)+j]
end do;
V:=V,[L]
end do;
[V]
end proc;

init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...
init := proc (n::posint, p::numeric) local hasard, ...

> a:=init(10,0.6);

a := [[0, 0, 0, 1, 0, 0, 1, 1, 1, 1], [0, 1, 0, 0, ...
a := [[0, 0, 0, 1, 0, 0, 1, 1, 1, 1], [0, 1, 0, 0, ...


Affichage de la grille à partir de la liste courante L:

> afficher:=proc(L::list(list(numeric)))
local i,j,n,T;
n:=nops(L):
T:=NULL;
for i to n do
for j to n do
if L[i][j]=0 then T:=T,dessin(i,j,n,1,1,1) # 0 vide: blanc
elif L[i][j]=1 then T:=T,dessin(i,j,n,0,1,0) # 1 arbre: vert
elif L[i][j]=2 then T:=T,dessin(i,j,n,0.75,0.75,0.75) # 2 cendre: gris
else T:=T,dessin(i,j,n,1,0,0) # 3 feu: rouge
end if;
end do;
end do;
display({T},scaling=constrained,axes=none);
end proc;

afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...
afficher := proc (L::list(list(numeric))) local i, ...

> afficher(a);

[Maple Plot]

Calcul du nb de cellules en feu autour de la cellule (ligne r - colonne c) (nord - sud - ouest - est) dans la configuration L

> nb_en_feu:=proc(L::list(list(numeric)),r::posint,c::posint)
local n,nb,rr,cc;
n:=nops(L);
nb:=0;
if r>1 and L[r-1][c]=3 then nb:=nb+1 end if;
if r<n and L[r+1][c]=3 then nb:=nb+1 end if;
if c>1 and L[r][c-1]=3 then nb:=nb+1 end if;
if c<n and L[r][c+1]=3 then nb:=nb+1 end if;
nb;
end;

nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...
nb_en_feu := proc (L::list(list(numeric)), r::posin...

> nb_en_feu(a,6,4);

0

Mettre le feu à partir de la cellule centrale de la configuration L

> mettre_feu:=proc(L::list(list(numeric)))
local n,r,c,M;
M:=L;
n:=nops(L);
r:=floor(n/2)+1;
c:=floor(n/2)+1;
M[r][c]:=3;
M
end proc;

mettre_feu := proc (L::list(list(numeric))) local n...

> afficher(mettre_feu(a));

[Maple Plot]

Calcul d'une nouvelle configuration à partir de la configuration L en suivant la fonction de transition donnée dans le préambule:

> nouvelle_config:=proc(L::list(list(numeric)))
local n,nb,r,c,nouveau,ligne,cellule;
n:=nops(L);
nouveau:=NULL;
for r from 1 to n do
ligne:=NULL;
for c from 1 to n do
cellule:=L[r][c];
nb:=nb_en_feu(L,r,c);
if nb>0 and L[r][c]=1 then cellule:=3 end if;
if L[r][c]=3 then cellule:=2 end if;
if L[r][c]=2 then cellule:=0 end if;
ligne:=ligne,cellule;
end do;
nouveau:=nouveau,[ligne];
end do;
[nouveau];
end;

nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...
nouvelle_config := proc (L::list(list(numeric))) lo...

Animation de l'évolution du feu:
n x n : taille de la grille, nbgener : nb de générations, p : probabilité (entre 0 et 1) cf préambule

> animation:=proc(n::posint,nbgener::posint,p::numeric)
local anime,config,i;
anime:=NULL;
config:=init(n,p);
anime:=anime,afficher(config);
config:=mettre_feu(config);
anime:=anime,afficher(config);
for i to nbgener do
config:=nouvelle_config(config);
anime:=anime,afficher(config);
end do;
display([anime],insequence=true,scaling=constrained):
end proc;

animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...
animation := proc (n::posint, nbgener::posint, p::n...

> animation(15,40,0.65);

[Maple Plot]

> animation(15,40,0.5);

[Maple Plot]

La probabilité d'observer un incendie restreint est très grande si p est inférieure à 0.55, et au contraire si p est supérieure à 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 (source: CIRAD).
 

 

haut de cette page

 

 


©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.