Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача python .

Poul Lirman Ученик (152), на голосовании 1 месяц назад
Программа, которая моделирует эволюцию n-мерного клеточного автомата с произвольными правилами перехода.
Условия:
Пространство n-мерное, где n может быть до 10.
Размер каждого измерения может быть до 100.
Каждая клетка может находиться в одном из M состояний, где M может быть до 256.
Правила перехода заданы в виде функции, которая принимает текущее состояние клетки и состояния всех её соседей по соседству Мура и возвращает новое состояние.
Необходимо выполнить T шагов эволюции, где T может быть до 1000.
Программа должна быть оптимизирована по времени и памяти, чтобы справиться с заданными ограничениями.
Дополнительно требуется реализовать возможность параллельных вычислений с использованием многопоточности или мультипроцессинга.
Голосование за лучший ответ
Милана Просветленный (33051) 2 месяца назад
 import numpy as np 
import itertools
import multiprocessing as mp

def evolve_ca(dims, size, states, rule, steps, processes=None):
"""
Моделирует эволюцию n-мерного клеточного автомата.

Args:
dims (int): Количество измерений (до 10).
size (int): Размер каждого измерения (до 100).
states (int): Количество состояний клетки (до 256).
rule (callable): Функция перехода.
steps (int): Количество шагов эволюции.
processes (int, optional): Количество процессов для параллелизма.
"""
grid = np.random.randint(0, states, size=(size,) * dims)

def get_neighbors(coords):
return [tuple((c + o) % size for c, o in zip(coords, offset))
for offset in itertools.product([-1, 0, 1], repeat=dims) if any(offset)]

def update_cell(coords):
return rule(grid[coords], [grid[n] for n in get_neighbors(coords)])

def update_grid_parallel():
with mp.Pool(processes=processes) as pool:
return np.array(pool.map(update_cell, np.ndindex(grid.shape))).reshape(grid.shape)

for _ in range(steps):
grid = update_grid_parallel() if processes else np.array([update_cell(c) for c in np.ndindex(grid.shape)]).reshape(grid.shape)
return grid


# Пример (Игра жизни):
def game_of_life_rule(cell, neighbors):
live_neighbors = sum(neighbors)
return 1 if (cell == 1 and 2 <= live_neighbors <= 3) or (cell == 0 and live_neighbors == 3) else 0


# Запуск:
result = evolve_ca(dims=2, size=50, states=2, rule=game_of_life_rule, steps=100, processes=4)
# ... (Визуализация или дальнейшая обработка result)
Похожие вопросы