境界面での活性化
色々とシミュレーションの勉強をしている.
今回は言語特性のシミュレーションを行ってみた.正直,あまり分かりやすいとは言えないが備忘として載せておく.
このコードでは,エージェントは隣接するエージェントから影響を受け、言語特性(色)を変更することがある.この過程を見ると2つの異なる種の間の境界面が活発に変化することが見て取れる.
pip install numpy matplotlib imageio
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import imageio
# パラメータ設定
GRID_SIZE = 50 # グリッドのサイズ(50x50)
TIME_STEPS = 100 # シミュレーションのタイムステップ数
INFLUENCE_RATE = 0.3 # 言語特性が影響を受ける確率
NEW_FEATURE_RATE = 0.01 # 新しい言語特性が生まれる確率
# 初期化:エージェントの言語背景を設定(0:言語A, 1:言語B)
agents = np.random.choice([0, 1], size=(GRID_SIZE, GRID_SIZE))
# 言語特性を初期化(各言語背景ごとに異なる特性を持つ)
features = np.zeros((GRID_SIZE, GRID_SIZE), dtype=int)
features[agents == 0] = 0 # 言語Aの特性
features[agents == 1] = 1 # 言語Bの特性
# アニメーション作成のためのリスト
ims = []
fig = plt.figure(figsize=(6,6))
for t in range(TIME_STEPS):
new_features = features.copy()
for i in range(GRID_SIZE):
for j in range(GRID_SIZE):
# 隣接するエージェントを取得
neighbors = []
for x in [-1, 0, 1]:
for y in [-1, 0, 1]:
if (0 <= i + x < GRID_SIZE) and (0 <= j + y < GRID_SIZE):
if not (x == 0 and y == 0):
neighbors.append(features[i + x, j + y])
# 言語特性の更新
if np.random.rand() < INFLUENCE_RATE:
# 隣接エージェントの言語特性からランダムに選択
new_feature = np.random.choice(neighbors)
new_features[i, j] = new_feature
# 新しい言語特性の生成
if np.random.rand() < NEW_FEATURE_RATE:
new_features[i, j] = features.max() + 1 # 新しい特性を追加
features = new_features
# プロット
im = plt.imshow(features, animated=True, cmap='tab20')
plt.axis('off')
ims.append([im])
# アニメーションの作成と保存
ani = animation.ArtistAnimation(fig, ims, interval=200, blit=True)
ani.save('language_simulation.gif', writer='pillow')
plt.show()