ИВТ 12
public
Apr 06, 2025
Never
37
1 import numpy as np 2 import matplotlib.pyplot as plt 3 import matplotlib.animation as animation 4 from matplotlib import colors 5 6 # Параметры модели 7 WIDTH, HEIGHT = 100, 100 # Размер сетки 8 PROB_GROWTH = 0.3 # Вероятность распространения огня 9 PROB_NEW_FIRE = 0.001 # Вероятность нового возгорания 10 11 # Состояния клеток 12 EMPTY = 0 13 TREE = 1 14 BURNING = 2 15 BURNT = 3 16 17 # Цвета для визуализации 18 cmap = colors.ListedColormap(['white', 'green', 'red', 'black']) 19 bounds = [EMPTY, TREE, BURNING, BURNT, 4] 20 norm = colors.BoundaryNorm(bounds, cmap.N) 21 22 # Инициализация леса 23 forest = np.random.choice([EMPTY, TREE], size=(HEIGHT, WIDTH), p=[0.2, 0.8]) 24 25 26 # Функция обновления состояния 27 def update(frame): 28 global forest 29 new_forest = forest.copy() 30 31 for y in range(HEIGHT): 32 for x in range(WIDTH): 33 if forest[y, x] == BURNING: 34 new_forest[y, x] = BURNT 35 # Распространение огня на соседей 36 for dy in [-1, 0, 1]: 37 for dx in [-1, 0, 1]: 38 if (dx == 0 and dy == 0) or (x + dx < 0) or (x + dx >= WIDTH) or (y + dy < 0) or ( 39 y + dy >= HEIGHT): 40 continue 41 if forest[y + dy, x + dx] == TREE and np.random.random() < PROB_GROWTH: 42 new_forest[y + dy, x + dx] = BURNING 43 elif forest[y, x] == TREE: 44 # Случайное возгорание 45 if np.random.random() < PROB_NEW_FIRE: 46 new_forest[y, x] = BURNING 47 48 forest = new_forest 49 img.set_array(forest) 50 return img, 51 52 53 # Визуализация 54 fig, ax = plt.subplots(figsize=(10, 10)) 55 img = ax.imshow(forest, cmap=cmap, norm=norm, interpolation='nearest') 56 plt.title("Модель распространения лесного пожара (Фрактальный алгоритм)") 57 ani = animation.FuncAnimation(fig, update, frames=100, interval=200, blit=True) 58 plt.show()