ライフゲームの創発とシミュレーション

## **📌 はじめに**

ライフゲーム（Conway's Game of Life）は、数学者 **ジョン・コンウェイ** によって考案された **セル・オートマトン** の一種です。

シンプルなルールを持ちながらも、**創発（Emergence）** の概念を示す非常に興味深いシミュレーションモデルです。 本記事では、Python を使ってライフゲームをシミュレートし、アニメーションとして可視化する方法を学びます。

また、ライフゲームが複雑系とどのように関係するのかについても解説します。

---

## **📌 GitHub & Booth**

本記事のコードは、以下のリポジトリおよび Booth で無料配布しています。

📂 **Booth で ZIP 版をダウンロード（無料）**  
👉 [https://complex-dynamics.booth.pm/items/xxxxx](https://complex-dynamics.booth.pm/items/xxxxx)

📌 **GitHub でソースコードを確認**  
👉 [Complex-System（ライフゲーム）](https://github.com/Ry02024/Complex-System/tree/main/life_game)

🚀 **Google Colab で直接実行**  
👉 [Google Colab で開く](https://colab.research.google.com/github/Ry02024/Complex-System/blob/main/notebooks/life_game.ipynb)

---

## **📌 ライフゲームとは？**

### **基本的なルール**

ライフゲームは、以下の **4つのルール** に基づいて動作します。

1. **誕生** → 周囲にちょうど3つの生存セルがあれば、死んでいるセルが誕生（1になる）。
2. **生存** → 生きているセルは、2つまたは3つの生存セルがあればそのまま生存。
3. **過疎** → 生存セルが1つ以下の場合、孤立して死ぬ（0になる）。
4. **過密** → 生存セルが4つ以上ある場合、過密で死ぬ（0になる）。

このルールが **すべてのセルに対して同時に適用** されることで、時間とともにパターンが進化します。

このスクリプトの説明は以下です。

ライフゲームの**基本的なルール（誕生・生存・過疎・過密）**は、**Pythonスクリプトの`update_grid`関数**で実装されています。

---

## **📌 `update_grid` 関数の該当部分**
```python
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)` の条件を満たさないため死亡 |

---

### **📌 詳細な処理の流れ**
1. **近傍セルの合計を計算**（`neighbors = convolve(grid, kernel, mode='wrap')`）
   - `kernel` を使って **3×3 の範囲の合計** を計算
   - `mode='wrap'` により、境界をループさせてトーラス状にします

2. **ルール適用**
   - `neighbors == 3` の場合、新しいセルが誕生（`1` になる）
   - `grid == 1` かつ `neighbors == 2` の場合、そのまま生存
   - その他のケースでは `0`（死ぬ）

---

## **📌 ルールのまとめ**
ライフゲームの基本ルールは **`update_grid(grid)` 関数** で実装されている。  
特に `neighbors == 3` や `grid == 1 & neighbors == 2` の条件が、**誕生・生存・過疎・過密** のルールを反映しています。

---

## **📌 Python でライフゲームを実装する**

本記事では、Google Colab で実行できる Notebook 版 を用意しました。

以下のリンクから `.ipynb` ファイルを開き、セルを実行するだけでアニメーションが動作します。

🚀 [**Google Colab で実行**](https://colab.research.google.com/github/Ry02024/Complex-System/blob/main/life_game/lifegame.ipynb)

💡 以下は Google Colab で実行するコードの抜粋です（セルを順番に実行してください）。

---

### **📌 実装コード**

以下のコードは、Matplotlib を使ってライフゲームをアニメーションとして可視化するものです。

```python
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**
![life_game.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976506/50e0ff46-8036-0eef-2607-96bce4701fea.gif)
---

## **📌 ライフゲームの応用例**

### **✅ 創発のシミュレーション**
単純なルールから**複雑なパターン** が生まれることを可視化できます。

### **✅ スマートシティのモデル化**
都市設計における**人口分布のシミュレーション** などに応用可能。

### **✅ AI・機械学習のデータ生成**
パターンの解析や**自然なデータセットの生成** に利用可能。

---

## **📌 まとめ**

✅ **ライフゲームは、シンプルなルールから複雑なパターンが生まれる興味深いモデル！**  
✅ **Pythonで数十行のコードで簡単に実装可能！**  
✅ **Google Colabで、ダウンロード不要ですぐに試せる！**  
✅ **Boothで無料ダウンロード可能！**  

---
# **注意事項**

- **読者の皆様へ**  
  私はまだ学びの途中にある身ですので、内容に不足や誤りがあるかもしれません。  
  もしお気づきの点があれば、ぜひコメント欄でご指摘いただけると幸いです。  
  この試みが、少しでも読者の皆様の学びや発見につながれば嬉しく思います。

- **記事作成の背景**  
  この記事は、ChatGPTを活用して作成しました。AIの力を借りることで、効率的かつ迅速にコンテンツを生成する実験を行っています。  
  記事内容は、私自身が複雑系の学びを深めるためにまとめたものであり、これを通じて知識を共有しつつ、さらなる学びを促進することを目指しています。

- **コードについて**  
  本記事に掲載されているコードは、Google Colab上で動作確認済みです。  
  もしコードを実行する際にエラーが発生した場合は、Python環境やライブラリのバージョンに注意してみてください。  
  また、コメントやフィードバックをいただければ幸いです。

---
## **🔗 関連リンク**

📌 **GitHub でコードを確認**  
➡ [Complex-System（ライフゲーム）](https://github.com/Ry02024/Complex-System/tree/main/life_game)

📌 **Google Colab で直接実行**  
➡ [Google Colab で開く](https://colab.research.google.com/github/Ry02024/Complex-System/blob/main/life_game/lifegame.ipynb)

📌 **Booth で無料ダウンロード**  
➡ [Pythonで学ぶライフゲーム【無料】](https://complex-dynamics.booth.pm/items/6469444)

---

🚀 **この記事が役に立ったら、Qiitaの「LGTM」をお願いします！**  
📢 **質問やコメントはお気軽にどうぞ！**