連続値版ライフゲーム SmoothLife について

f:id:ir5:20180602152845p:plain

SmoothLife はライフゲームを連続的に拡張したもの。6年くらい前に出て、少し話題になっていたりした。

普通のライフゲーム(復習)

f:id:ir5:20180602152804g:plain

ライフゲームでは、無限の広さをもつグリッド盤面で、各セルに生と死のどちらかの状態が割り当てられているものを考える。 セルの状態は時刻を経るごとに遷移していく。遷移のルールは単純で、次のように表される。

  • あるセルが生のとき、周囲8近傍のセルで生のものがちょうど2つか3つならば次も生である。そうでないなら次は死になる。
  • あるセルが死のとき、周囲8近傍のセルで生のものがちょうど3つならば次は生である。そうでないなら次は死のままである。

初期のセルの盤面の状態を決めると、この遷移ルールによって先の全ての時刻での状態が決まる。ライフゲームの興味深い点は、生と死の状態をうまく配置することで多様なパターンを作り出せることにある。斜めに移動し続けるグライダーはその有名な例である。

SmoothLife

f:id:ir5:20180602152819g:plain

ライフゲームの世界観は"離散的"であった。セルは生と死という0/1であったし、遷移ルールにしても周囲8方向しかみないので、移動体の実装にしてもどうしても移動方向などが縦横斜め45度などに限定されてしまう。 SmoothLife では元のライフゲームのルールを拡張し、任意の方向に飛ばせるグライダー(下図)を実装している。

f:id:ir5:20180602152711g:plain

SmoothLife のルールの概要はこうである。まず、セルの値は0/1という離散値ではなく、[0,1]の連続値であるとする。盤面も本来なら連続的な感じにしたいというのが理想であるが、結局計算機上で実装するためグリッドで区切られるという点は変わらない。時間経過による遷移も1ステップごとで、離散的である。

遷移後のセルの値を決めるにあたっては、周囲8近傍ではなくもっと広範囲:具体的にはセルから半径21以内にあるマスを見る。 その広範囲のマスの中でも、半径7以内にあるマスの値の総和を n、そこから外にあるドーナツ領域にあるマスの値の総和を m とする。 セルの次の値は、この n と m を受け取って [0,1] の値を返す関数によって決まる。この関数の定義は少し複雑なので省略する。細かいことは元論文を見るとまぁいろいろ書いてある。

遷移ルールから回転不変性のようなものがあることが見てわかる。つまり、盤面をあるセルを中心に任意角度に回転させても次の状態でのそのセルの値は回転させる前のそれと大体同じになる。

また、周囲8近傍ではなく広範囲を見るようにすることで、擬似的に連続的な範囲を見ているような感じにしているのだと思う。

設定を変えて観察

SmoothLife は以下のような実装がある。せっかくなので試しに手で少し遊んでみることにした。

  • duckythescientist さんによる numpy 実装
    • 最近公開された。パラメータは元論文に近い。比較的世界観がマイルド。nunpy を使って実装されている。
  • ionreq さんによる C++ 実装
    • 元論文とパラメータや実装が結構違う。鎖のようなオブジェクトが発生したり塊が膨れ上がったりすることがあり、キモい。
    • 今回の実験ではこちらを使った。

遷移後の値を決める関数にはパラメータ(ライフゲームでいう、生と死を決める閾値みたいなもの)がいくつかある。パラメータの1つである b1 を変化させた場合に遷移の雰囲気がどのように変わるかを見ることにした。

デフォルト値(b1=0.257)

f:id:ir5:20180602155915g:plain

まずはデフォルト設定での世界。 円形の微妙に動く物体と鎖のようなオブジェクトが存在し、ゆっくりと変化していく世界が構築されている。

少し減らした場合(b1=0.247)

f:id:ir5:20180602155758g:plain

次に、閾値パラメータ b1 を少しだけ減らして世界がどう変わるかを見た。 ↑はランダム状態からスタートしてしばらく経った状態であるが、鎖のようなオブジェクトだけになって世界が安定してしまった。 何度か初期状態を変えつつリスタートしたものの、すべてこのような鎖状のオブジェが発生して世界が安定するという結果に終わった。

少し増やした場合(b1=0.267):

f:id:ir5:20180602160009g:plain

今度は逆に増やしてみた場合。 こちらでは円形のオブジェクトだけになって、やはり世界が安定してしまった。

「カオスの縁」という言葉があるらしい。 僕はこのへんの分野の専門家ではないので誤解があるかもしれないが、雰囲気としては「観測していて興味深い挙動を示す世界というのは、観測していてつまらない世界(即座に安定状態になったり、単なるランダムに近い挙動をする世界)の相転移となるような位置にある」ということを言っているように見える。 これは上記の観察にまさに一致しているように思う。 b1 という遷移ルールのパラメータをわずかに変えただけですぐにつまらない世界に変わってしまった。

裏を返せば、ゲームの設計者はこのような相転移となるパラメータを見つけるためにかなりの試行錯誤をしなければならないということでもあるだろう。

感想

アメーバ・微生物・カエルの卵っぽい見た目の世界は気持ち悪くて面白い。グライダーを任意の方向に飛ばせるようになったのは改善点として良い。パラメータをうまく調整して無事いい感じのルールを見つけ出せたのも、職人芸的な観点ですごい。が、課題は多い。

ライフゲームがヒットしたのがなぜかというと、単純な数理モデルから信じられないほど複雑で豊かな世界―例えば、固定物体や振動子のような基本素子から、グライダーや宇宙船のような移動物体、さらにはグライダーガンなどといった複雑な構造物―を構築できることにあった。

SmoothLife のモデルの複雑さは、残念ながらライフゲームと比べると跳ね上がっている。実装されているものはグライダーだけで、その他の多くのおもしろオブジェクトは実現できていない。 ライフゲームではアセンブラのような感覚で基本要素となるオブジェクトを配置して、さらに複雑な挙動をするおもしろオブジェクトを生み出すといった楽しみ方をユーザーに提供していたが、モデルが複雑になるとこういうことはしづらいかもしれない。連続方向への拡張というコンセプト自体にそれなりの難がある感じは否めない。

それでも、もし連続系のセル・オートマトンで、ライフゲームのと同じくらい多様なオブジェクトを生み出せるモデルがもしできたらどんな世界が広がっているのだろうかと想像すると、夢があるような気がする。