ライフゲームの初期密度を6倍変えても、行き着く密度は同じだった。違うのは「落ち着くまでの時間」だけ
約9分で読めます

ライフゲームの初期密度を6倍変えても、行き着く密度は同じだった。違うのは「落ち着くまでの時間」だけ


コンウェイのライフゲームのルールは3行で終わる。格子の各マスは生きているか死んでいるかのどちらかで、周囲8マスの生存数を数えて、

  • 生きているマスは、周囲が2か3なら生き残る。それ以外は死ぬ
  • 死んでいるマスは、周囲がちょうど3なら生まれる
  • それを全マス同時に適用する

これだけだ。それだけのルールから、グライダーが飛び、振動子が点滅し、有名なグライダー銃が無限にパターンを吐き出す。

私が確かめたかったのは、もっと素朴なことだった。最初にどれくらいの密度でマスを埋めるかによって、行き着く先はどう変わるのか。 パーコレーションの回で、占有率1.5ポイントの差で貫通確率が0%から100%に跳ぶ相転移を見たばかりだったので、ライフゲームにも似た臨界密度があるのではないかと思っていた。薄すぎれば死に絶え、濃すぎれば過密で死に絶え、その間のどこかに「一番よく育つ密度」があるはずだ、と。

半分当たっていて、半分は完全に外れていた。

実験に使ったコードの全文はGitHubに置いています

初期密度を0.02から0.95まで振る

384×384384 \times 384のトーラス(上下・左右がつながった格子)で、初期密度ppを18通り、各4シードで2000世代まで回し、最後の200世代の平均密度を「行き着いた密度」とした。

上下2段のグラフ。上段は初期密度に対する2000世代後の生存密度で、密度0.02では0に近く、0.12から0.70までは0.033〜0.038の薄い赤帯の中に平らに並び、0.78以降は再び0に落ちる台形のような形をしている。下段は同じ横軸に対する「最終密度の2倍を下回るまでの世代数」で、両端は1世代、中央の初期密度0.375で307世代の山になっている

両端は予想通りだった。初期密度0.02では3世代で事実上壊滅し、0.90以上でも過密ですぐ死に絶える。

外れたのは真ん中だ。初期密度0.12から0.70まで、約6倍の幅がある。その全部が、2000世代後には密度0.033〜0.038という同じ帯に入った。 半分埋めて始めても、1割強しか埋めずに始めても、行き着く密度は同じになる。パーコレーションのような「臨界点を挟んで結果が跳ぶ」構造ではなく、広い平原がある。

初期密度によって変わるのは、そこに至るまでの時間だった(下段)。密度が最終値の2倍を下回るまでの世代数を測ると、初期密度0.375で307世代と最も長く、そこから両側に向かって短くなる。濃く始めても薄く始めても、行き先は同じで、途中の暴れ方だけが違う。

燃え尽きるまでを見る

初期密度0.375から始めた220×220220 \times 220の格子を、900世代まで。

ライフゲームのアニメーション。最初は画面全体が細かい黒い点でびっしり埋まった状態から始まり、数世代で大きく間引かれて泡立つような模様になる。世代が進むにつれて活動している領域が減っていき、最後には静止した小さな塊と点滅する短い線が広い空白の中に点在する状態に落ち着く。左上に世代数と密度が表示され、密度が0.376から0.04付近まで下がっていく

序盤の数十世代で一気に間引かれ、そこから泡立つように活動しながら、少しずつ静かになっていく。ライフゲーム界隈ではこの燃え尽きた残骸を灰(ash)と呼ぶ。

「落ち着いた」と書いたが、これは正確ではない。10,000世代まで回してみると、下げ止まらない。

横軸が世代(対数目盛)、縦軸が生存密度の折れ線グラフ。0.376から始まり、最初の100世代で0.09近くまで急激に落ち、その後は対数軸上でほぼ直線的に緩やかに下がり続け、10,000世代でも0.0291でまだ減少が続いている

世代密度
00.37637
1000.09271
1,0000.04312
2,0000.03659
10,0000.02911

2000世代時点の0.0366を「行き着いた密度」として上のグラフを描いたが、10,000世代では0.0291まで下がっている。対数軸で見るとほぼ直線、つまり世代数を10倍にするごとに一定量ずつ減る。まだ動いている物体がたまに隣の静止物にぶつかって壊す、というのが延々と続くからだ。ライフゲームの「定常状態」は、実際には非常に長い時間をかけて薄まり続ける状態でしかない。

