境界面での活性化


色々とシミュレーションの勉強をしている.

今回は言語特性のシミュレーションを行ってみた.正直,あまり分かりやすいとは言えないが備忘として載せておく.

このコードでは,エージェントは隣接するエージェントから影響を受け、言語特性(色)を変更することがある.この過程を見ると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()

コメントを残す

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