Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 関連:Schellingの分居モデル

要点(BLUF)

1. セルオートマトンとは

セルオートマトンは、最もシンプルなエージェントベースモデルです。

全エージェントが同じ単純ルールに従うだけなのに、全体としては設計していないパターンが現れる——これが CA の魅力であり、創発(emergence)の最小実例です。

2. ライフゲームのルール

コンウェイのライフゲーム(Game of Life)は2次元・2状態(生=1/死=0)・周囲8近傍の CA で、ルールはたった4つ:

まとめると「生きた近傍が3個なら誕生/生存、生セルで2個なら生存、それ以外は死」。畳み込みで近傍の生数を一気に数えられます。

import numpy as np
from scipy.signal import convolve2d

def step_life(grid):
    """ライフゲームの1ステップ(周期境界)"""
    # 各セルの生きた近傍の数(自分を除く8近傍)
    neighbors = convolve2d(grid, np.ones((3,3), int), mode='same', boundary='wrap') - grid
    born_or_survive = (neighbors == 3) | ((grid == 1) & (neighbors == 2))
    return born_or_survive.astype(int)

3. ブリンカー:周期2の振動子

3つ並んだ生セルは、縦横に交互に振動します(周期2)。

import numpy as np
from scipy.signal import convolve2d

def step_life(grid):
    neighbors = convolve2d(grid, np.ones((3,3), int), mode='same', boundary='wrap') - grid
    return ((neighbors == 3) | ((grid == 1) & (neighbors == 2))).astype(int)

g = np.zeros((5,5), int); g[2, 1:4] = 1     # 横3つのブリンカー
g1 = step_life(g)
g2 = step_life(g1)
print(f"1ステップ後は変化する:{not np.array_equal(g, g1)}")
print(f"2ステップ後に元へ戻る:{np.array_equal(g, g2)}")

出力:

1ステップ後は変化する:True
2ステップ後に元へ戻る:True

出力の意味:横並び3つが1ステップで縦並び3つになり、もう1ステップで横に戻る——周期2の振動子です。「振動する」という性質は、誰もそうプログラムしていません。4つの生死ルールから自然に出てきた構造です。

4. グライダー:形を保って移動する

5セルの「グライダー」は、4ステップごとに形を保ったまま斜めに1マス移動します。

import numpy as np
from scipy.signal import convolve2d

def step_life(grid):
    neighbors = convolve2d(grid, np.ones((3,3), int), mode='same', boundary='wrap') - grid
    return ((neighbors == 3) | ((grid == 1) & (neighbors == 2))).astype(int)

G = np.zeros((20,20), int)
glider = np.array([[0,1,0],[0,0,1],[1,1,1]])
G[1:4, 1:4] = glider
G4 = G.copy()
for _ in range(4):
    G4 = step_life(G4)

shifted = np.roll(np.roll(G, 1, axis=0), 1, axis=1)   # 元を(1,1)平行移動
print(f"生セル数:開始 {G.sum()} → 4ステップ後 {G4.sum()}")
print(f"4ステップで(1,1)だけ平行移動:{np.array_equal(G4, shifted)}")

出力:

生セル数:開始 5 → 4ステップ後 5
4ステップで(1,1)だけ平行移動:True

出力の意味:5つの生セルが、4ステップ後に形をそっくり保ったまま斜め下に1マス動いた(元を (1,1) 平行移動したものと完全一致)。これは「動く物体」が局所ルールから創発した例で、ライフゲームでは情報を運ぶ「信号」として使えます。ライフゲームはこうした部品を組み合わせると**万能計算(チューリング完全)**を実現でき、「単純な局所規則が任意の計算を生む」ことの象徴になっています。

数式の直観的意味

CA の本質は「大域的な設計図なしに、局所ルールの反復だけで大域構造が決まる」点です。グライダーが動いて見えるのは、実際には各セルが点滅しているだけ——「移動する物体」は私たちがパターンに見出す解釈で、物理的に動いているものはありません。それでもパターンは安定して伝播し、衝突し、相互作用する。畳み込み convolve2d が近傍の生数を数えるのは、各セルが「自分の周りしか見ていない(局所性)」ことの数学的表現です。複雑さは個々のセルではなく、多数の局所相互作用の積み重ねから生まれる——これが ABM 全体を貫く創発の原理で、Schelling流行でも同じ構図が現れます。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文のライフゲーム(ブリンカー周期2・グライダー移動の確認)。決定的なので乱数シードは不要(初期配置で再現)。

関連ノート