地形の高さは目的関数 f(x, y) の値。金色の粒子は「解の候補」です。傾斜を滑り落ちる物理演算ではなく、各粒子の経験と、群れ全体の経験を使って値の小さい座標を探す、粒子群最適化(PSO)の可視化です。
v ← w · v + c₁ · r₁ · (pbest − x)
+ c₂ · r₂ · (gbest − x)
x ← x + v
慣性 w は飛び続ける傾向。pbest は本人が今まで見つけた最良位置。gbest は群れ全体が今まで見つけた最良位置です。r₁ と r₂ は、各反復・各粒子・各座標で独立に発生させる 0〜1 の一様乱数です。
まず試す操作
「広く探す」と「集中する」を切り替え、R で同じ初期配置から比較してください。「群れの記憶」を 0 にすると、他の粒子の発見を参照しなくなります。再生速度は見せる速さだけを変え、同じseed・同じ係数・同じ反復回数なら計算結果は変わりません。
粒子をクリックすると、自分の記憶への方向と群れの記憶への方向を表示します。線は参照先を示し、実際の力の大きさを表すものではありません。緑のリングは発見済みの最良位置、白いひし形は「正解の位置を表示」で現れる既知の最適解です。
収録した関数(すべて2変数)
| 関数 | 今回の探索範囲 | 既知の最小点 |
|---|
| Rastrigin | x, y ∈ [−5.12, 5.12] | (0, 0), f = 0 |
| Ackley | x, y ∈ [−5, 5] | (0, 0), f = 0 |
| Rosenbrock | x, y ∈ [−2.048, 2.048] | (1, 1), f = 0 |
| Griewank | x, y ∈ [−12, 12] | (0, 0), f = 0 |
| Sphere | x, y ∈ [−5.12, 5.12] | (0, 0), f = 0 |
Ackley と Griewank は谷の形を観察しやすい範囲に限定しています。最適解の座標は答え合わせ用の表示にのみ使用し、粒子の更新には渡していません。最良値が小さくなっても、常に大域的最小点に到達できるとは限りません。
描画と数値の読み方
高低差を見やすくするため、色と高さは log(1 + f) を地形ごとに正規化しています。探索に使う値と数値欄・CSVは変換前の f です。立体表示はCanvasによる平行投影で、粒子と軌跡を地形に重ねて表示します。頂点間の地形は近似描画ですが、粒子の評価は関数式を直接計算しています。
移動は反復間を補間して描画し、統計は完了した反復の値を表示します。グラフは縦軸が対数で、0付近は描画上のみ 10⁻¹² で下限処理します。「群れの広がり」は、重心からの二乗平均平方根距離を探索領域の半対角線で割った割合です。「最小値付近」は最良値 f ≤ 10⁻⁶、「広がり小」は広がりが 1% 未満のときの表示です。これは収束証明ではありません。
実装上のルール
慣性項つきのグローバル・ベスト型PSOを使用します。各反復では直前の同じgbestを全粒子が参照する同期更新です。各座標の速度を探索幅の16%以内に制限し、境界から出た分を反射、反射後の速度を半分にします。自動的な変異・再探索粒子の注入はありません。初期評価を含む評価回数は「粒子数 × (反復回数 + 1)」です。
プリセットと係数の変更は現在の群れに即時反映されます。地形・粒子数・seedの変更は履歴を消去して再実行します。自動リプレイをオンにした場合は300反復でseedを切り替え、履歴も新しい実行に切り替えます。CSVには各反復の係数とseedも記録します。60,000反復で一時停止します。別タブ表示中は進行を休止し、動きを抑える端末設定では初回は一時停止します。
操作一覧
Space 再生 / 一時停止 → 1反復 R 同じseedで再実行 N 新しいseedで再配置 V 立体 / 等高線 F 全画面。立体表示はドラッグで回転、ホイールで拡大縮小。スマートフォンでは指で回転できます。
モデルの参照資料
PSOの速度・位置更新:Shami et al. (2023), Velocity pausing particle swarm optimization, §2.1 の通常のPSO(本アプリはVPPSOではありません)。関数の定義:Surjanovic & Bingham, Simon Fraser University, Virtual Library of Simulation Experiments。数式をJavaScriptで独立実装しています。これらのリンクは任意の参考資料で、アニメーションの実行に通信は不要です。