【问题标题】:Simulate Cellular Automata with a four Dimensional Table in Mathematica在 Mathematica 中使用四维表模拟元胞自动机
【发布时间】:2011-07-08 02:28:40
【问题描述】:

Modelling Cellular automata Simulations with mathematica一书中,作者正在使用以下代码模拟二维格中的元胞自动机,

摩尔邻里的更新规则是

update[site, N, E, S, W, NE, SE, SW, NW]

其中 N = 北,E= 东,S=南,W=西,NE= 东北,SE=东南,SW= 东南,NW=西北。这些参数代表了 Moor 社区中最近邻居的值。为了应用这些规则,它使用下面的代码,

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 页)

pasture= Table[Floor[Random[]+(preyDensity+predDensity)]*
Floor[1+Random[]+predDensity/(preyDensity+predDensity)],{n},{n}]/. 
2:>{RND,Random[Integer, {1,3}],Random[Integer,{1,5}]}

RND:= Random[Integer, {1,4}]

他正在使用以下更新规则

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

【问题讨论】:

  • 我想知道你什么时候才能找到与 CA 的连接。鉴于您目前使用的方法目前存在的问题,切换中游可能只会混淆问题。无论如何,您将 3*3 矩阵的规则应用于四维张量,所以我不确定该规则是否匹配。您将需要编辑规则以使其匹配。此外,这本书已有 15 年历史,其中一些代码可能会被修改。记住人们早先关于 BernoulliDistribution 和 BinomialDistribution 的建议。 15 年前他们不在那里。
  • “...这本书将附带一个 DOS 软盘...”它在亚马逊上说。 - 会吗?
  • @ndroock1 是的,它有,但我没有,因为我是从二手买的。 @Verveia我知道这本书很老了,确实有些代码已经改变了,但这是我发现对数学中的细胞自动机非常有帮助的唯一一本书,但是因为我的表是四维的,就像你说的那样,我不确定如果我可以应用这条规则。注意:我表中的每个 3x3 矩阵都是元胞自动机中的一个单元格
  • 我只是注意到我在之前的帖子中写错了@Verbeia。

标签: wolfram-mathematica cellular-automata


【解决方案1】:

Modeling Cellular automata Simulations with mathematica 一书写于 15 多年前,因此建议查看 Mathematica 中的 CellularAutomaton[] 函数。

函数 CellularAutomaton[] 有点复杂,但如果你想做 2D Moore CA,你可以这样调用这个函数:

CellualrAutomaton[{func[#]&,{},{1,1}},initialMatrixVal, numIterations];

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

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

希望有帮助!

【讨论】:

  • 是的,func[] 是更新规则。所以对于前。函数: Moore[func_, lat_] 等价于调用 CellularAuomaton[] 一次,CellularAutomaton[{func[#]&,{},{1,1}}, lat, 1]。
  • 非常感谢!!我可以通过这两种方法来检查我的解决方案吗?元胞自动机和摩尔?
  • 我的意思是到目前为止我在项目上所做的一切都将保持原样,我必须更改 Moore 函数以改进我的代码。不是吗?
  • 是的,您可以将其用作新的 Moore[] 函数。您可以通过消除对 NestList[] 的需要并在 CellularAutomaton[] 函数中指定步骤数来进一步简化...
  • 使用我的问题中的摩尔代码,我的模型工作正常,但我试图用你给我的代码来改变它,它给了我错误,这合乎逻辑吗?我还需要做其他事情吗?
【解决方案2】:

可以在 Wolfram 网站 (library.wolfram.com ?) 中找到“使用数学建模元胞自动机模拟”一书的大部分代码。如果你搜索作者的名字,你会找到本书中大部分主题的示例代码。

我可能有本书中大部分示例的代码,如果您有兴趣,请告诉我。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多