|
3.8.6 セルオートマトン
セルオートマトンは配列中のセルの値が局所ルールによって離散的なステップで変更される多くのシステムを表現する便利な方法を提供する.

セルオートマトンの進化の生成
これは与えられたリストから始め,ルール30で4ステップ進化させる.
In[1]:= CellularAutomaton[30, {0, 0, 0, 1, 0, 0, 0}, 4]
Out[1]= 
これはセルオートマトンの進化を表示する簡単な関数を定義する.
In[2]:= CAPlot[data_] := ListDensityPlot[Reverse[Max[data] - data], AspectRatio -> Automatic, Mesh -> False, FrameTicks -> None]
これはルール30の進化をランダムな初期条件から始めて100ステップまで表示する.
In[3]:= CAPlot[CellularAutomaton[30, Table[Random[Integer], {250}], 100]]

Out[3]= 

1次元のセルオートマトンにおける初期条件の指定方法
初期値の明示的なリストを与えると,CellularAutomatonはリスト中の要素を反復させることでシステムのすべてのセルに対応すると考える.
最後のセルの右近傍は始まりに当たる.
In[4]:= CellularAutomaton[30, {1, 0, 0, 0, 0}, 1]
Out[4]= 
小さな「種」区域を安定した「背景」に重ねるように初期条件を設定すると便利なことがよくある.デフォルトは,CellularAutomatonは指定された進化ステップ数で作られるパターンの大きさをカバーするに足る背景を自動的に埋める.
これはルール30が1個の黒いセルを含む初期条件から進化する様子を示している.
In[5]:= CAPlot[CellularAutomaton[30, {{1}, 0}, 100]]

Out[5]= 
これは{1,0,1,1}ブロックの繰返しからなる背景上で,ルール30が{1,1}という種で構成される初期条件から進化する様子を示している.
In[6]:= CAPlot[CellularAutomaton[30, {{1, 1}, {1, 0, 1, 1}}, 100]]

Out[6]= 
構造間の相互作用を研究する際は特に,特定のブロックが特定のオフセットで置かれているセルオートマトンの初期条件を指定したいことがある.
これはオフセット の黒いセルという初期条件を設定する.
In[7]:= CAPlot[CellularAutomaton[30, {{{ {1}, {-40} }, {{1}, {40}}}, 0}, 100]]

Out[7]= 

