G

ИВТ 12

public
Guest Apr 06, 2025 Never 37
Clone
Python test.py 58 lines (48 loc) | 2.17 KB
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()