弱肉強食シミュレーション

弱肉強食シミュレーション

弱肉強食の様子をアニメーションで視覚化するために、プレデター(捕食者)プレイ(被食者)の関係をシミュレートするプログラムを作成します。

matplotlib.animationモジュールを使用して、シミュレーションの進行状況をリアルタイムで描画します。


以下は、プレデタープレイのシミュレーションを行い、その様子をアニメーションとして可視化するPythonコードです。

(以下のコードは、Google Colab上で動作確認できます。)

必要なパッケージのインストール

まず、必要なパッケージをインストールします。

1
!pip install matplotlib numpy

Pythonコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML

# パラメータ
num_prey = 50 # 被食者の数
num_predator = 5 # 捕食者の数
world_size = (100, 100) # 世界のサイズ
prey_speed = 1 # 被食者の移動速度
predator_speed = 1.5 # 捕食者の移動速度

# 被食者クラス
class Prey:
def __init__(self, x, y):
self.x = x
self.y = y

def move(self):
self.x = (self.x + np.random.uniform(-prey_speed, prey_speed)) % world_size[0]
self.y = (self.y + np.random.uniform(-prey_speed, prey_speed)) % world_size[1]

# 捕食者クラス
class Predator:
def __init__(self, x, y):
self.x = x
self.y = y

def move(self, prey_list):
if prey_list:
# 最も近い被食者を探す
prey = min(prey_list, key=lambda p: (p.x - self.x)**2 + (p.y - self.y)**2)
dx = prey.x - self.x
dy = prey.y - self.y
dist = np.sqrt(dx**2 + dy**2)
if dist > 0:
self.x = (self.x + predator_speed * dx / dist) % world_size[0]
self.y = (self.y + predator_speed * dy / dist) % world_size[1]

# 捕食チェック
for prey in prey_list.copy():
if np.sqrt((prey.x - self.x)**2 + (prey.y - self.y)**2) < 1:
prey_list.remove(prey)

# 初期化
preys = [Prey(np.random.uniform(0, world_size[0]), np.random.uniform(0, world_size[1])) for _ in range(num_prey)]
predators = [Predator(np.random.uniform(0, world_size[0]), np.random.uniform(0, world_size[1])) for _ in range(num_predator)]

fig, ax = plt.subplots()
scat_prey = ax.scatter([prey.x for prey in preys], [prey.y for prey in preys], c='blue')
scat_pred = ax.scatter([pred.x for pred in predators], [pred.y for pred in predators], c='red')
plt.xlim(0, world_size[0])
plt.ylim(0, world_size[1])
plt.gca().set_aspect('equal', adjustable='box')
plt.title('Weak Meat and Strong Eat Simulation')

def update(frame):
for prey in preys:
prey.move()
for pred in predators:
pred.move(preys)

scat_prey.set_offsets(np.c_[[prey.x for prey in preys], [prey.y for prey in preys]])
scat_pred.set_offsets(np.c_[[pred.x for pred in predators], [pred.y for pred in predators]])
return scat_prey, scat_pred

ani = FuncAnimation(fig, update, frames=200, interval=100, blit=True)

# アニメーションをHTMLとして表示する
HTML(ani.to_jshtml())

コードの説明

  1. インストールとインポート:
    必要なパッケージをインストールし、インポートします。

  2. パラメータの設定:

    1
    2
    3
    4
    5
    num_prey = 50  # 被食者の数
    num_predator = 5 # 捕食者の数
    world_size = (100, 100) # 世界のサイズ
    prey_speed = 1 # 被食者の移動速度
    predator_speed = 1.5 # 捕食者の移動速度
  3. 被食者と捕食者のクラス定義:
    前述の通り、被食者捕食者の移動ロジックを定義します。

  4. 初期化:
    被食者捕食者の位置をランダムに初期化します。

    1
    2
    preys = [Prey(np.random.uniform(0, world_size[0]), np.random.uniform(0, world_size[1])) for _ in range(num_prey)]
    predators = [Predator(np.random.uniform(0, world_size[0]), np.random.uniform(0, world_size[1])) for _ in range(num_predator)]
  5. アニメーションの設定:
    アニメーション更新関数を設定し、FuncAnimationを使用してアニメーションを作成します。

    1
    ani = FuncAnimation(fig, update, frames=200, interval=100, blit=True)
  6. アニメーションの表示:
    HTML形式でアニメーションを表示します。

    1
    HTML(ani.to_jshtml())

このコードをGoogle Colabで実行すると、弱肉強食の様子がアニメーションとして表示されます。

結果解説

[実行結果]

アニメーションの様子を具体的に理解するためには、シミュレーションがどのように進行し、どのような視覚効果があるのかを詳しく説明します。

アニメーションの概要

このシミュレーションとアニメーションは、シンプルなエコシステムをモデル化しています。
シミュレーション内で、青い点は被食者(プレイ)、赤い点は捕食者(プレデター)を表しています。
これらの点が指定されたルールに従って移動し、捕食の様子がリアルタイムで表示されます。

初期状態

  • 被食者(青い点)
    • 数量:$50$
    • ランダムな位置に配置され、移動速度は$1$です。
  • 捕食者(赤い点)
    • 数量:$5$
    • ランダムな位置に配置され、移動速度は$1.5$です。

アニメーションの進行

  1. 被食者の移動

    • 被食者は毎フレームごとにランダムな方向に少しずつ移動します。
    • 移動範囲は、世界サイズ(100x100)の中でラップアラウンド(画面端から反対側に移動)します。
  2. 捕食者の移動

    • 捕食者は最も近い被食者を追いかけます。
      具体的には、次のステップで被食者との距離が最も小さくなる方向に移動します。
    • 捕食者も同様に世界サイズ(100x100)の中でラップアラウンドします。
  3. 捕食チェック

    • 捕食者が被食者に非常に近づいた場合(距離が1未満)、その被食者は捕食されてリストから削除されます。

アニメーションのビジュアル効果

  • 被食者は青い点として、捕食者は赤い点として表示されます。
  • 被食者が捕食されると、その青い点は消え、アニメーション進行中に点の数が減少します。
  • アニメーションは200フレーム間で進行し、各フレームごとに被食者と捕食者の位置が更新され、描画されます。

実行の様子

  1. 開始時

    • 画面にはランダムに配置された多くの青い点(被食者)と少数の赤い点(捕食者)が表示されます。
  2. 中盤

    • 青い点がランダムに動き回る一方で、赤い点が最も近い青い点を追いかける様子が確認できます。
    • 捕食が成功すると、青い点が消える様子が見えます。
  3. 終了時

    • 多くの青い点が捕食され、減少しています。
    • 赤い点が依然として動き回り、残った青い点を追いかけ続けます。