地図/創発/グリッド

崩れて、また崩れて — 砂山モデル

各マスに砂粒の数を持たせて、中央のマスへひたすら1粒ずつ落とす。あるマスが4粒以上になったら、4粒を上下左右の隣へ1粒ずつ配って自分は4減らす。これで崩れる。

崩しの一手は、4以上のマスから4を引いて、四方へ1ずつ足す。端では配り先が盤面の外になるので、その向きには配らない。配られた粒は盤面の外でこぼれて消える。sand を直接いじる。崩した結果がそのまま次のマスの判定に効いてよく、読む面と書く面を分けずに、その場で順に崩していける。

// 1マスを崩す: 4 減らして四方へ1ずつ
sand[i] -= 4
if (x > 0) sand[i - 1]++
if (x < N - 1) sand[i + 1]++
if (y > 0) sand[i - N]++
if (y < N - 1) sand[i + N]++

崩した先がまた4を超えることがある。盤面を一度なめて、どこか1マスでも崩れたら、もう一周なめ直す。崩れがどこにも起きなくなるまでこれをくり返す。1粒の追加が、その場で雪崩のように連鎖して広がる。

let toppled = true
while (toppled) {
  toppled = false
  for (let y = 0; y < N; y++) {
    for (let x = 0; x < N; x++) {
      if (sand[y * N + x] >= 4) {
        // ここで上の「1マスを崩す」を実行
        toppled = true
      }
    }
  }
}

落とし続けると、山はなだらかに高くなるのでなく、四角い領域がフラクタルな紋様に分かれていく。0〜3 の高さを4段の濃淡で塗っているだけで、同じ模様が大小の縮尺でくり返す自己相似の紋様が出る。中央へ1粒足すたびに、崩れの連鎖が広がる範囲はそのつど違う。

砂山モデルは Bak・Tang・Wiesenfeld が 1987 年に提案した、自己組織化臨界(self-organized criticality, SOC)の代表例。臨界(雪崩がどんなスケールでも起き、その大きさがべき乗則に従う状態)は普通、パラメータをぴったり合わせないと現れない。砂山は「4で崩す」だけで、つまみの調整なしに勝手に臨界へ吸い寄せられる。雪崩の大きさのべき乗則は、ノイズの世界でいう 1/f ゆらぎと地続きで、地震の規模分布や山火事など、自然のあちこちで同じ統計が現れる。