Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Задача python .

Программа, которая моделирует эволюцию n-мерного клеточного автомата с произвольными правилами перехода.
Условия:
Пространство n-мерное, где n может быть до 10.
Размер каждого измерения может быть до 100.
Каждая клетка может находиться в одном из M состояний, где M может быть до 256.
Правила перехода заданы в виде функции, которая принимает текущее состояние клетки и состояния всех её соседей по соседству Мура и возвращает новое состояние.
Необходимо выполнить T шагов эволюции, где T может быть до 1000.
Программа должна быть оптимизирована по времени и памяти, чтобы справиться с заданными ограничениями.
Дополнительно требуется реализовать возможность параллельных вычислений с использованием многопоточности или мультипроцессинга.

По дате
По рейтингу
Аватар пользователя
Просветленный
9мес
12345678910111213141516171819202122232425262728293031323334353637383940414243
 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)