Wolfram mathematica 用Mathematica中的四维表模拟细胞自动机

Wolfram mathematica 用Mathematica中的四维表模拟细胞自动机,wolfram-mathematica,cellular-automata,Wolfram Mathematica,Cellular Automata,在本书中,作者使用以下代码在二维晶格中模拟细胞自动机 从摩尔邻域来看,更新规则是 update[site, N, E, S, W, NE, SE, SW, NW] 其中N=北,E=东,S=南,W=西,NE=东北,SE=东南,SW=东南,NW=西北。这些论点代表了沼地附近最近邻居的价值观。为了应用这些规则,它使用下面的代码 Moore[func_, lat_]:= MapThread[func,Map[RotateRight[lat,#]&, {{0,0},{1,0},{0,-1},{-

在本书中,作者使用以下代码在二维晶格中模拟细胞自动机

从摩尔邻域来看,更新规则是

update[site, N, E, S, W, NE, SE, SW, NW]
其中N=北,E=东,S=南,W=西,NE=东北,SE=东南,SW=东南,NW=西北。这些论点代表了沼地附近最近邻居的价值观。为了应用这些规则,它使用下面的代码

Moore[func_, lat_]:= MapThread[func,Map[RotateRight[lat,#]&,
{{0,0},{1,0},{0,-1},{-1,0},{0,1},
{1,-1},{-1,-1},{-1,1},{1,1}}],2]
对于以下表格(本书第144页)

他正在使用以下更新规则

update[{_,0,0},_,_,_,_,_,_,_,_]  := {RND, 3,5}
我的问题是:通过使用如下四维表?我还可以应用以下更新规则吗

InitialMatrix[x_, y_, age_, disease_] :=
  ReplacePart[
    Table[3, {x}, {y}, {age}, {disease}], {{_, _, 1, _} -> 
  0, {_, _, 2, 1} -> 
  Floor[dogpopulation*0.2/cellsno], {_, _, 2, 3} -> 
  Floor[dogpopulation*0.05/cellsno], {_, _, 3, 1} -> 
  Floor[dogpopulation*0.58/cellsno], {_, _, 3, 3} -> 
  Floor[dogpopulation*0.15/cellsno]}] /. 
  3 :> If[RandomReal[] > 0.2, 0, RandomInteger[{1, 2}]];


update[{{x_,0,0},{y_,z_,w_},{a_,b_,c_}},_,_,_,_,_,_,_,_] :=
                                            {{x-1,0,0},{y+z,0,w},{a,b,c}}
这是一个例子,我认为我可以使用我的表格来处理细胞自动机。我可以这样做吗?还是我错了

编辑我的表格

通过将我的表更改为下面的代码,我可以使用上面的更新规则吗

MyMatrix[x_, y_, age_, disease_] :=
  Table[0, {x}, {y}] /. 
    0 :> ReplacePart[
      Table[3, {age}, {disease}], {{1, _} -> 0, {2, 1} -> 
    Floor[dogpopulation*0.2/cellsno], {2, 3} -> 
    Floor[dogpopulation*0.05/cellsno], {3, 1} -> 
    Floor[dogpopulation*0.58/cellsno], {3, 3} -> 
    Floor[dogpopulation*0.15/cellsno]}] /. 
   3 :> If[RandomReal[] > 0.2, 0, RandomInteger[{1, 2}]];

《用mathematica建模细胞自动机模拟》一书是15年前写的,因此建议大家看看mathematica中的CellularAutomaton[]函数

CellularAutomaton[]函数有点复杂,但如果您想执行2D Moore CA,则可以这样调用此函数:

细胞自动机[{func[#]&,{},{1,1}},initialMatrixVal,numIterations]

上面的代码将调用函数func[],对于initialMatrixVal中的每个节点,Moore邻域作为fn参数,用于“numIterations”次数

CellularAutomaton[]函数假定周期性边界条件


希望有帮助

在Wolfram网站(library.Wolfram.com?)上可以找到《用mathematica建模细胞自动机模拟》一书的大部分代码。如果您搜索作者的姓名,您将找到本书所涵盖的大多数主题的示例代码

我可能有书中大多数示例的代码,如果您感兴趣,请告诉我


祝你好运

我想知道你什么时候能找到CAs的连接。考虑到您目前正在使用的方法存在的问题,切换中游可能会混淆问题。在任何情况下,你都要把一个3*3矩阵的规则应用到一个四维张量上,所以我不确定这个规则是否匹配。您需要编辑规则以使其匹配。另外,这本书已经有15年的历史了,其中的一些代码可以修改。还记得人们先前关于伯努利分布和二项分布的建议吗。15年前它们还不存在。”…这本书将有一张打包的DOS软盘……”亚马逊上写道会吗?@ndroock1是的,有,但我没有,因为我是从二手货那里买的@维维娅我知道这本书很老了,确实有些代码已经改变了,但这是我发现的唯一一本对mathematica中的细胞自动机非常有用的书,但是因为我的表是四维的,就像你说的,我不确定我是否能应用这个规则。注意:我表中的每个3x3矩阵都是细胞自动机中的一个单元。请注意,我在上一篇文章中写错了@Verbeia。是的,func[]是更新规则。例如,函数:Moore[func,lat],相当于调用CellularAutomaton[{func[#]&,{},{1,1},lat,1]一次CellularAutomaton[{func[#]&,{1,1},lat,1]。非常感谢!!我可以用这两种方法检查我的解决方案吗?CellularAutomaton和Moore?我的意思是,我在项目中所做的一切都将保持原样,我必须更改Moore函数以改进代码。是吗?是的,你可以用它作为新的Moore[]函数。您可以通过消除对NestList[]的需要并指定CellularAutomaton[]函数中的步骤数来进一步简化……使用我问题中的moore代码,我的模型运行良好,但我尝试使用您提供的代码对其进行更改,它会给我错误,这符合逻辑吗?我必须做些别的事吗?
MyMatrix[x_, y_, age_, disease_] :=
  Table[0, {x}, {y}] /. 
    0 :> ReplacePart[
      Table[3, {age}, {disease}], {{1, _} -> 0, {2, 1} -> 
    Floor[dogpopulation*0.2/cellsno], {2, 3} -> 
    Floor[dogpopulation*0.05/cellsno], {3, 1} -> 
    Floor[dogpopulation*0.58/cellsno], {3, 3} -> 
    Floor[dogpopulation*0.15/cellsno]}] /. 
   3 :> If[RandomReal[] > 0.2, 0, RandomInteger[{1, 2}]];