细胞自动机和随机运动

时间:2011-07-25 10:38:37

标签: wolfram-mathematica cellular-automata

如何在Cellular自动机模型中进行随机移动?例如,如果单元格中的元素远远超过两个或更多个相邻单元格,我想随机选择几个邻居来给出一些元素。我尝试了所有出现在我脑海中的代码,但我的问题是,在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 个答案:

答案 0 :(得分:2)

细胞自动机并不是特别复杂,所以我的第一个建议是弄清楚你想要什么。然后,我建议您将经典转换规则与您引入的“随机”方面分开。

例如,这是我对Conway的生命游戏的实现:

 (* 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]]]}];

执行evaluateAll后,您可以在矩阵中搜索“孤独”单元格并随意移动它们。

有关代码如何工作的其他信息,以及查看代码的示例,请参阅my blog post on Conway's Life。它包括一个Mathematica笔记本,其中包含完整的实现和大量示例。