セルオートマトン上で全体の量が保存されるような物理量を扱うにはどのような実装を行えば良いでしょうか。
セルオートマトンの系に存在するのはそれぞれのセルの状態のみであり、現実世界における"質量"のような、増減しない物理量というものは本来存在しません。
この性質のために、セルオートマトンのパターンはほんの小さな種から無限に大きく育つことができますが、一方で「増減しない」という制約の不在により、現実世界では当たり前に存在する現象を作りにくい部分があります。
物理量の保存
セルオートマトン系全体でなにかの量が保存されるということはグローバルな制約ですが、セルオートマトンの計算はローカルに行われるので、大局的な制約を局所的に実装するという、一見あべこべな仕組みを矛盾なくつくる必要があります。
これをセルオートマトン自体の仕組みと矛盾なく導入するには、ある量(以下、“質量"と呼ぶことにします)の移動の際に、移動先と移動元の増減が一致するような計算であれば良いことになります。
また、この要件を現行の計算機上で実現する際には浮動小数点の誤差が問題になりうるので、移動する質量は整数とするなどという制約を設けておく必要があります。
これらをまとめると以下の要件となります。
要件
- セルの状態に、系全体で増減しない量を導入できること
- セルオートマトンの定義に従ったまま実装できること
- 現行の計算機で実現できる仕様であること
- 決定論的計算であること※
※ これはわたしの趣味です。決定論的な計算ができないから乱数を導入するっていうのは、問題から逃げてないですか?
仕様
これらの要件から矛盾を含まない仕様を起こしました。
- t+1に影響する近傍セルはノイマン近傍(上下左右の4近傍)とする
- これは決めの問題でムーア近傍(8近傍)でもなんでも良い
- とりあえず計算サイクルあたりの計算量が少ないので採用
- 一般的なセルオートマトンのようにセルに着目してt+1の状態を計算するのではなく、隣接するセルのペアに着目し、そこにどれだけの質量の移動があるのかを算出する
- → 微分的操作 の項で説明
- 移動する質量の量の算出は、移動元と移動先の状態から一意に定まるのであればなんでも良い
- ひとつのセルは複数のセルと隣接するので、計算方法によっては流出質量の合計量がセルに格納されている質量を超える、つまりセルの質量が負数となりうる。これは質量のメタファーとしては問題だが、今回はなんらかの物理量が保存されることそのものを目的とするので特に解決しない
- 解決したい場合は、1計算サイクル内で流出する質量が、現在セルに格納されている量に依存して決定されるような計算にすれば良い
- ひとつのセルは複数のセルと隣接するので、計算方法によっては流出質量の合計量がセルに格納されている質量を超える、つまりセルの質量が負数となりうる。これは質量のメタファーとしては問題だが、今回はなんらかの物理量が保存されることそのものを目的とするので特に解決しない
実装
実際に質量が保存するセルオートマトンを実装しました。
これらのセルオートマトンのセルの状態は、ある"物質"の"質量"がどれだけ格納されているか、と言い表すことができます。
単一物質の質量保存
質量保存の最も単純な形です。
質量の移動は、単純に質量の多いセルから少ないセルへ移動するという計算を設定しています。
それぞれのセルがランダムな質量をもつ初期状態から開始すると、だんだん質量の偏りが解消されて最終的には全体で一様な状態で安定します。
これは流体シミュレーションそのものであり、例えば質量の移動を行えない"障害物"セルを用意して"流路"を制限したりすることでより複雑なふるまいを観察することができるでしょう。
複数物質の質量保存
Multi State Mass Conservation CA
ふたつの"物質"を用意したうえで物質間の相互作用を設定しました。
相互作用はなんでもよかったのですが、わかりやすいように、チューリング波を参考にして相互に排斥し合うような作用を設定しました。
セルが物質の格納量を状態としてもつのは同じですが、この系ではふたつの物質(物質Aおよび物質Bと呼ぶことにします)が格納されており、例えば「物質Aが30, 物質Bが20格納されている」という状態をもちます。
これらの物質は、ふたつのセルの間で以下の圧力にしたがって移動します。
- a. 同じ物質同士が同じ格納量になろうとする力
- b. 異なる物質を排斥しようとする力
- c. 全ての物質の格納量が等しくなろうとする力
大まかにまとめると格納量の濃淡を均一化しながら同じ物質同士で塊をつくるようなルールになっており、実際に計算させると縞状の模様でふたつの物質が交互に並ぶパターンで安定します。
今回は計算の容易さのために最小の近傍半径(= 隣のセルまでしか影響を及ぼさない)をとったために生まれるパターンが細かいものになりましたが、近傍半径を大きく(multiple neighbourhood)すればより大きな塊をつくるようになり、水と油を混ぜたようなパターンが生まれそうです。
実装に失敗した系
これは昔、質量保存セルオートマトンを実装しようとして失敗した系です。
この系の質量の総和はおおよそ一定ですが、仕様不備の条件に当たると少しずつ失われてしまい、保存されているとは言えません。
実装の不足ではなく仕様に不備があるのが原因です。
仕様の問題点は、各々のセルに1種類の物質しか格納できないという部分で、この仕様のため、セルが空(真空)になる直前に最後に残った質量の移し先がないという状態が存在し得ます。
この系は流体シミュレーションをセルオートマトンで実装することを目的として作成したので、周囲に流体が詰まっている中にほぼ空のセルが存在することが許容できず、質量の喪失を許容にしました。
質量保存セルオートマトン
制約と範囲
セルオートマトンの定義を引き継いだまま質量の総和を一定にするには、質量の移動時に移動元から失われる量と移動先に追加される量が釣り合っている必要があります。
一方でこの制約が満たされていれば、移動する条件や量に関して制限はありません。任意の計算によって求めて良いということになります。
つまり質量保存という性質は「移動量の辻褄を合わせる」という制約を加えることで実現でき、実際の状態遷移はその制約に反しない範囲で任意に設定できるということです。
微分的操作
質量保存セルオートマトンの新規性は、既存のセルオートマトンの「セルの状態に着目する計算」から「セル間の状態の移動に着目する計算」に視点を移している点です。
量の変化に着目するという点から、この操作を 微分的操作 と呼ぶことにします。
セルオートマトンにおいて、セルの状態遷移に対して微分的操作を行い質量保存という性質を得ました。
ではそこからさらに微分的操作をすることで、 運動量の保存 のメタファーとなりうる性質を付与できるのではないでしょうか。