-3

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

4

1 回答 1

2

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

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

 (* 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 后,您可以在矩阵中搜索“孤独”单元格并随意移动它们。

有关代码如何工作的更多信息,以及查看代码示例,请参阅我关于 Conway's Life 的博客文章。它包括一个带有完整实现和大量示例的 Mathematica 笔记本。

于 2011-07-31T00:52:29.773 回答