セル・オートマト ン(cellular automaton、略称:CA)
とは、
格子状のセルと単純な規則による、離散的計算モデルです。
“セル”は「細胞」「小
部屋」、オートマトンは「自動機械」を意味します。
非常に単純化されたモデ
ルですが、生命現象、結晶の成長、
乱流といった複雑な自然現象を模した、
驚くほどに豊かな結果を与えてく れます。
ここでは、各セルは2つ
の状態をとることができ、
「そのセルの状態は、両側に接しているセルの状態値に依存する」
という、1次元のセル・オートマトンを考えて見ます。
ルール90セル・オートマトン
現在状態 111 110 101 100 011 010 001 000 中央のセルの新たな状態 0 1
0
1 1 0
1 0
今、隣り合う3つのセル状態値と、その中央のセルの新たな状態値を考えます。
上記の例は、左から順に中央のセルの注目すると
現在の値が1、左右のセルの値が1であれば、次の状態値は0
現在の値が1、左のセル値が1、右のセル値が0の場合、次の状態値は1
現在の値が0、左のセル値が1、右のセル値が1の場合、次の状態値は0
現在の値が0、左のセル値が1、右のセル値が0の場合、次の状態値は1
・・・・・・・・・
となることを意味しています。
色を付けて表すと
「ルール90」とは、状態表の「01011010」を2進数と考えた場合に 90(0x128+1x64+0x32+1x16+1x8+0x4+2x1+1x0)になることから命名されています。
あたらな状態値を現在値として次の状態値を考えていくと、初期値の状態によって決定される複雑なパターンが表れてきます。
下図の最上段を初期値として、ルール90を順に適用していくと
このようなパターンが出来上がります。
ここでは判り易いように、状態値が「1」のセルには色を付けてあります。
もう少し範囲を広げると
かなり複雑なパターンです。
お気づきのように、これは、同じパターンが小さいサイズから大きいサイズまで繰り返し現れる「フ ラクタル(自己相似)」図形となっています。
これは、「シェ ルビンスキーのギャスケット」とも呼ばれる図形と同じものを生成します。
左、中央、右のセルの値を2進数3桁に見立てて計算しま す。
下図の「BX4」(○印) に注目すると、左、自分、右のセルは
1、空白、空白 となり、空白を「0」と見なすと「100」
これを2進数と見立てて、10進数に直すと「4」となります。
この「4」の値をる「RULE」表に当てはめる(INDEX関数)と、表から「1」 が得られます。
(「RULE」は、「規則」シートのE3:E10に付けた名前−下図)
よって、次の状態値(5行目「BX5」)は「1」となります。
これをすべてのセルに適用していきます。
なお、上図で着色されているのは以下の条件付書式で、セルの値が「1」の場合に セルの色を「緑」にしています。
上段(2行目)のチェックボックスは「RULE」表と連動
チェックが入っている場合「1」を表します。
最上段の行に直接「1」を入力しても可
「ランダム配置」を押すと初期値(4行目)の値をランダムに配置
「A4」の値は、初期値を「1」にするセルの比率を表します。
「1」にすると初期値は全て「1」、「0」にすると「0」、0.2にすると1/5が「1」になります。
初期値が複数あると、とても複雑なフラクタル模様が出来ます。
消す時には「クリア」ボタンを押すか、4行目C列以降右側を選択して「Delete」キーを押下。
補足:数式保護のために「シートの保護」が設定されています。
生物界において、セル・オートマントン状の模様の貝がいます。
左図は巻貝の一種、イモガイ
貝殻の辺縁に狭い帯状に色素細胞がある。各色素細胞は活性化されると色素を分泌し、同時に近傍の色素細胞の活性化を阻害するようになっており、天然のセル・オートマトンの規則のように作用する。この色素細胞の帯が貝殻に色の模様を残しつつ、少しずつ貝殻が成長していく。--- ウィキペディアより
パターン作成ではVBAは使用していません。
純粋にエクセル標準式のみで作成できます。
ここで使用しているVBAは、初期値の「ランダム配置」においてのみ。
特に必須という機能ではありません。
Private Sub cmdRandom_Click() Dim intRatio As Single Dim InitArea As Range Dim MyCell As Range Dim i As Integer Set InitArea = Range("InitArea") InitArea.ClearContents Application.Calculation = xlCalculationManual intRatio = Val(Range("Ratio")) For Each MyCell In InitArea If Rnd <= intRatio Then MyCell.Value = 1 End If Next Application.Calculation = xlCalculationAutomatic End Sub