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;
>
display([seq(seq(dessin(i,j,10,i/10,j/10,i*j/100),j=1..10),i=1..10)]);
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;
>
a:=init(10,0.6);
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(a);
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(a,6,4);
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;
>
afficher(mettre_feu(a));
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;
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(15,40,0.65);
>
animation(15,40,0.5);
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).
|