Boids / Particle Life

局所ルールを持つエージェント集団から群れ行動や自己組織化が創発する、マルチエージェント系ALifeの2つの代表モデル。

使い方

Boids(Craig Reynolds, 1986)

各個体は近傍の仲間だけを見て、次の3つのベクトルを合成した加速度で動きます。

Boidsの歴史的な新しさは、群れ全体を指揮する中央制御が一切無いのに、この3つの単純な局所ルールだけから、まるで本物の鳥や魚の群れのような、滑らかで生物的な集団運動が創発する、と示した点にあります。1986年当時、群れの動きはトップダウンにスクリプトされるのが普通でしたが、Reynoldsはボトムアップな創発だけで同じ現象を再現しました。

パラメータをいじって、3つの力のバランスがどう群れの性格を変えるか試してみてください。Separationを強くしすぎると散り散りに、Cohesionを強くしすぎると1つの塊に潰れます。

境界 / Boundary

BoidsとParticle Lifeそれぞれの「境界」で壁とループを切り替えられます。初期設定は壁です。ループでは上下・左右がつながり、端を越えた粒子は反対側へ移動します。粒子間の力と餌への反応も、端をまたぐ最短距離で計算します。Boidsでは分離・整列・結合も端をまたいだ近隣を使い、壁を避ける力は働きません。Particle LifeはCPU・GPUの両方に対応し、切り替えても種類や相互作用ルールを保持します。

Choose Walls (default) or Wrap around independently in Boids and Particle Life. Boids uses wrapped neighbors for separation, alignment and cohesion, without wall avoidance. Wrapped edges connect both horizontally and vertically; particles and food interact across the seam using the shortest distance. Both CPU and GPU support this setting without resetting types or interaction rules.

状態を保存・交換 / Save and exchange

Particle Lifeの「状態を保存」でJSONをダウンロードできます。粒子の位置・速度・種類、相互作用行列、力・摩擦・大きさ、餌、境界、世界の大きさを記録します。保存すると一時停止します。ファイルを他の人へ渡し、「JSONを開く」または画面へのドロップで同じ状態を復元できます。Boids画面から読み込むとParticle Lifeに切り替わります。

Save a Particle Life world as JSON, including positions, velocities, types, interaction matrix, parameters, food, boundaries and world dimensions. Saving pauses playback. Share the file and use Open or drop it onto the simulator to restore. Opening from Boids switches to Particle Life.

読み込み後は停止状態です。「再生」で続きを動かしてください。保存・復元後は世界の寸法を固定し、異なる画面サイズでも縦横比を保って全体を表示します。余白は世界の外側です。CPU・GPUや端末の数値精度の違いで、長時間後の軌跡は異なる場合があります。再現するのは保存時点の状態とルールで、将来の動きの完全一致を保証するものではありません。

Load restores a paused state. Press Play to continue. Saved worlds retain their dimensions when the screen resizes; the whole world is fitted without changing its aspect ratio. CPU/GPU precision and summation order may change long-term trajectories.

ファイルは端末内で読み込み、サーバーには送信しません。最大2 MB、100〜5,000粒子・2〜30種類に対応します。形式・数値・配列長を確認し、不正なファイルは現在の世界を置き換えずに拒否します。以前の開発者ツールで保存したversion 1のJSONも読み込めます。Boidsの状態保存には対応していません。

Files are processed locally without upload. Maximum 2 MB, 100–5,000 particles and 2–30 types. Validation rejects unsupported or malformed snapshots before replacing the world. Version 1 snapshots saved with the earlier console export are supported. Boids state export is not supported.

GPUと自動判定 / GPU & automatic selection

「自動」ではWebGPUの初期化を試し、成功すると粒子間の力をGPUで計算します。未対応・初期化失敗時はCPUで続行します。「CPU」を手動選択することもできます。種類数は最大30種類、粒子数は最大5,000個です。CPUへの切り替えでも種類やルールを保持できるよう、CPU版も30種類を扱えます。

Auto initializes WebGPU and uses it for pairwise force calculations when available; otherwise it uses the CPU. CPU can also be selected manually. Both backends support 30 types and 5,000 particles, preserving types and rules on fallback.

