質量保存セルオートマトンの実装

セルオートマトン上で全体の量が保存されるような物理量を扱うにはどのような実装を行えば良いでしょうか。 セルオートマトンの系に存在するのはそれぞれのセルの状態のみであり、現実世界における"質量"のような、増減しない物理量というものは本来存在しません。 この性質のために、セルオートマトンのパターンはほんの小さな種から無限に大きく育つことができますが、一方で「増減しない」という制約の不在により、現実世界では当たり前に存在する現象を作りにくい部分があります。 物理量の保存 セルオートマトン系全体でなにかの量が保存されるということはグローバルな制約ですが、セルオートマトンの計算はローカルに行われるので、大局的な制約を局所的に実装するという、一見あべこべな仕組みを矛盾なくつくる必要があります。 これをセルオートマトン自体の仕組みと矛盾なく導入するには、ある量(以下、“質量"と呼ぶことにします)の移動の際に、移動先と移動元の増減が一致するような計算であれば良いことになります。 また、この要件を現行の計算機上で実現する際には浮動小数点の誤差が問題になりうるので、移動する質量は整数とするなどという制約を設けておく必要があります。 これらをまとめると以下の要件となります。 要件 セルの状態に、系全体で増減しない量を導入できること セルオートマトンの定義に従ったまま実装できること 現行の計算機で実現できる仕様であること 決定論的計算であること※ ※ これはわたしの趣味です。決定論的な計算ができないから乱数を導入するっていうのは、問題から逃げてないですか? 仕様 これらの要件から矛盾を含まない仕様を起こしました。 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 これは昔、質量保存セルオートマトンを実装しようとして失敗した系です。 この系の質量の総和はおおよそ一定ですが、仕様不備の条件に当たると少しずつ失われてしまい、保存されているとは言えません。 実装の不足ではなく仕様に不備があるのが原因です。 仕様の問題点は、各々のセルに1種類の物質しか格納できないという部分で、この仕様のため、セルが空(真空)になる直前に最後に残った質量の移し先がないという状態が存在し得ます。 この系は流体シミュレーションをセルオートマトンで実装することを目的として作成したので、周囲に流体が詰まっている中にほぼ空のセルが存在することが許容できず、質量の喪失を許容にしました。 質量保存セルオートマトン 制約と範囲 セルオートマトンの定義を引き継いだまま質量の総和を一定にするには、質量の移動時に移動元から失われる量と移動先に追加される量が釣り合っている必要があります。...

11月 27, 2022

MembraneAutomata

これは学生の頃、連休中に思い立って書き上げたMacアプリケーションです。 10年以上前の実装にも関わらず現行マシンで問題なくコンパイルできました。実装言語のObjective-CとCに大きな更新がなかったためかな? 当時はパターンが収束してしまうことがわかり触るのをやめてしまったのですが、モデルの筋はいい気がするのでパラメータを変えて自動探索にかけたらなにか生まれそうな気がします。 概要 生命現象の土台となる恒常性をもつパターンが現れうる系を作成しました。今回はモデルと計算の簡便さから、系の基本構造にはセルオートマトンを採用しました。セルオートマトンはConway’s Game of Life[^1]に代表されるように、単純なモデルを比較的少ない計算量で実行できる便利な計算モデルです。しかしパターンの恒常性の観点から考えると、ひとつのセルの状態が反転しただけで崩壊するような不安定なモデルに恒常性をもたせるのは困難です。MembraneAutomataでは近傍半径を増やす[^2]ことで頑強なパターン構築を可能にしました。そしてMNCAの上で、恒常性のある領域を外界から隔離するために、泡状の構造が生成される簡易化学モデルを実装しました。 ^1: Conway’s Game of Life - Wikipedia ^2: Multiple Neighbourhood Cellular Automata (MNCA)と呼ばれる。Understanding Multiple Neighbourhood Cellular Automata Motivation of Current Work 私は生命のもつ予測不能性を再現するというテーマを研究しており、この作品はそのテーマのうえで、恒常性の創発に主眼を置いて作ったものです。予測不能性という制約のもとで設計するためには、実現したい現象(ここでは恒常性)を直接実装するのではなく、下位の現象を実装することを介して、実現したい上位の現象を創発する、という手法をとる必要があります。本作ではセルオートマトンの状態遷移ルールを適切に設定することによりそれを実現しました。 要件 系の要件 a. 比較的単純かつ小規模な計算で実現できること b. 現れるパターンがConway’s Game of Lifeより安定していること a.モデルの単純さと計算しやすさの要件からセルオートマトンを選択し、b.パターン安定の要件から近傍半径を増やして近傍セルひとつあたりのパターンへの影響度を小さくすることにしました。 セルオートマトンのルール要件 c. 恒常性をもつパターンが発生しうること c1. 系全体では、自然な行いに任せていると秩序が失われること(現実世界でのエントロピーの増大則と同等の仕組み) c2. そのような系のなかで、外界に影響されない区画が存在すること c21. その区画の境界部分が外界の影響を打ち消し、内部に伝えない役割を果たすこと 現実の現象を参考にこれらの要件を満たすルールを考えると、水中の油滴、あるいは泡を抽象化することで理解しやすいモデルを作れそうに思えます。泡状のパターンの境界付近で外界の影響を打ち消し、内部に恒常性をつくる、という構造です。 実装仕様 実装: MembraneAutomata - GitHub MNCAの実装 MembraneAutomataで実装するMNCAは近傍半径を2以上に拡張したものです。自セルの次の状態に影響する近傍セル数 n 近傍半径を r と置いたとき n = (r * (r + 1)) * 4...

7月 30, 2022