Langton’s Ant
ラングトンの蟻という興味深いシミュレーションを発見し, その動作を実装してみた.
これは, アメリカの研究者である Christopher Langtonによって提唱されたセル・オートマトンの一種であり, 極めて単純な規則に基づくが, 予期しない複雑なパターンを生じることが知られている.
本シミュレーションでは, 以下のような仮定のもとで動作する.
平面は格子状に構成され, 各セルは白または黒に塗り分けられる. この格子上を移動するエージェントを「アリ」とし, アリは以下の規則に従う.
- アリが白いセルにいる場合, 90°右に方向転換し, そのセルの色を反転させ, 1マス前進する.
- アリが黒いセルにいる場合, 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.