GPUの検出は性能の保証ではありません。粒子の位置更新・餌・描画は引き続きJavaScriptとCanvas 2Dを使います。小規模な場面ではGPUとのデータ転送が負担になる場合もあります。GPUとCPUでは計算精度・加算順序の違いにより、長時間の軌跡が異なる場合があります。

Availability is not a performance guarantee. Integration, food and rendering remain in JavaScript/Canvas 2D. Readback overhead can outweigh the benefit for small simulations. Floating-point differences can produce different long-term trajectories.

GPU計算は1回ずつ処理し、待ち時間が長い場合も自動停止します。停止や設定変更の前に送った計算結果は破棄します。GPUの異常・切断時は最後に反映できた状態でCPUへ切り替えて停止します。再開は手動です。

Only one GPU update is in flight. Slow completion pauses playback; stale results after pause or edits are discarded. GPU errors or device loss switch to CPU and pause at the last committed state. Resume manually. Submitted GPU work cannot be instantly cancelled.

Particle Lifeの個体数・表示サイズ / Count & display size

個体数は100〜5,000個で調整できます。スライダーから指を離すと適用され、配置がリセットされます。初期値は500個です。粒子の半径は0.5〜5pxで、見た目だけを変えます。小さくしても相互作用の距離や力は変わらず、粒子間の計算回数も減りません。

Set 100–5,000 particles (default 500); release the slider to apply and reset positions. Display radius ranges from 0.5 to 5px. Size only changes rendering, not forces, interaction distances or the number of pair calculations.

個体数、密集度、相互作用半径が大きいほど計算が重くなります。高負荷を検知すると盤面を保持して自動停止します。画面の「粒子を半分に」は一部の粒子を残して数を減らし、停止状態を保ちます。「再開」で続行します。同じ条件では再び自動停止する場合があります。

More particles, denser clusters and larger interaction radii increase load. High load pauses playback while keeping the board. Halve retains a subset of particles and stays paused; Resume continues. The same settings can trigger another pause.

長すぎる計算ステップは位置を更新する前に中止します。端末によっては検知まで一時的に操作が遅れる場合があります。停止中は必要なときだけ描画し、別タブ表示中は計算を休止します。高負荷時は現実の時間よりシミュレーションの進行が遅くなることがあります。

Overlong steps are cancelled before positions are committed. A brief delay can occur before detection. Paused scenes redraw only when needed; hidden tabs suspend computation. Simulated time may run slower than real time under load.

Particle Life

F(r) = r/β − 1  (r < β、常に反発)
F(r) = Atype(i),type(j)·(1 − |2r−1−β| / (1−β))  (β ≤ r < 1)
F(r) = 0  (r ≥ 1)

Particle Lifeは、Boidsのような「群れ行動」を明示的に作り込むのではなく、色(種類)ごとに異なる引力・斥力の行列だけをランダムに与える、もっと下のレイヤーのモデルです。近すぎると必ず反発し(潰れて重なるのを防ぐ)、少し離れた距離では種類の組み合わせごとに決まった符号・強さで引き合ったり反発したりします。

このモデルの面白さは、同じ数式・同じパラメータレンジのまま、行列の中身をランダムに変えるだけで、全く性質の違う"生態系"が生まれることです。ある行列では群れがクラスターを作って静止し、別の行列では一方が他方を延々追いかけ回す「捕食者-被食者」的な運動が生まれ、また別の行列では膜のような構造や、細胞質流動のように内部を撹拌し続ける塊が生まれます。単純な物理法則から多様な"生態"が生まれる様子を、ボタン一つで何度も引き直して観察できます。

2つのモデルの位置づけ

Boidsは「群れる」という結果を出すために3つのルールを意図的に設計したモデルです。一方Particle Lifeは、ルール自体をランダムに生成し、その帰結として偶然「群れる」「追いかける」「固まる」といった行動が生まれるかどうかを観察する、より探索的なモデルです。ALIFE研究の文脈で言えば、Boidsは「デザインされた創発」、Particle Lifeは「無数にありうるルール空間からの偶然の創発」という、対照的な2つのアプローチを代表しています。

参考文献