Modélisation d'un feu de foret via un automate cellulaire


Contenu du snippet

Un AC qui modélise un feu de forêt par des règles très simples.
La fonction permettant un réglage (assez foireux) de la densité d'arbres a pour but l'étude du seuil de percolation.

Source / Exemple :


PROGRAM feu_de_foret;   {by FHR}

USES Crt;

TYPE matrice = ARRAY [1..40,1..40]  OF WORD;

VAR t,tab1,tab2:matrice;
    s:CHAR;
    nbretours:WORD;
    bol:BOOLEAN;
    dens:WORD;

PROCEDURE Affiche (tab:matrice);
VAR i,j:WORD;
BEGIN
     FOR i:=1 TO 40 DO
     BEGIN
          FOR j:=1 TO 40 DO BEGIN
              IF tab[i,j]=0 THEN Write(' ');
              IF tab[i,j]=1 THEN Write('X');
              IF tab[i,j]=2 THEN
              BEGIN
                   Textcolor(red);
                   Write('O');
                   Textcolor(white);
              END;

          END;
          Writeln;
     END;
END;

PROCEDURE Aleat (VAR tab:matrice;d:WORD);
VAR i,j,pif:WORD;
BEGIN
     Randomize;
     FOR i:=1 TO 40 DO
     BEGIN
          FOR j:=1 TO 40 DO
          BEGIN
               pif:=Random(101);
               IF pif<d THEN tab[i,j]:=1
               ELSE tab[i,j]:=0;
          END;
          Writeln;
     END;

     tab[Random(41),Random(41)]:=2; {cree un départ de feu}
END;

PROCEDURE Tabnul (VAR tab:matrice);
VAR i,j:WORD;
BEGIN
     Randomize;
     FOR i:=1 TO 40 DO
     BEGIN
          FOR j:=1 TO 40 DO tab[i,j]:=0;
          Writeln;
     END;
END;

FUNCTION Compte(i,j:WORD;tabl:matrice):WORD; {compte le nombre de cellules voisines}
BEGIN
     IF (i<>1) AND (i<>40) AND (j<>1) AND (j<>40) THEN  {cellule sympa}
          Compte:=tabl[i-1,j-1] DIV 2 + tabl[i-1,j] DIV 2 + tabl[i-1,j+1] DIV 2
                 +tabl[i,j-1] DIV 2   +          + tabl[i,j+1] DIV 2
                 +tabl[i+1,j-1] DIV 2 + tabl[i+1,j] DIV 2 + tabl[i+1,j+1] DIV 2;

     IF i=1 THEN
     BEGIN
          IF j=1 THEN Compte:=tabl[1,2] DIV 2+tabl[2,2] DIV 2+tabl[2,1] DIV 2;
          IF j=40 THEN Compte:=tabl[1,39] DIV 2+tabl[2,39] DIV 2+tabl[2,40] DIV 2;
          IF (j<>1) AND (j<>40) THEN Compte:=tabl[1,j-1] DIV 2+tabl[1,j+1] DIV 2
          +tabl[2,j-1] DIV 2+tabl[2,j] DIV 2+tabl[2,j+1] DIV 2;
     END;

     IF i=40 THEN
     BEGIN
          IF j=1 THEN Compte:=tabl[39,1] DIV 2+tabl[39,2] DIV 2+tabl[40,2] DIV 2;
          IF j=40 THEN Compte:=tabl[39,40] DIV 2+tabl[39,39] DIV 2+tabl[40,39] DIV 2;
          IF (j<>1) AND (j<>40) THEN Compte:=tabl[40,j-1] DIV 2+tabl[40,j+1] DIV 2+
          tabl[39,j-1] DIV 2+tabl[39,j] DIV 2+tabl[39,j+1] DIV 2;
     END;

     IF (j=1) AND ((i<>1) AND (i<>40)) THEN Compte:=tabl[i-1,1] DIV 2+tabl[i+1,1] DIV 2+
     tabl[i-1,2] DIV 2+tabl[i,2] DIV 2+tabl[i+1,2] DIV 2;

     IF (j=40) AND ((i<>1) AND (i<>40)) THEN Compte:=tabl[i-1,40] DIV 2+tabl[i+1,40] DIV 2
     +tabl[i-1,39] DIV 2+tabl[i,39] DIV 2+tabl[i+1,39] DIV 2;

END;

PROCEDURE Evoluer(VAR tab:matrice);
VAR i,j,k:WORD;buff:matrice;
BEGIN
    FOR i:=1 TO 40 DO
    BEGIN
        FOR j:=1 TO 40 DO
        BEGIN
            k:=compte(i,j,tab);
            IF tab[i,j]=0 THEN buff[i,j]:=0;
            IF tab[i,j]=1THEN
               IF k=0 THEN buff[i,j]:=1
               ELSE buff[i,j]:=2;
            IF tab[i,j]=2 THEN buff[i,j]:=0;
        END;
    END;

    tab:=buff;

END;

FUNCTION Comp(t1,t2:matrice):BOOLEAN;
VAR i,j:WORD;bol:BOOLEAN;
BEGIN
     i:=1;
     bol:=TRUE;
     WHILE (bol<>FALSE) AND (i<=40) DO
     BEGIN
         FOR j:=1 TO 40 DO
             IF t1[i,j]<>t2[i,j] THEN bol:=FALSE;
         i:=i+1;
     END;
     Comp:=bol;
END;

BEGIN
     bol:=FALSE;
     Clrscr;
     Write('Entree pour commencer');
     Readln;
     REPEAT
          Write('Densit‚ d arbres (%) ?');
          readln(dens);
          nbretours:=0;
          Aleat(t,dens);
          REPEAT
               Delay(50);
               Clrscr;
               Writeln('Etape',nbretours);
               Writeln;
               Affiche(t);
               tab1:=t;
               nbretours:=nbretours+1;
               Evoluer(t);
               tab2:=t;
               bol:=Comp(tab1,tab2);

           UNTIL bol=TRUE;
           writeln('Fin.');
           writeln('Encore ?');
           readln(s);

     UNTIL s<>'o';

END.

Conclusion :


Le réglage de la densité est vraiment minable (dû au faible nombre de cellules (1600) !

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.