Simulando Autômatos Celulares com Python

Simulando Autômatos Celulares com Python

Uma das vantagens da linguagem Python vem de seu principal objetivo, que é o de ser uma linguagem de programação de propósito geral, criada para ser de fácil escrita e leitura. Ou seja, sua maior expressividade reflete na facilidade em se traduzir um algoritmo em código. Nos últimos anos foi crescente a adesão da linguagem Python para aplicações científicas, com a disponibilização de diversos módulos que estendem a linguagem Python para diversos tipos de aplicações. Como exemplo, temos o caso da SciPy <https://www.scipy.org/>, que inclui uma ampla variedade de módulos da linguagem Python que permitem as mais variadas aplicações científicas, onde podemos citar a matemática simbólica (sympy), computação numérica e álgebra linear (numpy), visualização de dados bidimensionais e tridimensionais (matplotlib), , processamento de sinais (scipy), etc.

Nesta postagem, trago uma aplicação da linguagem Python para a simulação de um simples modelo matemático para a propagação de incêndios de vegetação baseado em autômatos celulares. Uma detalhada descrição  deste modelo matemático pode ser obtida no capítulo 3 de minha tese de doutorado, que pode ser acessada pelo link <http://mtc-m16d.sid.inpe.br/col/sid.inpe.br/mtc-m19/2012/11.01.13.13/doc/publicacao.pdf>. O código para proceder tal operação é apresentado à seguir.

[code language=”python” wraplines=”false” collapse=”false”]
from scipy import signal
from matplotlib import pyplot
import matplotlib as mpl
import numpy as np;

D = 0.8;
B = 0.1;
I = 0.3;
sx = 201;
sy = 201;
empty = 0;
forest = 1;
burning = 2;
burned = 3;
kernel = np.array([[1,1,1],[1,0,1],[1,1,1]]);

cells = forest*(np.random.rand(sx,sy)<D);
cells[100,100]=burning;
cellsN = cells;
cmap = mpl.colors.ListedColormap([‘black’,’green’,’red’,’gray’]);
bounds = [-0.5,0.5,1.5,2.5,3.5];
norm = mpl.colors.BoundaryNorm(bounds, cmap.N);
pyplot.ion();
img = pyplot.imshow(cells,cmap=cmap,norm=norm);
pyplot.show();
pyplot.pause(0.001);
while (np.sum(cells==burning)>0):
neighbors = signal.convolve2d((cells == burning),kernel,mode=’same’);
toBurn = (cells==forest)*(neighbors>0)*(np.random.rand(sx,sy)<I);
cellsN[toBurn == 1]= burning;
cellsN[((cells == burning) * (np.random.rand(sx,sy) < B)) == 1]=burned;
cells = cellsN;
img = pyplot.imshow(cells,cmap=cmap,norm=norm)
pyplot.show()
pyplot.pause(0.001)
[/code]

Nas linhas 1 a 4 são inicializados os módulos que fornecem suporte essencial para a execução do algoritmo do modelo: extensão signal de processamento de sinais do módulo scipy; extensão pyplot do módulo matplotlib, que permite desenhar gráficos; e o módulo numpy, que permite trabalhar com computação numérica. Nas linhas 6 a 15, sao definidos algumas variáveis do modelo: as probabilidades D, B e I; as dimensões sx e sy do espaço celular; os valores associados aos estados das células (empty, forest, burning e burned) e o tipo de vizinhança (kernel). Na linha 17, o espaço celular é preenchido com vegetação, conforme a proporção definida por D. Na linha 18, a célula central do espaço celular é levada à ignição.  Nas linhas 21 e 22 são definidas a paleta de cores e os valores associados. Na linha 24 o modo de visualização interativa é habilitado. Nas linhas 25, 26 e 27 é realizada a visualização dos autômatos celulares. O loop while da linha 29 garante que a simulação é executada enquanto existir alguma célula queimando. Nas linhas 30 e 31 são avaliadas as chances das células com vegetação entrarem em ignição. Na linha 33, são avaliadas as chances do fogo se extinguir nas células que estão queimando. Na linha 34 os estado das células são atualizados. A Figura abaixo exibe uma imagem da simulação.

figure-1_009