集団の進化をPython を用いてシミュレーションしてみる。 第4回。
今回はClaudeで以前の進化シミュレーションを試してみたい。
投げるプロンプトはこちら。
私は、進化の形質がどのように集団内で伝播していくかをシミュレーションするPythonコードを作成したいと考えています。具体的な条件は以下の通りです:
- 個体数は10,000です。`
- 世代数は30世代です。`
- 最初に形質を獲得する個体は、ケース1では1個体のみ、ケース2ではランダムな2個体です。`
- ケース1では、形質を持つ1個体から開始し、その形質が世代を通じてどのように集団内で伝播していくかをシミュレーションします。`
- ケース2では、形質を持つ2個体から開始し、これらが互いに近しい場所にいる場合のみ、形質が集団内で伝播すると仮定します。`
- 各世代の形質の分布を画像で出力し、全世代の画像を組み合わせてGIFアニメーションを作成することを目指します。`
Pythonコードでは、numpyやmatplotlibなどのライブラリを使用して、上記の条件に基づくシミュレーションとその可視化を実行する方法を教えてください。特に、形質の伝播ロジックとGIFアニメーションの作成方法に焦点を当てて説明してほしいです。初期形質を持つ個体の選択、形質の伝播のシミュレーション、そして結果の可視化に必要なコードスニペットを提供してください。
実行環境はcolaboratoryです。
出力された結果は下記。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
# シミュレーションのパラメータ
population_size = 10000
generations = 30
grid_size = 100
case = 1 # ケース1または2を選択
# 初期集団の作成
population = np.zeros((grid_size, grid_size), dtype=bool)
if case == 1:
# ケース1: ランダムな1個体に形質を与える
x, y = np.random.randint(0, grid_size, 2)
population[x, y] = True
else:
# ケース2: ランダムな2個体に形質を与える
x1, y1, x2, y2 = np.random.randint(0, grid_size, 4)
population[x1, y1] = True
population[x2, y2] = True
# 形質の伝播をシミュレーション
def simulate_generation(population):
new_population = population.copy()
for i in range(grid_size):
for j in range(grid_size):
if population[i, j]:
# 近傍の個体に形質を伝播
for x in range(max(0, i-1), min(grid_size, i+2)):
for y in range(max(0, j-1), min(grid_size, j+2)):
if case == 1 or (case == 2 and abs(i-x) <= 1 and abs(j-y) <= 1):
new_population[x, y] = True
return new_population
# GIFアニメーションの作成
fig = plt.figure()
images = []
for gen in range(generations):
population = simulate_generation(population)
img = plt.imshow(population, cmap='binary', animated=True)
images.append([img])
if gen == 0:
plt.title(f"Generation: {gen+1}")
else:
img.set_data(population)
plt.title(f"Generation: {gen+1}")
ani = animation.ArtistAnimation(fig, images, interval=500, blit=True, repeat_delay=1000)
plt.show()
# GIFファイルに保存
ani.save("trait_propagation.gif", writer='pillow')
想定とは少し異なるが、とりあえず1発で完璧に動くコードが出てくることには驚かされる。
このコードの生成力がClaudeのすごいところだ。