📌 はじめに
ライフゲーム(Conway's Game of Life)は、数学者 ジョン・コンウェイ によって考案された セル・オートマトン の一種です。
シンプルなルールを持ちながらも、創発(Emergence) の概念を示す非常に興味深いシミュレーションモデルです。 本記事では、Python を使ってライフゲームをシミュレートし、アニメーションとして可視化する方法を学びます。
また、ライフゲームが複雑系とどのように関係するのかについても解説します。
📌 GitHub & Booth
本記事のコードは、以下のリポジトリおよび Booth で無料配布しています。
📂 Booth で ZIP 版をダウンロード(無料)
👉 https://complex-dynamics.booth.pm/items/xxxxx
📌 GitHub でソースコードを確認
👉 Complex-System(ライフゲーム)
🚀 Google Colab で直接実行
👉 Google Colab で開く
📌 ライフゲームとは?
基本的なルール
ライフゲームは、以下の 4つのルール に基づいて動作します。
- 誕生 → 周囲にちょうど3つの生存セルがあれば、死んでいるセルが誕生(1になる)。
- 生存 → 生きているセルは、2つまたは3つの生存セルがあればそのまま生存。
- 過疎 → 生存セルが1つ以下の場合、孤立して死ぬ(0になる)。
- 過密 → 生存セルが4つ以上ある場合、過密で死ぬ(0になる)。
このルールが すべてのセルに対して同時に適用 されることで、時間とともにパターンが進化します。
このスクリプトの説明は以下です。
ライフゲームの**基本的なルール(誕生・生存・過疎・過密)**は、Pythonスクリプトのupdate_grid
関数で実装されています。
📌 update_grid
関数の該当部分
def update_grid(grid):
"""NumPyを使って次の世代を計算"""
kernel = np.array([
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
])
neighbors = convolve(grid, kernel, mode='wrap') # 近傍セルの合計を計算
new_grid = (neighbors == 3) | ((grid == 1) & (neighbors == 2)) # ルール適用
return new_grid.astype(int)
📌 ルールごとの該当処理
ライフゲームのルール | 該当するコード部分 |
---|---|
誕生(3つの生存セルで新しいセルが誕生) | (neighbors == 3) |
生存(2つ or 3つの生存セルでそのまま生存) | ((grid == 1) & (neighbors == 2)) |
過疎(1つ以下の生存セルで死亡) |
(neighbors < 2) → (neighbors == 3) の条件を満たさないため死亡 |
過密(4つ以上の生存セルで死亡) |
(neighbors > 3) → (neighbors == 3) の条件を満たさないため死亡 |
📌 詳細な処理の流れ
-
近傍セルの合計を計算(
neighbors = convolve(grid, kernel, mode='wrap')
)-
kernel
を使って 3×3 の範囲の合計 を計算 -
mode='wrap'
により、境界をループさせてトーラス状にします
-
-
ルール適用
-
neighbors == 3
の場合、新しいセルが誕生(1
になる) -
grid == 1
かつneighbors == 2
の場合、そのまま生存 - その他のケースでは
0
(死ぬ)
-
📌 ルールのまとめ
ライフゲームの基本ルールは update_grid(grid)
関数 で実装されている。
特に neighbors == 3
や grid == 1 & neighbors == 2
の条件が、誕生・生存・過疎・過密 のルールを反映しています。
📌 Python でライフゲームを実装する
本記事では、Google Colab で実行できる Notebook 版 を用意しました。
以下のリンクから .ipynb
ファイルを開き、セルを実行するだけでアニメーションが動作します。
💡 以下は Google Colab で実行するコードの抜粋です(セルを順番に実行してください)。
📌 実装コード
以下のコードは、Matplotlib を使ってライフゲームをアニメーションとして可視化するものです。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from scipy.ndimage import convolve
def initialize_grid(size, density=0.2):
"""ランダムに初期グリッドを生成"""
return np.random.choice([0, 1], size=(size, size), p=[1 - density, density])
def update_grid(grid):
"""NumPyを使って次の世代を計算"""
kernel = np.array([
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
])
neighbors = convolve(grid, kernel, mode='wrap')
new_grid = (neighbors == 3) | ((grid == 1) & (neighbors == 2))
return new_grid.astype(int)
def animate_colab(grid, steps=100):
"""アニメーションをColabで表示"""
fig, ax = plt.subplots()
img = ax.imshow(grid, cmap="binary")
ax.axis('off')
def update(frame):
nonlocal grid
grid = update_grid(grid)
img.set_data(grid)
return img,
ani = animation.FuncAnimation(fig, update, frames=steps, interval=50, blit=False)
return ani
# 実行
size = 20
grid = initialize_grid(size)
ani = animate_colab(grid, steps=50)
# Google Colabでアニメーションを表示
from IPython.display import HTML
HTML(ani.to_jshtml())
実行結果
このコードを実行すると、以下のようなアニメーションが表示されます。
📌 ライフゲーム GIF
📌 ライフゲームの応用例
✅ 創発のシミュレーション
単純なルールから複雑なパターン が生まれることを可視化できます。
✅ スマートシティのモデル化
都市設計における人口分布のシミュレーション などに応用可能。
✅ AI・機械学習のデータ生成
パターンの解析や自然なデータセットの生成 に利用可能。
📌 まとめ
✅ ライフゲームは、シンプルなルールから複雑なパターンが生まれる興味深いモデル!
✅ Pythonで数十行のコードで簡単に実装可能!
✅ Google Colabで、ダウンロード不要ですぐに試せる!
✅ Boothで無料ダウンロード可能!
注意事項
-
読者の皆様へ
私はまだ学びの途中にある身ですので、内容に不足や誤りがあるかもしれません。
もしお気づきの点があれば、ぜひコメント欄でご指摘いただけると幸いです。
この試みが、少しでも読者の皆様の学びや発見につながれば嬉しく思います。 -
記事作成の背景
この記事は、ChatGPTを活用して作成しました。AIの力を借りることで、効率的かつ迅速にコンテンツを生成する実験を行っています。
記事内容は、私自身が複雑系の学びを深めるためにまとめたものであり、これを通じて知識を共有しつつ、さらなる学びを促進することを目指しています。 -
コードについて
本記事に掲載されているコードは、Google Colab上で動作確認済みです。
もしコードを実行する際にエラーが発生した場合は、Python環境やライブラリのバージョンに注意してみてください。
また、コメントやフィードバックをいただければ幸いです。
🔗 関連リンク
📌 GitHub でコードを確認
➡ Complex-System(ライフゲーム)
📌 Google Colab で直接実行
➡ Google Colab で開く
📌 Booth で無料ダウンロード
➡ Pythonで学ぶライフゲーム【無料】
🚀 この記事が役に立ったら、Qiitaの「LGTM」をお願いします!
📢 質問やコメントはお気軽にどうぞ!