Math World Lab

ボイドモデルと群衆シミュレーションのアルゴリズム

全体を操るリーダーはいない — 衝突回避・整列・凝集の3ルールから生まれる自己組織化の美

Boids Swarm (Flocking)
この単元の発見をシェア
3行要約(Key Takeaways / AIOサマリー)
1
1986年にクレイグ・レイノルズが考案した、鳥や魚の群れの動きを極めてリアルに再現する先駆的アルゴリズム『ボイド(Boids)』
2
中央の司令塔やリーダーは存在せず、各エージェントが独立して『①衝突回避(Separation)』『②速度整列(Alignment)』『③中心凝集(Cohesion)』の3つの局所ベクトルルールに従うだけで全体の美しい群れが創発する
3
映画『ライオン・キング』のヌーの暴走シーンや『バットマン リターンズ』のコウモリのCGをはじめ、現代の自動運転隊列走行やドローン群制御(スウォームロボティクス)の基礎理論

なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値

Purpose & Motivation

なぜ生まれたのか?

『複雑で巨大な社会現象や生物の集団行動は、複雑な指示によって起きているわけではない』という複雑系科学・人工生命(A-Life)の真髄を体験できます。ベクトル演算と局所近傍探索というシンプルな数学の実装が、いかに生き生きとした有機的生命感を生み出すかを学べます。

身につく武器・思考力

エージェントベースモデリング(ABM)の基礎、近傍距離探索($k$-d木やグリッド空間分割)の高速化思考、ベクトル加速度合成のプログラミング技術

実社会・ITでの活躍現場

  • •ハリウッド映画・3DCGアニメーションにおける大群集エキストラ・野生動物群れのエフェクト生成
  • •東京オリンピック等の開会式で行われる数百台のLEDドローン編隊飛行(スウォーム制御)
  • •防災避難計画・都市駅舎コンコースにおける群衆歩行流(パニック時のボトルネック脱出)シミュレータ
  • •自動運転車群のアダプティブ・クルーズコントロール(ACC)隊列走行による高速道路空気抵抗削減

Layer 1 — 直感・シミュレーター

Canvas上で無数に旋回する三角形(鳥のエージェント)を観察してください。下の3つのスライダー(衝突回避・速度整列・中心凝集)の重みを変化させると、魚群のように整然と旋回するパターンから、互いに反発してバラバラに散らばるカオス、あるいは1点に固まる密集状態へと群れの性質がダイナミックに変化します。

3つのルール(衝突回避・速度整列・中心凝集)による創発
衝突回避 (Separation)1.5
速度整列 (Alignment)1.0
中心凝集 (Cohesion)1.0
直感チェック!ミニクイズ

ボイドモデルの3つの基本ルールのうち、『近すぎる仲間との激突を避けるために離れる』ルールはどれか?

Layer 2 — 定義・受験・証明

定義

**ボイドモデル(Boids Model)**とは、各個体が限られた視覚範囲内の近傍個体の情報のみを参照し、局所的な3つのベクトルルールに従って自律的に加速度を決定することで、集団全体の秩序だった群れ行動(Flocking Behavior)を創発させる分散型マルチエージェントモデルである。

公式・数理モデル

ai=wsepai,sep+waliai,ali+wcohai,cohai,sep=−∑j∈Nclose(i)(rj−ri)ai,ali=1∣N(i)∣∑j∈N(i)vj−viai,coh=1∣N(i)∣∑j∈N(i)rj−ri\mathbf{a}_i = w_{\text{sep}} \mathbf{a}_{i,\text{sep}} + w_{\text{ali}} \mathbf{a}_{i,\text{ali}} + w_{\text{coh}} \mathbf{a}_{i,\text{coh}} \mathbf{a}_{i,\text{sep}} = -\sum_{j \in N_{\text{close}}(i)} (\mathbf{r}_j - \mathbf{r}_i) \mathbf{a}_{i,\text{ali}} = \frac{1}{|N(i)|} \sum_{j \in N(i)} \mathbf{v}_j - \mathbf{v}_i \mathbf{a}_{i,\text{coh}} = \frac{1}{|N(i)|} \sum_{j \in N(i)} \mathbf{r}_j - \mathbf{r}_i

証明・導出

**レイノルズの3原則(ベクトル幾何学的解釈)** 各個体 ii は位置 ri\mathbf{r}_i と速度 vi\mathbf{v}_i を持つ。

1. **衝突回避(Separation)**: 近すぎる仲間との激突を避ける 反発力は相手から自分に向かうベクトル −(rj−ri)-(\mathbf{r}_j - \mathbf{r}_i) の和であり、距離の逆二乗または線形反発力として作用する。

2. **速度整列(Alignment)**: 周囲の仲間と同じ方向・同じスピードで飛ぶ 近傍個体の平均速度ベクトル vˉ=1∣N∣∑vj\bar{\mathbf{v}} = \frac{1}{|N|} \sum \mathbf{v}_j に対する差分 vˉ−vi\bar{\mathbf{v}} - \mathbf{v}_i を加速度として加えることで、群れの飛行方向が自然に同期する。