1次元のセルオートマトンのルール指定
最も単純な場合は,セルオートマトンは各セルにk個の可能な値あるいは"色"を許容し,各辺で最高rまでの近傍を含むルールを持つ."ルール番号" nの各桁の数字は各近傍の可能な設定において新たなセルが何色になるかを指定する.
これは単一の近傍を1ステップ進化させる.
In[8]:= CellularAutomaton[30, {1,1,0}, 1]
Out[8]= 
これは で のセルオートマトンの8つの可能な近傍である.
In[9]:= Table[IntegerDigits[i,2,3],{i,7,0,-1}]
Out[9]= 
これは8つの近傍のそれぞれの中央セルの新たな色を示す.
In[10]:= Map[CellularAutomaton[30, #, 1][[2,2]]&, %]
Out[10]= 
ルール30によると,このシーケンスは数30の2進法表現での各桁の数字に対応する.
In[11]:= FromDigits[%, 2]
Out[11]= 
これは で の一般ルールでルール番号921408を実行する.
In[12]:= CAPlot[CellularAutomaton[{921408, 3, 1}, {{1}, 0}, 100]]

Out[12]= 
一般的なセルオートマトンのルールでは,ルール番号の各桁の数字が 個のセルの可能な近傍が何色になるかを指定する.どの数字がどの近傍に当たるのかが知りたければ近傍中のセルを数字の桁とみなせばよい. のセルオートマトンでは数字はneig . k^2, k, 1 によって近傍中の要素neigのリストから得られる.
「totalistic」なセルオートマトンを考慮するとよいこともある.「totalistic」なセルオートマトンではセルの新たな値が近傍の値の合計のみに依存する.「totalistic」なセルオートマトンはルール番号あるいは各桁の数字が例えばneig . 1, 1, 1 から得られるように,与えられた総和の値で近傍を参照する"コード"で指定することができる.
一般に,CellularAutomatonを使っていかなる重みのシーケンスを使ったルールでも指定することができる.これとはまた別の便利な点に k, 1, k がある.これはouter totalisticルールを与える.
これはコード番号867で , のtotalisticルールを実行する.
In[13]:= CAPlot[CellularAutomaton[{867, {3, 1}, 1}, {{1}, 0}, 100]]

Out[13]= 
領域 のルールはオフセットが から までのすべてのセルを含む.時には特定のオフセットのセルだけを含むルールを考えると便利なことがある.そのような場合は,単一のrをオフセットのリストで置換するとよい.
任意の セルオートマトンルールはブール関数に対応すると考えることができる.最も単純な例として,AndまたはNorのような基本的なブール関数は2つの引数を取る.これはセルオートマトンのルールを使ってオフセット{{0}, {1}}であると指定することができる.より高次元のセルオートマトンを扱う上での互換性のために,例え1次元のセルオートマトンであってもオフセットは常にリストで与える点に注意のこと.
これはセルが2つの近傍ルール番号7の真理値表を生成する.このルールはブール関数Nandであることが分かる.
In[14]:= Map[CellularAutomaton[{7, 2, {{0}, {1}}}, #, 1][[2, 2]] &, {{1, 1}, {1, 0}, {0, 1}, {0, 0}}]
Out[14]= 
ルール番号はセルオートマトンルールの非常に簡潔な指定方法を提供する.しかし,各可能な近傍に適用すべき明示的関数を与えるルールを指定する方がより便利なことがある.
これはルールがモジュロ4の各近傍のすべての値を追加する追加的セルオートマトンを実行する.
In[15]:= CAPlot[CellularAutomaton[ {Mod[Apply[Plus, #], 4]&, {}, 1}, {{1}, 0}, 100]]

Out[15]= 
この関数にはステップ数に等しい第2引数が与えられている.
In[16]:= CAPlot[CellularAutomaton[ {Mod[Apply[Plus, #] + #2, 4]&, {}, 1}, {{1}, 0}, 100]]

Out[16]= 
関数でルールを指定する場合,セルの値は整数ではなくてもよい.
In[17]:= CAPlot[CellularAutomaton[ {Mod[1/2 Apply[Plus, #], 1] &, {}, 1}, {{1}, 0}, 100]]

Out[17]= 
記号的にすることもできる.
In[18]:= Simplify[CellularAutomaton[{Mod[Apply[Plus, #], 2] &, {}, 1}, {{a}, 0}, 2], a Integers]
Out[18]= 

保存ステップの選択
これはルール30を5ステップ,最後のステップだけを保存して実行する.
In[19]:= CellularAutomaton[30, {{1}, 0}, 5, -1]
Out[19]= 
これは最後の2ステップを保存する.
In[20]:= CellularAutomaton[30, {{1}, 0}, 5, -2]
Out[20]= 
ステップ指定 はTakeを使ってリストから要素を取り出すのに似ている.違いは,セルオートマトンの初期条件がステップ0とみなされる点である. ... の形式のステップ指定はどれも追加リストに埋め込まれていなければならない.

セルオートマトンのステップ指定
これは100ステップ進化するが1つ置きのステップしか保存しない.
In[21]:= CAPlot[CellularAutomaton[30, {{1}, 0}, 100, {{1, -1, 2}}]]

Out[21]= 

保存するステップとセルの選択
セルオートマトンの進化の過程でどのステップを保存するかを指定できるように,どのセルを保存するかも指定できる. , , ... , blistのような初期条件を与えると, はどのセルを保存するかを指定するためにオフセットが0であると解釈される.

セルオートマトンのセル指定
これはすべてのステップを保存するがオフセットが左側に20より大きいセルは除去する.
In[22]:= CAPlot[CellularAutomaton[30, {{1}, 0}, 100, {All, {-20, 100}}]]

Out[22]= 
これは中央の列のセルだけを保存する.
In[23]:= CellularAutomaton[30, {{1}, 0}, 20, {All, {0}}]
Out[23]= 
  , , ... , blist のような初期条件を与えると,CellularAutomatonは常に,あたかも無限のセルがあるかのように効果的にセルオートマトンを行う. ,  のような を使うことで,CellularAutomatonに から までの特定のオフセットのセルだけを出力に含むように指示することができる.CellularAutomatonはデフォルトにより背景blistと同じままには決してならない値になるだけ十分に離れたセルを含む.
一般に,領域rのセルオートマトンのルールが与えられると,両側にr tの距離のセルは原則としてシステムの進化に影響される. をAllとするとすべてのセルが含まれる.デフォルト設定のAutomaticの場合は値が事実上blistと同じ値に留まるセルはカットされる.
デフォルトにより,常に黒になるとは限らない部分のみが保存される.
In[24]:= CAPlot[CellularAutomaton[225, {{1}, 0}, 100]]

Out[24]= 
をAllにするとこの領域内でセルオートマトンに影響されるすべてのセルが含まれる.
In[25]:= CAPlot[CellularAutomaton[225, {{1}, 0}, 100, {All, All}]]

Out[25]= 
CellularAutomatonは任意次数に直接一般化される.

高次元のルール指定
これは2次元9近傍コード797のtotalisticなルール指定である.
In[26]:= code797 = {797, {2, 1}, {1, 1}};
これは進化におけるステップ0と1を与える.
In[27]:= CellularAutomaton[code797, {{{1}}, 0}, 1]
Out[27]= 
これは進化におけるステップ70を与える.
In[28]:= CAPlot[First[CellularAutomaton[code797, {{{1}}, 0}, 70, -1]]]

Out[28]= 
これは 軸に沿ったスライスの全ステップを示す.
In[29]:= CAPlot[Map[First, CellularAutomaton[code797, {{{1}}, 0}, 70, {All, {0}, All}]]]

Out[29]= 
|