Правила обновления сотовых автоматов Mathematica

Я пытаюсь построить некоторые правила о клеточных автоматах. В каждой клетке у меня нет одного элемента (хищник / жертва), у меня есть несколько популяций. Чтобы добиться перемещения между моими популяциями, могу ли я каждый раз сравнивать каждую клетку с одним из ее соседей? или я должен сравнить ячейку со всеми ее соседями и добавить некоторые условия.

Я использую окрестности Мура со следующей функцией обновления

update[site,_,_,_,_,_,_,_,_]

Я пытался заставить их двигаться в соответствии со всеми своими соседями, но это очень сложно, и мне интересно, если при упрощении и проверке со всеми соседями по отдельности, это будет неправильно.

Спасибо

2 ответа

Решение

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

Выполнение симуляции типа "хищник-жертва" с помощью CA немного сложно, поскольку на каждом шаге (в отличие от традиционного CA) значение центральной ячейки изменяется ВМЕСТЕ С ЗНАЧЕНИЕМ СОСЕДНОЙ КЛЕТКИ!

Это приведет к проблемам, так как, когда функция перехода применяется к соседней ячейке, она снова вычисляет новое значение для себя, но ей также необходимо "запомнить" изменения, внесенные в нее ранее, когда она была соседом.

При моделировании гидродинамики с использованием CA они сталкиваются с подобными проблемами и используют другую окрестность, называемую окрестностью Margolus. В окрестности Margolus решетка CA разбита на отдельные блоки, и правило обновления применяется к каждому блоку. На следующем шаге границы блоков изменяются и правила перехода применяются к новой границе, следовательно, передача информации происходит через границы блоков.

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

Я думаю, вы спрашиваете, как лучше выбрать район, и вы можете сделать это с помощью Part:

(* We abbreviate 'nbhd' for neighborhood *)

getNbhd[A_, i_Integer?Positive, j_Integer?Positive] := 
    A[[i - 1 ;; i + 1, j - 1 ;; j + 1]];

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

В частности, для выполнения шага обновления сотового автомата необходимо обновить все ячейки одновременно. В реальном мире это означает создание отдельного массива и размещение там обновленных значений, а затем удаление исходного массива.

Для получения более подробной информации, смотрите мой блог на Cellular Automata, который включает в себя реализацию игры жизни Конвея в Mathematica.

Другие вопросы по тегам