灰は何でできているか

1500世代後の格子を連結成分に分け、それぞれが静止しているか(次の世代で変わらない)、周期2で振動しているか(2世代後に戻る)を判定して数えた。

左は横棒グラフで、灰に含まれるパターンの割合がブリンカー31.9%、ブロック31.5%、ハチの巣17.9%、パン6.2%、舟/池の類6.0%、船/舟の類1.4%、船1.2%の順に並んでいる。右は円グラフで、1500世代後の状態が静止物57.0%、周期2の振動子28.6%、まだ動いている14.5%に分かれている

落ち着いた5,601個のうち、ブリンカー(31.9%)とブロック(31.5%)の2種類だけで63%を占める。上位3種(ハチの巣を含む)で81%。あれだけ豊かな挙動を見せておいて、最後に残るものの種類はごく少ない。

そして1500世代の時点でも14.5%はまだ動いている。これが上で見た「下げ止まらない」の正体だ。

時空図で見る

各世代を高さ方向に積み上げると、ライフゲームの履歴が3次元の物体になる。回転させてみてほしい。

下(赤い側)が初期のカオス、上(濃紺)が落ち着いたあと。静止物は垂直な柱として、振動子は途切れながら続く柱として、グライダーは斜めの筋として現れる。乱れた層が下にあって、上に行くほど柱ばかりになる——「燃え尽きる」という言葉がそのまま形になっている。

1セルだけ違う2つの宇宙

最後に、初期状態をたった1セルだけ反転させた2つの格子を並走させた。801×801801 \times 801で350世代。

左は横軸が世代、縦軸が違いの届いた距離のグラフ。灰色の破線が傾き1の理論上限を示し、赤い実測線は最初はそれに沿って伸びるが、途中から傾きが緩くなり350世代で132セルに達している。右は食い違うセルの数のグラフで、緩やかに増えて350世代で約4,000セルに達している

ライフゲームでは、情報は1世代に1セルより速く伝わらない。この上限は「光速cc」と呼ばれる。実測した違いの広がりは、最初の8世代だけは1, 2, 3, 4, 5, 6, 7, 8 と理論上限ぴったりで進み、そこから遅くなって、全体では0.32セル/世代に落ち着いた。上限では走れるが、いつも走るわけではない。周囲がたまたま静止物ばかりなら、違いはそこで止まる。

350世代後には4,076セルが食い違っている。1セルの違いが4,000セルの違いになる——ロジスティック写像で測ったバタフライ効果の格子版だ。ただしあちらが指数的に爆発したのに対し、こちらは伝わる速さに厳しい上限があるぶん、広がり方は多項式的にしか育たない。

まとめ

  • 初期密度0.12〜0.70(6倍の幅)は、すべて2000世代後の密度0.033〜0.038に収束した。行き先は初期密度で決まらない
  • 変わるのは落ち着くまでの時間で、初期密度0.375が最も長く暴れた(307世代)
  • 「落ち着いた」は近似。10,000世代まで回すと0.0291までまだ下がり続ける
  • 灰の63%はブリンカーとブロックの2種類だけ。1500世代でも14.5%はまだ動いている
  • 1セルの違いは、最初の8世代こそ理論上限の1セル/世代で広がるが、平均では0.32セル/世代

臨界密度を探しに行って、見つからなかった。代わりに見つかったのは、広い範囲の初期条件がひとつの状態に吸い込まれていく、という別の構造だった。


初期密度を6倍変えても、2000世代後の密度は変わらない。この結果を見たとき、正直なところ少し落胆した。せっかく18通りも試したのに、グラフの真ん中が平らなのだ。

でも面白いのは下段のほうだった。行き先は同じでも、そこに着くまでにかかる時間は3桁近く違う。1世代で決着がつく初期密度もあれば、307世代ぶん暴れ続ける初期密度もある。そして最も長く暴れるのは、極端に薄くも濃くもない、真ん中あたりの密度だった。

同じところに落ち着くなら、途中の307世代には意味がなかったのだろうか。灰の組成を見るかぎり、そうとも言えない。長く暴れた盤面ほど多くのパターンが生まれては消え、その残骸として今の灰がある。行き先が同じでも、通ってきた経路は残る。密度という1つの数字では見えないだけで。