Langton’s Ant


ラングトンの蟻という興味深いシミュレーションを発見し, その動作を実装してみた.
これは, アメリカの研究者である Christopher Langtonによって提唱されたセル・オートマトンの一種であり, 極めて単純な規則に基づくが, 予期しない複雑なパターンを生じることが知られている.

本シミュレーションでは, 以下のような仮定のもとで動作する.
平面は格子状に構成され, 各セルは白または黒に塗り分けられる. この格子上を移動するエージェントを「アリ」とし, アリは以下の規則に従う.

  1. アリが白いセルにいる場合, 90°右に方向転換し, そのセルの色を反転させ, 1マス前進する.
  2. アリが黒いセルにいる場合, 90°左に方向転換し, そのセルの色を反転させ, 1マス前進する.

この単純なルールに従うだけで, 初期段階ではランダムな動きを示すが, 一定のステップ数を超えると規則的な「ハイウェイ」と呼ばれる直線的なパターンを形成することが確認されている.

コードと結果は下記.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from PIL import Image, ImageSequence

# グリッドサイズ
GRID_SIZE = 101  # 奇数にすると中心に蟻を配置しやすい
STEPS = 50000    # シミュレーションステップ数

# 蟻の移動方向(上, 右, 下, 左)
DIRECTIONS = [(0, 1), (1, 0), (0, -1), (-1, 0)]

def langtons_ant(grid_size, steps):
    grid = np.zeros((grid_size, grid_size), dtype=int)  # 0: 白, 1: 黒
    ant_x, ant_y = grid_size // 2, grid_size // 2  # 中心スタート
    direction = 0  # 初期方向(上)
    frames = []
    
    for step in range(steps):
        if step % 500 == 0:  # 500ステップごとにフレーム保存
            frames.append(grid.copy())
        
        if grid[ant_x, ant_y] == 0:
            direction = (direction + 1) % 4  # 右回転
            grid[ant_x, ant_y] = 1          # 黒にする
        else:
            direction = (direction - 1) % 4  # 左回転
            grid[ant_x, ant_y] = 0           # 白にする
        
        dx, dy = DIRECTIONS[direction]
        ant_x = (ant_x + dx) % grid_size  # 端に行ったらループ
        ant_y = (ant_y + dy) % grid_size
    
    return frames

# シミュレーション実行
frames = langtons_ant(GRID_SIZE, STEPS)

# GIF作成
def save_gif(frames, filename="langtons_ant.gif"):
    images = [Image.fromarray((frame * 255).astype(np.uint8), mode='L') for frame in frames]
    images[0].save(filename, save_all=True, append_images=images[1:], duration=100, loop=0, format='GIF')

save_gif(frames)
print("GIF saved as 'langtons_ant.gif'")

参考文献

  • Langton, C. G. (1986). Studying artificial life with cellular automata. Physica D: nonlinear phenomena, 22(1-3), 120-149.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です