Правила обновления сотовых автоматов 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.