セル・オートマトン

JavaScriptによるセル・オートマトンの描画プログラムの焼き直し版。

概要

2011/06/26

JavaScriptでセル・オートマトンをCanvasを用いて書き直したコンテンツ。

このページではセルオートマトンの描画にJavaScript,Canvasを使用している。

2次元セル・オートマトン - ライフゲーム

2011/06/26

説明

セル・オートマトン(Cellular Automata)とは、任意次元の空間内のセルを、それぞれ周りのセルの状態によって変化させていくことで自律的に変化し続けるモデルのことを言う。

2次元セル・オートマトンは2次元平面の方眼紙を考え、各セルを隣接するセルの状態によって操作していく。例えばあるセルを囲む隣接セルの個数は8個で、セルの状態が0か1かの2通りを考えると、8個のセルの状態は28=256種類ある。そして256種類の状態によってセルを0にするか1にするかを選ぶため、近接8セルの状態を使うセル・オートマトンのバリエーションは2256種類ある。

2次元セル・オートマトンで最も有名なものがライフゲームだ、その操作規則は以下のようになる。セルは白か黒の二通りをとる。

  1. 周りの8セルのうち3つのセルが黒ならそのセルは黒になる。
  2. 周りの8セルのうち2つのセルが黒ならそのセルは現状を維持する。
  3. それ以外ではそのセルは白になる。
変化の例
ライフゲームの規則適用例

この規則を全てのセルについて繰り返し適用し続ける。

"ライフゲーム"の名前の通りこれは生物の増殖を模した結果を与える。過密すぎても過疎過ぎても生物は死に(白)、最適な環境(2か3)の時のみ生きていく(黒)ことができる。

スクリプト

以前のものより高速化・高機能化されている。ライフゲームは停止中にフィールドをクリックして配置を手動で変更できる。また下にある定形から有名なライフゲームの配置を入力できる。

設定フォーム
フィールドの大きさ(0より大きな自然数)
2cells
セルの大きさ(0より大きな自然数)
px
グリッドを付ける(処理が非常に重くなる)
進化速度(0で最速、0以上の整数)
ms
初期密度(1〜99%)
%
境界のループ

描画フィールド

Canvas Field
世代
世代
定形

定形型では任意の決まった初期配置を作る。設定フォームの入力値は、初期密度と境界のループ(境界面はループするものとしないもので固定)以外はそのまま引き継がれる。ただしフィールドの大きさは足りなければ自動的に増やされる。初期配置はフィールドの中心に配置される。

適した初期値の入力を使えば、定形の種類ごとに見やすい初期値が設定フォームに入力されるようになっている。

固定物体
振動子
移動物体
繁殖

1次元セル・オートマトン

2011/06/26

説明

1次元セル・オートマトンは直線上に並ぶセルを扱う。よって2次元のフィールドで全ての世代を描画することが出来る。また自分自身と前後の2セルの合計3セルの状態で決定するならば、その総数は22*2+1=256種類しかない。

1次元セルオートマトンのパターン数
相互作用距離1のときのパターン数

相互作用距離が1のときの1次元セル・オートマトンの親の世代は上に図示した8種類しか存在しない。この8種類について、白になるか黒になるかを決定すれば良い。

スクリプト1

フィールドの大きさ×世代数のサイズの計算結果を出力する。相互作用距離は2まで指定でき、それに合わせて規則番号の範囲も変わる。規則番号はセルの変化率を表すλパラメータ(変化率0〜1)からの入力も可能。境界のループはOFFにするとオーバーした範囲の参照が強制的に白で固定される。

初期化すると2次元と同じように初期状態のセルをクリックで変更可能。実行すると入力した初期状態からオートマトンを開始する。初期化を押さずに実行を押しても描画可能(ただし初期状態を手動で入力できない)。一点固定にチェックを入れると初期状態が1点になる。

スクリプト自体の詳しい説明は下記参照。

設定フォーム
相互作用距離(1又は2)
フィールドの大きさ
cells
世代数
世代
規則番号(距離1:0〜255,距離2:0〜4294967295)
番(λ=0〜1から自動生成 )
初期密度(0〜100%)
%(一点固定:)
境界のループ
セルの大きさ
px
グリッドを付ける(処理が非常に重くなる)
着色

描画フィールド Canvas Field
...

スクリプト2

2準位近傍nマスの強化型、パターン番号の生成に多倍長数演算を使っているので、他と分離。相互作用距離は無制限だが現実的には7が限界、3以上ではパターン番号が数十〜数百桁の自然数になるので手動での入力はほぼ不可能、完全ランダム生成できる。

設定フォーム
相互作用距離(最大7程度)
フィールドの大きさ
cells
世代数
世代
規則番号
(λ=0〜1: )
初期密度(1〜99%)
%(一点固定:)
境界のループ
セルの大きさ
px
グリッドを付ける(処理が非常に重くなる)
着色

描画フィールド Canvas Field
...

スクリプトの詳細

相互作用距離、フィールドの大きさ、世代数、セルの大きさ、グリッドは説明不要。初期世代密度は初期状態に占める"黒"の比率、境界のループはチェックを入れると両端がそれぞれ反対側にループしチェックを入れなければ両端よりも先は全て"白"になる。規則番号と着色については詳しく説明する。

規則番号

規則番号はセル・オートマトンに適用する変化規則を定義する番号だ。白を0、黒を1とすると、相互作用距離1の1次元セル・オートマトンは先に述べたように8種類の状態について次の状態を決定する。8種類の状態は0と1で表現すれば、000,001,010,011,100,101,110,111の8種類で、0〜7までの数を二進数で表したものと同じになっている。この8個について次の状態を0か1で定義するのだから順番に0と1を並べていけば良い。例えば00011110と並べこれを二進数とみなすと十進数に変換した数字は30になる。これが規則番号30になる。

このようにして00000000〜11111111までの0〜255までの規則番号を定義する。相互作用距離1なら3セルの状態、つまり23=8種類の親状態があり、規則番号の総数は8桁の二進数、28=256種類となる。相互作用距離nと規則番号の種類の表は次のとおりになっている。

相互作用距離と規則の総数
n 状態の数 規則の数
1 8 256
2 32 4294967296
3 128 3.4028236692093846346337460743177e+38
4 512 1.3407807929942597099574024998206e+154
5 2048 3.231700607131100730071487668867e+616

表の示すように相互作用距離3以上では規則番号の桁数は38桁で通常のプログラムでは取り扱えない。故に巨大数演算のライブラリを導入して、スクリプト2に分離している。ただし、規則番号の桁数が幾ら巨大であっても、セル・オートマトンを動かすときに作る規則の数は表の状態の数と同じで、616桁の規則番号を持つn=5のときでも状態の数は2048なので簡単に取り扱うことができる。

λパラメータ

λパラメータとはセルの操作規則のうち、セルが生きた状態(黒)をとる割合のことだ。

例えば規則番号30では次のようになる。

規則番号30の変化規則一覧
規則番号30の変化規則一覧

生きた状態(黒)になる状態の数は4種類で、4/8、λパラメータは0.5になる。

着色

セルの種類は白か黒の2種類だけだが、より鮮やかに表現するために着色できる機能を独自につけている。原理は、黒(生きた状態)になったときのみ、そのセルに適用した状態の番号をhslaで色に変換している。白のときは何もせず白で着色している。

λパラメータ項の変化規則を例にすると、左から順に0〜7の番号を振り、360度を8分割したk番目でhsla(360*k/8,100%,50%,1)としている。ただし実際には小数点以下を切り捨てにする処理をしている。同様に、n種類の状態のk番目を360*k/n度の色に割り当てる。