■[Flash]一次元セルオートマトンの作り方

 セルオートマトン(Cellular Automaton)のよく知られた例は「ライフゲーム」であるが、一次元セルオートマトンは、もっともシンプルな形のライフゲームとも言える。

 ステッパーの数値(ルール)を変えて、[Start]ボタンを押すと、さまざまな模様が描かれる。この点(セル)ひとつひとつを生物とみなし、隣り合う環境によって生死が決まる簡単なルールを適用すると、世代を追うごとに、どのように変化するかを見ることができる(おすすめは、ルール90、110、120、150など)。

 以下は、爺のFlash製作メモ。興味のある人だけ読んでね。

配列の頭と尻尾をつなげる

Ca_001

 第1世代のセルは、点のあるなしを「1」と「0」で表し、それを360個(ステージの横幅)つなげて配列に格納する。で、次の世代は、注目するセルの前後(3つのセル)の状態をルールに照らし合わせて決める。そこで問題となるのは、配列の始まりと終わりのセルだ。頭と尻尾をつなげて「輪っか」にする必要がある。

Ca_002

 配列の0番目と、配列の最後(配列の長さ)を特別扱いにする手もあるけれど、余計な手順が増えてしまう。そこで、配列の長さを「L」、注目するセルの番号を「N」とすると、以下の計算式で求めることができる。
left = (N + L – 1) % L
right= (N + 1) % L
※「%」は、剰余(割り算の余り)を求める演算子

ルールを適用して次の世代を作る

Ca_003

 自分と前後のセルを合わせた、3つのセルが取り得る値は、全部で8通り。ま、あたり前ちゃ、あたり前。なぜなら、3つのセル(3ビット)で表すことのできる数は、0~7までの8通りだから。

 たとえば、セルの[1,1,1]の並びを、二進数(111)として、十進数に変換すると、
1*(2^2)+1*(2^1)+1*(2^0)
=1*4+1*2+1*1
=4+2+1
=7
 いっぽう、ルールは 8ビットで、ルール「146」なら、二進数(10010010)になるが、これを桁の小さいほうから順番に、配列に格納しておく。
myRule = (0,1,0,0,1,0,0,1)
配列の番号は、左から、0番目、1番目…7番目となる。つまり、3つのセルの状態から、生死を決定するルールを取りだし、次の世代を作ることができるわけ。

Ca_004

 新しい次の世代も配列(newGene)を用意しておき、一度、配列に格納してから、世代ごとに描画する。

Flash8のソース(cellular_automaton.zip)

Ca_005

 第1世代は、ランダムに決定しているが、第1世代を点1個にして、ルール90を適用させると、シェルピンスキーのギャスケットになる。