3. **中心凝集(Cohesion)**: 群れから孤立しないよう、仲間の重心へ向かう 近傍個体の重心位置 rˉ=1∣N∣∑rj\bar{\mathbf{r}} = \frac{1}{|N|} \sum \mathbf{r}_j に向かうベクトル rˉ−ri\bar{\mathbf{r}} - \mathbf{r}_i を引力として作用させる。

これら3つの独立したベクトルに適切な重み係数(wsep,wali,wcohw_{\text{sep}}, w_{\text{ali}}, w_{\text{coh}})を与えて足し合わせることで、各個体は誰の命令も受けずに大域的な旋回・障害物回避・群れの分裂と再統合を自律的に達成する(創発の数理証明)。

押さえておきたいポイント

  • 中央集権的な制御塔が一切不要なため、個体数が100匹でも1万匹でも同一のアルゴリズムでスケールする
  • 衝突回避(Separation)の重みを大きくすると群れは解体し、凝集(Cohesion)が強すぎると1点に固まって身動きが取れなくなるため、パラメータのバランスが命
  • 空間分割グリッドやクアッドツリーを用いることで、計算量を O(N2)O(N^2) から O(Nlog⁡N)O(N \log N) または O(N)O(N) へ削減し、数万匹のリアルタイム描画が可能になる
参照基準・学習指導要領との対応

本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。

Layer 3 — 工学応用・現場実装

2Dボイド・マルチエージェント更新エンジンの実装

各エージェントの近傍探索および3ルールの合成加速度・速度クリッピングを行うPythonコードです。

1import numpy as np
2
3class BoidSimulation:
4 def __init__(self, num_boids=100, width=500, height=500):
5 self.pos = np.random.rand(num_boids, 2) * [width, height]
6 self.vel = (np.random.rand(num_boids, 2) - 0.5) * 4.0
7 self.width = width
8 self.height = height
9
10 def step(self, w_sep=1.5, w_ali=1.0, w_coh=1.0, visual_range=50.0, protect_range=15.0):
11 N = len(self.pos)
12 acc = np.zeros_like(self.vel)
13
14 for i in range(N):
15 diffs = self.pos - self.pos[i]
16 dists = np.linalg.norm(diffs, axis=1)
17
18 # 1. 分離 (Separation)
19 close_mask = (dists > 0) & (dists < protect_range)
20 if np.any(close_mask):
21 acc[i] += -np.sum(diffs[close_mask], axis=0) * w_sep * 0.05
22
23 # 2. 整列 & 3. 凝集
24 neigh_mask = (dists > 0) & (dists < visual_range)
25 k = np.sum(neigh_mask)
26 if k > 0:
27 avg_vel = np.mean(self.vel[neigh_mask], axis=0)
28 acc[i] += (avg_vel - self.vel[i]) * w_ali * 0.04
29
30 avg_pos = np.mean(self.pos[neigh_mask], axis=0)
31 acc[i] += (avg_pos - self.pos[i]) * w_coh * 0.003
32
33 # 速度更新と最大速度制限
34 self.vel += acc
35 speeds = np.linalg.norm(self.vel, axis=1, keepdims=True)
36 self.vel = np.clip(speeds, 1.5, 5.0) * (self.vel / np.maximum(speeds, 1e-6))
37
38 # 位置更新とトーラスラップ
39 self.pos = (self.pos + self.vel) % [self.width, self.height]
40
41sim = BoidSimulation(num_boids=50)
42sim.step()
43print(f"50体のエージェント位置を更新完了: 代表座標 {sim.pos[0]}")
この単元につながる学習ロードマップ

次に学ぶならコレ!おすすめトピック

この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元

数理モデル・概念が近い関連トピック

関連度高工学応用

当たり判定アルゴリズムの数学

2点間の距離公式と座標の不等式だけで、ゲームの「衝突」を判定する仕組み

関連度高工学応用

最短経路探索(ダイクストラ法とA*アルゴリズム)

グラフ上の無数のルートから「最もコストが小さい道」を一瞬で見つけ出す数学

関連度高高校数学

ベクトルの内積

2本の矢印の「向きの近さ」を1つの数値にする

同じレベルで次に挑戦したいトピック

同レベル推薦工学応用

勾配降下法

谷底を探すAIの基本アルゴリズム

同レベル推薦工学応用

ニューラルネットワークの数学(順伝播と活性化関数)

入力に重みを掛けて足し合わせ、非線形関数で発火させるAIの基本素子

同レベル推薦工学応用

レコメンドの仕組み(コサイン類似度とベクトル検索)

ユーザーの好みと商品の近さを「ベクトルのなす角」で判定するアルゴリズム

工学・実社会での応用先でつながるトピック

工学・実践連携小学校・算数

円の面積と円周率

半径を変えると、円周と面積はどう変わる?

工学・実践連携小学校・算数

三角形・多角形の面積

頂点を動かして、面積の公式が成り立つ理由を確かめよう

工学・実践連携小学校・算数

単位変換(長さ・面積・体積)

長さが2倍になると、面積・体積は何倍になる?

あなたの数学力をさらに伸ばす

数学の弱点診断や算数パズルに挑戦してみませんか?

簡単な質問に答えてあなたにぴったりの学習ロードマップを発見したり、直感を試すパズルで数の面白さを体験できます。