Mímisbrunnr知恵の泉

← 数理最適化 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:遺伝的アルゴリズム局所探索と近傍 | 関連:無制約最適化

要点(BLUF)

概念 ── 群れの知恵

鳥の群れや魚の群れは、個々が単純なルール(隣に合わせる・餌へ向かう)で動くだけで、群全体として賢く餌場へ向かう。この 群知能(swarm intelligence) を最適化にしたのが PSO(Kennedy & Eberhart)。

各「粒子」は探索空間の1点(候補解)で、速度を持って飛ぶ。粒子は2つの記憶に引かれる:

更新式

粒子 ii の位置 xix_i と速度 viv_i を毎反復こう更新する:

viwvi+c1r1(pibestxi)+c2r2(gbestxi)v_i \leftarrow w\, v_i + c_1 r_1 (p_i^{\text{best}} - x_i) + c_2 r_2 (g^{\text{best}} - x_i) xixi+vix_i \leftarrow x_i + v_i

慣性で飛び続けながら、自分の成功と群の成功の 両方に引かれて最適へ収束していく。

graph LR
  A["各粒子: 位置と速度"] --> B["速度更新 = 慣性 + 自己最良への引力 + 群最良への引力"]
  B --> C["位置更新 x <- x + v"]
  C --> D["pbest(自己最良)・gbest(群最良) を更新"]
  D --> B

Pythonで2次元Rastriganを解く

Rastrigin 関数 f(x)=10n+(xi210cos(2πxi))f(x)=10n+\sum(x_i^2-10\cos(2\pi x_i)) は局所最適だらけの多峰関数で、大域最適は原点 f(0)=0f(0)=0。山登りはまず捕まる地形を、PSO で攻める。

import numpy as np

def rastrigin(p):
    return 10*len(p) + sum(pi**2 - 10*np.cos(2*np.pi*pi) for pi in p)

def pso(seed=0, n_particles=40, iters=200):
    rng = np.random.default_rng(seed)
    X = rng.uniform(-5.12, 5.12, (n_particles, 2))   # 粒子の初期位置
    V = rng.uniform(-1, 1, (n_particles, 2))          # 初期速度
    pbest = X.copy()
    pbest_f = np.array([rastrigin(x) for x in X])
    g = pbest[pbest_f.argmin()].copy()                # 群全体の最良
    gf = pbest_f.min()
    w, c1, c2 = 0.7, 1.5, 1.5
    for it in range(iters):
        r1, r2 = rng.random((n_particles, 2)), rng.random((n_particles, 2))
        V = w*V + c1*r1*(pbest - X) + c2*r2*(g - X)   # 速度更新
        X = np.clip(X + V, -5.12, 5.12)               # 位置更新(範囲内に制限)
        fx = np.array([rastrigin(x) for x in X])
        improved = fx < pbest_f
        pbest[improved] = X[improved]; pbest_f[improved] = fx[improved]
        if pbest_f.min() < gf:
            gf = pbest_f.min(); g = pbest[pbest_f.argmin()].copy()
    return g, gf

g, gf = pso()
print(f"PSO最良 x=({g[0]:+.4f}, {g[1]:+.4f}), f={gf:.6f}")
print(f"理論最小: (0, 0), f=0")

実行結果:

PSO最良 x=(-0.0000, +0.0000), f=0.000000
理論最小: (0, 0), f=0

局所最適が無数にある Rastrigin で、PSO は 大域最適 (0,0)(0,0)f=0f=0)にほぼ完全到達。粒子たちが互いの発見(gbest)を共有しながら飛ぶことで、罠を抜けて谷底に集まった。山登り(局所探索と近傍)なら最初の局所最適で止まる地形を、群知能が攻略する。

数式の直観的意味

PSO の更新式は「慣性で直進しつつ、2つの記憶へ向かう」物理的な運動。慣性項 wvw v が探索の継続(行きすぎ=広域探索)を、引力項が収束(pbest・gbest への集結)を担う ── この2つのバランスが、SA の温度(焼きなまし法)や GA の突然変異率(遺伝的アルゴリズム)と同じ「探索 vs 活用」のつまみ。GA との違いは、GA が 解を組み替える(交叉) のに対し、PSO は 解を連続的に動かす(速度) こと。だから PSO は連続最適化に自然で、勾配法(無制約最適化)に似た「方向を持った移動」をするが、勾配を使わず群の情報で方向を決める。社会項 c2(gx)c_2(g-x) が「みんなが見つけた良い場所」へ引き寄せる協調こそ群知能の本質で、アリコロニー最適化(フェロモンで経路を共有)も同じ「間接的な情報共有」の発想。

⚠️ よくある誤解・落とし穴

関連ノート