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