-3

セル オートマトン モデルにランダムな動きを持たせるにはどうすればよいですか? たとえば、セル内の要素が2つ以上の隣接セルよりもはるかに多い場合、いくつかの要素を与えるためにいくつかの隣接セルをランダムに選択したいと思います。頭に浮かんだすべてのコードを試しましたが、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 に答える