Wolfram mathematica 细胞自动机与随机运动

Wolfram mathematica 细胞自动机与随机运动,wolfram-mathematica,cellular-automata,Wolfram Mathematica,Cellular Automata,我的细胞自动机模型中怎么会有随机运动?例如,如果一个单元格中的元素远远多于两个或更多相邻单元格,我想随机选择几个相邻单元格来给出一些元素。我尝试了所有出现在我脑海中的代码,但我的问题是,在Mathematica中,我必须确保在同一时间,一个元素从一个细胞中存在,并将进入另一个细胞。我想用条件来做,但我不知道怎么做。有人能帮我吗 编辑:我目前使用的代码 我的实际代码非常复杂,所以我将尝试告诉您我用一个更简单的细胞自动机做了什么。我想在摩尔地区的运动中取得成功。我的细胞自动机中的每个细胞都有多个个体

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

细胞自动机并不特别复杂,所以我的第一点建议是准确地找出你想要什么。然后,我建议您将经典的转换规则与您要介绍的“随机”方面分开

例如,以下是我对康威《生命游戏》的实现:

 (* 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]]]}];
(*我们缩写为“nbhd”表示邻居*)
getNbhd[A_,i_,j_]:=A[[i-1;i+1,j-1;;j+1];
计算单元[A,i,j]:=
模块[{nbhd,cell=A[[i,j]],numnighbors},
(*无人陆地边缘战略*)
如果[i==1 | | j==1 | | i==Length[A]| | j==Length[A[[1]],
返回[0]];
nbhd=getNbhd[A,i,j];
numNeighbors=应用[加上,展平[nbhd];
如果[cell==1&&(numnighbors-1<2 | | numnighbors-1>3),
返回[0]];
如果[cell==0&&numnighbors==3,则返回[1];
返回[单元];
];
evaluateAll[A_]:=表[evaluateCell[A,i,j],
{i,1,长度[A]},{j,1,长度[A[[1]]]}];
执行evaluateAll后,您可以在矩阵中搜索“孤独”单元格,并根据需要移动它们


有关代码如何工作的更多信息,以及要查看正在运行的代码示例,请参阅。它包括一个完整实现的Mathematica笔记本和大量示例。

您的问题是一般性的,相当于要求完整实现。请向我们展示您迄今为止所做的工作。好的,我将用我迄今为止所做的工作编辑我的问题。我试图整理您问题的文字,但您提供的描述太模糊,我很难做到这一点。你没有定义你使用的任何术语。你手机的“元素”是什么?什么是“从细胞中生存”,你的“在我的细胞之间的运动”是什么?请注意,所列代码的第二部分不是正确的Mathematica语句,因此请更正此错误。你能添加图纸或图表来更好地解释你的问题吗?我很想投票结束这个问题,因为它的措辞很糟糕。@Sjoerd C.de Vries我的单元格之间的移动意味着我想从一个单元格中取出一个元素,然后随机地给另一个。例如,如果一个单元格中有5个元素,而其相邻的一个单元格中有1个元素,那么我想给它一个。第一个单元格有4个,第二个单元格有2个。但是我想检查一下这个单元和它的所有相邻节点,然后随机选择一个单元来给出一个元素。你是想模拟一个传输问题吗?