Автоматизация сотовой связи приобретает неживые соседи

89
9

Я пытаюсь разработать моделирование сотовых автоматов, и проблема в том, что я хочу получить близких соседей и дальних соседей каждой ячейки (проиллюстрированных как синий и бежевый), и определить, какие ячейки мертвы, а некоторые правила оживляют их. Поэтому на каждой итерации я буду запускать все ячейки в массиве, и я хочу как-то эффективно получить всех близких и дальних соседей этих ячеек.

enter image description here

Однако в зависимости от положения ячейки в сетке будут доступны только некоторые из соседей, и единственный способ, которым я думал сделать это до сих пор, - это метод getNeighbours (cell), который вернет список со всеми доступными соседями из этой ячейки, которую мне придется перебирать, чтобы получить неживые.

getNeighbours(cell):
If cell.row > 0:
neighbours.add((coordinate,value),CLOSE_TOP_MIDDLE)
If cell.row > 1:
neighbours.add((coordinate,value),FAR_TOP_MIDDLE)
[...]

Однако это много накладных расходов и много сравнений для каждой ячейки в сетке!

Существует ли общий подход, который обычно используется с клеточными автоматизациями? Может быть, любые структуры данных, которые я могу использовать? Потому что с тем, что у меня до сих пор, каждая итерация займет много времени, если сетка достаточно велика.

спросил(а) 2021-01-19T20:34:06+03:00 6 месяцев назад
1
Решение
63

В зависимости от используемого языка программирования могут быть пакеты, которые обеспечивают требуемую функциональность. В Java, например, существует пакет под названием JCASim: система моделирования сотовых автоматов.

Поиск соседей в ЦС может быть нетривиальной задачей (например, если вы используете шестиугольные ячейки и т.д.). Даже термин "сосед" должен быть определен: район Мур или фон Нейман (эти статьи в Википедии также содержат некоторый псевдокод).

В вашем случае вы можете реализовать поиск по соседству самостоятельно: пусть предполагается, что ваш ЦС состоит из n строк с n столбцами (помечены от 0,..., n-1), как показано на картинке.

Функция getNeighbour должна проверять все ячейки соседнего соседа (серый цвет фона на вашем изображении).
    Если вы используете периодические граничные условия, вы можете использовать модуль-оператор (%), чтобы получить 9 соседних ячеек. При периодических граничных условиях соседние ячейки ячейки (x, y) равны: (x + 1% n, y), (x, y + 1% n), (x + 1% n, y + 1% n), (x + n-1% n, y), (x, y + n-1% n),...) С открытыми границами вы должны отбросить всех соседей, где x + 1> n-1, y + 1> n-1 или x-1 <0, y-1 <0
Таким образом, вы можете проверить все ячейки с серым цветом фона на вашем снимке. Вызовите ту же функцию для каждой из серых ячеек. Таким образом, вы также проверяете ячейки с синим цветом фона. Теперь вы проверили все ячейки по соседству, которые вы определили

ответил(а) 2021-01-19T20:34:06+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема