Wolfram mathematica 细胞自动机与随机运动
我的细胞自动机模型中怎么会有随机运动?例如,如果一个单元格中的元素远远多于两个或更多相邻单元格,我想随机选择几个相邻单元格来给出一些元素。我尝试了所有出现在我脑海中的代码,但我的问题是,在Mathematica中,我必须确保在同一时间,一个元素从一个细胞中存在,并将进入另一个细胞。我想用条件来做,但我不知道怎么做。有人能帮我吗 编辑:我目前使用的代码 我的实际代码非常复杂,所以我将尝试告诉您我用一个更简单的细胞自动机做了什么。我想在摩尔地区的运动中取得成功。我的细胞自动机中的每个细胞都有多个个体(或没有)。我想在我的细胞间做随机运动。我做不到这一点,所以我尝试了下面的代码,在我的细胞自动机中,我使用了它,就像你在下面看到的那样Wolfram mathematica 细胞自动机与随机运动,wolfram-mathematica,cellular-automata,Wolfram Mathematica,Cellular Automata,我的细胞自动机模型中怎么会有随机运动?例如,如果一个单元格中的元素远远多于两个或更多相邻单元格,我想随机选择几个相邻单元格来给出一些元素。我尝试了所有出现在我脑海中的代码,但我的问题是,在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个。但是我想检查一下这个单元和它的所有相邻节点,然后随机选择一个单元来给出一个元素。你是想模拟一个传输问题吗?