パラメータ設定
プリセット
表示オプション
インタラクション
クリック→天敵 / 右クリック→引力源
クリック: 天敵追加 / 右クリック: 引力源追加 / タップ長押し: 引力源
🔬 Craig Reynolds ボイドアルゴリズム
各ボイドは視野半径 $r$ 内の隣人に対して3つの力を計算する:
- 分離 (Separation): $\mathbf{F}_s = -\sum_{j \in N_{sep}}\frac{\mathbf{r}_{ij}}{|\mathbf{r}_{ij}|^2}$
- 整列 (Alignment): $\mathbf{F}_a = \langle \mathbf{v}_j \rangle - \mathbf{v}_i$
- 結合 (Cohesion): $\mathbf{F}_c = \langle \mathbf{x}_j \rangle - \mathbf{x}_i$
最終加速度: $\mathbf{a}_i = w_s \mathbf{F}_s + w_a \mathbf{F}_a + w_c \mathbf{F}_c$
速度は $v_{max}$ でクランプ。端に達したら反対側から出現(トーラス空間)。
CAE との接点:
各ボイドは粒子法(SPH・DEM)の粒子に相当し、局所的な相互作用から大域的な挙動が生まれる点が共通。
また群知能(Swarm Intelligence)としてPSO(粒子群最適化)や群ロボット制御、群衆避難シミュレーションにも応用される。
ボイドシミュレーターとは
🧑🎓
「ボイド」って何ですか?ただの点が動いてるだけに見えるけど、どうして魚の群れみたいな複雑な動きが生まれるんですか?
🎓
ざっくり言うと、各ボイドは「分離」「整列」「結合」のたった3つのルールに従って動く、賢い粒子なんだ。例えば、上のスライダーで「分離の重み」を0にしてみて。個体同士がぶつかり始めるでしょ?これが衝突回避の基本ルールだよ。
🧑🎓
え、そうなんですか!でも、それぞれのルールの強さを変えると、動きが全然変わりますね。「整列」を強くすると軍隊みたいにピシッと揃う!これって実世界でも使われてるんですか?
🎓
その通り!実務ではCGの群衆シーン生成や、ゲームのNPCの集団AIに使われることが多いよ。CAEの世界では、粒子法シミュレーションの基礎としても重要だ。例えば、自動車の塗装シミュレーションで、塗料の飛沫粒子が互いに干渉しないように動くモデルに応用されたりするんだ。
🧑🎓
CAEにも関係あるんですね!「視野半径」をものすごく小さくすると、群れがバラバラになっちゃいました。これって、現実の生物でも視界が悪いと群れを維持できないってことですか?
🎓
鋭いね!その通り、局所的な情報だけで大域的な秩序が生まれるのが「創発」の面白さだ。現場で多いのは、このアルゴリズムを拡張して、障害物回避のルールを追加したモデルだよ。パラメータをいじることで、自然な群れから整然とした隊列まで、様々な集団行動を再現できるんだ。
物理モデルと主要な数式
各ボイド(個体)の運動は、視野半径 $R$ 内にいる「隣人」に対して計算される3つの力のベクトル和によって決定されます。時間ステップ $\Delta t$ ごとに速度と位置が更新されます。
$$ \mathbf{v}_{new}= \mathbf{v}_{current}+ (\mathbf{F}_{sep}+ \mathbf{F}_{ali}+ \mathbf{F}_{coh}) \cdot \Delta t $$
$\mathbf{v}$: ボイドの速度ベクトル。$\mathbf{F}_{sep}, \mathbf{F}_{ali}, \mathbf{F}_{coh}$: それぞれ分離、整列、結合のルールから計算される「力」(加速度に相当)。この合力によって速度が変化し、位置が更新されます。
3つのルールはそれぞれ以下のように計算されます。ここで、$N$は視野内の隣人の集合、$w$はシミュレーター上で調整可能な重みパラメータです。
$$
\begin{aligned}\mathbf{F}_{sep}&= w_{sep}\sum_{j \in N}-\frac{\mathbf{r}_{ij}}{|\mathbf{r}_{ij}|^2}\\
\mathbf{F}_{ali}&= w_{ali}\left( \frac{1}{|N|}\sum_{j \in N}\mathbf{v}_j - \mathbf{v}_{self}\right) \\
\mathbf{F}_{coh}&= w_{coh}\left( \frac{1}{|N|}\sum_{j \in N}\mathbf{p}_j - \mathbf{p}_{self}\right)
\end{aligned}$$
$\mathbf{r}_{ij}$: 自分から隣人へのベクトル。分離力は近い隣人ほど強く反発します。$\mathbf{v}$: 速度ベクトル。整列力は周囲の平均速度に自分を合わせようとします。$\mathbf{p}$: 位置ベクトル。結合力は周囲の重心(中心)に向かおうとします。これらの単純なルールの組み合わせが複雑な群れを生み出します。
実世界での応用
コンピュータグラフィックス・ゲーム開発:映画やゲームで、自然な鳥の群れ、魚の群れ、あるいは群衆(ゾンビの大群など)のアニメーションを生成するために広く利用されています。個々のエージェントに複雑なAIを組み込む必要がなく、効率的に大規模な群集シーンを作成できます。
群ロボット工学:多数の自律ロボットを協調させて動作させる制御アルゴリズムの基礎として応用されます。例えば、災害現場での探索や、倉庫内での物品運搬を、ロボットの群れで行う研究が進められています。
粒子法シミュレーション(CAE):SPH(Smoothed Particle Hydrodynamics)法などの粒子ベースの流体解析では、粒子間の局所的な相互作用を計算します。ボイドアルゴリズムは、こうした粒子間の近傍探索と力の計算のプロトタイプとして教育上有効です。
群知能アルゴリズム(PSO):「粒子群最適化(Particle Swarm Optimization)」は、ボイドの概念を最適化問題に応用したものです。探索空間内の粒子(解の候補)が、自身の最良解と群れ全体の最良解の情報を共有しながら最適解に向かって移動し、工学的な設計最適化などに用いられます。
よくある誤解と注意点
まず、このシミュレーターを触り始めてよくあるのが「パラメータを極端にすればするほどリアルになる」という思い込みだ。例えば、分離・整列・結合の重みを全て最大にすると、かえって不自然な痙攣のような動きになる。実務では、生物の観察データや目的に応じてバランスが命。魚の群れを再現したいなら「整列」をやや強め、鳥の群れなら「結合」を少し弱めると良いことが多い。初期値のバランス(例えば 分離:1.5, 整列:1.0, 結合:1.0)を基準に微調整するのがコツだ。
次に、「視野半径」と「最大速度」の関係を見落とすミス。視野半径を広げても、個体の最大速度が低すぎると、情報は得られてもそれに反応して動き切れない。逆に速度が速すぎると制御が効かず群れが崩壊する。例えば、視野半径を50ピクセルに設定したら、最大速度はその5〜10%程度(2.5〜5.0ピクセル/ステップ)から始めて調整すると安定しやすい。
最後に、実装上の落とし穴。距離計算のコストを甘く見ないこと。素直に全粒子間の距離を毎ステップ計算すると、粒子数Nが1000を超えたあたりから急激に重くなる。実務では空間分割(空間グリッド法や四分木)で近傍探索を最適化するのが必須だ。また、力の計算時に隣人の数|N|が0の場合(誰も視野内にいない)の除算エラーにも要注意。その場合は各力をゼロベクトルとして扱うなどの処理が必要になる。
関連する工学分野
このボイドモデルの考え方は、粒子法シミュレーション全体の基礎概念として幅広く応用されている。まず挙げるのはSPH(Smoothed Particle Hydrodynamics)法だ。流体を粒子の集合体とみなし、連続体方程式を粒子間の相互作用で離散化して解く。ボイドの「近傍粒子からの影響の重み付け」という発想は、SPHのカーネル関数と核となる部分が非常に似ている。
もう一つの大きな応用先はロボティクス、特にマルチロボット・ドローンの群制御だ。各ロボットが周囲の数機とだけ通信し、「衝突回避(分離)」「目標方向への移動(整列)」「隊形維持(結合)」というルールに従うことで、リーダー機なしでも自律的に編隊飛行を実現できる。通信障害への頑健性が利点だ。
さらに、人間の群衆流動シミュレーション(Pedestrian Dynamics)でも発展形が使われる。ここでは、ボイドの3ルールに加えて、目的地への引力や、壁・障害物への反発力、社会的力モデル(他人と一定の距離を保とうとする力)などを追加する。駅の混雑緩和策の検討や、大型施設の避難経路設計など、実社会の安全計画に直接役立っている。
発展的な学習のために
まず次のステップとしては、「障害物回避」と「リーダー追従」のルールを自分で実装してみることを強くお勧めする。障害物は、その表面から離れる方向の力を追加すればいい。リーダー追従は、特定のボイドに「結合」の力を強く働かせるだけで、群れ全体が引っ張られる面白い挙動が観察できる。これでアルゴリズム拡張の基礎が身につく。
数学的背景を深めたいなら、ベクトル解析と常微分方程式の数値解法の知識が役に立つ。ボイドの運動方程式 $\frac{d\mathbf{v}}{dt} = \mathbf{F}_{total}$ はまさに微分方程式だ。現在のシミュレーターは最も単純なオイラー法($ \mathbf{v}_{new}= \mathbf{v}_{current}+ \mathbf{F} \cdot \Delta t $)で時間積分しているが、エネルギーが保存されないなどの課題がある。より精度の高いルンゲ=クッタ法などを学び、実装比較してみると、数値計算の理解が一段階深まる。
最終的には、このようなエージェントベース・モデリング(ABM)のパラダイムに広げて学ぶと良い。各エージェント(ボイド)の単純なルールから、市場経済の動向や伝染病の拡散といった複雑な社会現象が「創発」することをシミュレートする分野だ。ボイドは、複雑系科学への最も親しみやすい入り口と言えるだろう。