Клеточный автомат и случайные движения - PullRequest
0 голосов
/ 25 июля 2011

Как у меня могут быть случайные движения в моей модели клеточного автомата? Например, если элементов в ячейке намного больше, чем две или более соседних ячеек, я бы хотел случайным образом выбрать несколько соседей, чтобы дать некоторые элементы. Я перепробовал все коды, которые мне приходили в голову, но моя проблема в том, что в Mathematica я должен быть уверен, что один и тот же элемент живет из клетки и переходит в другую. Я думал об этом, используя условия, но я не уверен, как это сделать. Может кто-нибудь, пожалуйста, помогите мне?

Редактировать: код, который я использовал до сих пор

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

w[i_, j_] := 
  If[(i - 4) > j, -1, If[(i - 4) == j, 0, If[(j - 4) > i, 1, 0]]];


dogs[p, p1, p2,p3,p4,p5,p6,p7,p8]:=newp &[
  newp = w[p, p1] + w[p, p2] + w[p, p3] + w[p, p4] + w[p, p5] + 
    w[p, p6] + w[p, p7] + w[p, p8]]

Этот код выполняет движения, но это не совсем то, что я хочу, потому что если в ячейке 0 индивидуумов и все 5 ее соседей, то в конце у нее 8 и 4 соседей, но я этого не хочу, Я не хочу, чтобы в камере с меньшим количеством людей было больше, чем у ее соседей. Я хочу, чтобы у всех них были близкие ценности и все еще были движения. Я не знаю, как это сделать в Mathematica.

1 Ответ

2 голосов
/ 31 июля 2011

Сотовый автомат не особенно сложен, поэтому мой первый совет - выяснить, что именно вы хотите.Затем я рекомендую вам отделить классические правила перехода от «случайного» аспекта, который вы вводите.

Например, вот моя реализация «Игры жизни» Конвея:

 (* We abbreviate 'nbhd' for neighborhood *)
 getNbhd[A_, i_, j_] := A[[i - 1 ;; i + 1, j - 1 ;; j + 1]];

 evaluateCell[A_, i_, j_] :=
   Module[{nbhd, cell = A[[i, j]], numNeighbors},

    (* no man's land edge strategy *)
    If[i == 1 || j == 1 || i == Length[A] || j == Length[A[[1]]],
       Return[0]];

    nbhd = getNbhd[A, i, j];
    numNeighbors = Apply[Plus, Flatten[nbhd]];

    If[cell == 1 && (numNeighbors - 1 < 2 || numNeighbors - 1 > 3),
      Return[0]];
    If[cell == 0 && numNeighbors == 3, Return[1]];
     Return[cell];
  ];

 evaluateAll[A_] := Table[evaluateCell[A, i, j],
    {i, 1, Length[A]}, {j, 1, Length[A[[1]]]}];

После выполнения оценки всех можно искать в матрице «одинокие» клетки и перемещать их по своему усмотрению.

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

...