Я бы хотел внедрить сотовый автомат (СА) в Джулию.Размеры должны быть перенесены, это означает: левый сосед самой левой ячейки является самой правой ячейкой и т. Д.
Один важный вопрос: как заставить соседей одной ячейки вычислять ее состояние в следующем поколении?Поскольку измерения должны быть обернуты, а Джулия не допускает отрицательных индексов (как в Python), у меня была такая идея:
Рассматривается 1D CA, одно поколение - это одномерный массив:
0 0 1 0 0
Что если мы создадим двумерный массив, в котором первая строка смещена вправо, а третья смещена влево, например:
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
Теперь в первом столбце содержатся состоянияпервой ячейки и ее соседей и т. д.
я думаю, что это легко можно обобщить для двух и более измерений.
Первый вопрос : считаете ли вы, что это хорошоидея, или это неправильный трек?
РЕДАКТИРОВАТЬ: Ответ на первый вопрос был нет, второй вопрос и пример кода отброшены.
Второй вопрос : Еслиподход в целом нормальный, пожалуйста, взгляните на следующий эскиз:
РЕДАКТИРОВАТЬ: Другой подход, здесь урезанная версия 1D CA, используя mod1 () для получения индексов окрестности,как предложил Богумил Каминский.
для любой ячейки: - массив всех индексов - массив B всех состояний окрестности - состояния C, преобразованные в одно целое число - поиск D следующего состояния
function digits2int(digits, base=10)
int = 0
for digit in digits
int = int * base + digit
end
return int
end
gen = [0,0,0,0,0,1,0,0,0,0,0]
rule = [0,1,1,1,1,0,0,0]
function nextgen(gen, rule)
values = [mod1.(x .+ [-1,0,1], size(gen)) for x in 1:length(gen)] # A
values = [gen[value] for value in values] # B
values = [digits2int(value, 2) for value in values] # C
values = [rule[value+1] for value in values] # D
return values
end
for _ in 1:100
global gen
println(gen)
gen = nextgen(gen, rule)
end
Следующим шагом должно быть его расширениев двух измерениях, попробую сейчас ...