粒子群最佳化 PSO

import random, math

def pso(objective, bounds, n_particles=30, iterations=100):
    dim = len(bounds)
    particles = [[random.uniform(b[0], b[1]) for b in bounds] for _ in range(n_particles)]
    velocity = [[0]*dim for _ in range(n_particles)]
    pbest = [p[:] for p in particles]
    pbest_val = [objective(p) for p in particles]
    gbest = min(pbest, key=lambda p: objective(p))
    gbest_val = objective(gbest)
    
    w, c1, c2 = 0.7, 1.5, 1.5
    for _ in range(iterations):
        for i in range(n_particles):
            for d in range(dim):
                r1, r2 = random.random(), random.random()
                velocity[i][d] = (w * velocity[i][d] 
                    + c1 * r1 * (pbest[i][d] - particles[i][d])
                    + c2 * r2 * (gbest[d] - particles[i][d]))
                particles[i][d] += velocity[i][d]
                particles[i][d] = max(bounds[d][0], min(bounds[d][1], particles[i][d]))
            
            val = objective(particles[i])
            if val < pbest_val[i]:
                pbest[i] = particles[i][:]
                pbest_val[i] = val
                if val < gbest_val:
                    gbest = particles[i][:]
                    gbest_val = val
    return gbest, gbest_val

def sphere(x):
    return sum(v*v for v in x)

best, val = pso(sphere, [(-10,10)]*3)
print(f"PSO 找到: {best}, f(x)={val:.6f}")

本章總結


深入理解:PSO 與 DE 的關鍵差異

PSO (Particle Swarm Optimization)

PSO 靈感來自鳥群覓食,每個粒子有兩個記憶:

  • 個人最佳 (pbest):自己見過的最佳位置
  • 全域最佳 (gbest):整個群體見過的最佳位置

速度更新公式: $$v_{t+1} = w \cdot v_t + c_1 r_1 (pbest - x_t) + c_2 r_2 (gbest - x_t)$$

| 參數 | 意義 | 典型值 | 太大 | 太小 | |------|------|:------:|------|------| | $w$ (慣性權重) | 保留原方向 | 0.7 | 難收斂 | 早熟 | | $c_1$ (認知係數) | 往個人最佳 | 1.5 | 過度探索 | 不收斂 | | $c_2$ (社會係數) | 往全域最佳 | 1.5 | 早熟收斂 | 不收斂 |

DE (Differential Evolution)

DE 的核心思想是用向量差分產生新解: $$v = x_{r1} + F \cdot (x_{r2} - x_{r3})$$

| 參數 | 意義 | 典型值 | |------|------|:------:| | $F$ (縮放因子) | 控制差分強度 | 0.5-0.9 | | $CR$ (交叉率) | 控制基因交換 | 0.5-0.9 | | $NP$ (種群大小) | 群體數量 | 5D-10D (D=維度) |

PSO vs DE 比較

| 特性 | PSO | DE | |------|:---:|:---:| | 參數數量 | 3 (w, c1, c2) | 3 (F, CR, NP) | | 參數敏感度 | 高 | 中 | | 收斂速度 | 快 | 中 | | 跳出局部最佳 | 中 | 強(多樣性好) | | 高維度效能 | 中 | 好 | | 實作複雜度 | 簡單 | 簡單 |


關鍵要點

  • ✅ PSO 用速度向量在搜尋空間中移動粒子

  • ✅ PSO 的慣性權重 $w$ 從 0.9 線性降到 0.4 效果最好

  • ✅ DE 用向量差分產生新解,不需要梯度資訊

  • ✅ DE 的多樣性維持比 PSO 好,較不易早熟收斂

  • ✅ 兩種演算法都只需要評估目標函數,不須可微

  • 技術社群討論



PSO:鳥群覓食的智慧

粒子群最佳化(Particle Swarm Optimization)模擬鳥群或魚群的集體行為——每一隻鳥(粒子)有自己的位置和速度,同時參考自己的最佳經驗和群體的最佳經驗來調整方向。

PSO 的更新公式

# 每個粒子 i 有:
# 位置 x_i       → 目前的一組參數值
# 速度 v_i       → 參數變化的方向和大小
# 個人最佳 p_i   → 這個粒子見過的最佳位置
# 群體最佳 g     → 所有粒子見過的最佳位置

# 速度更新:
v_i(t+1) = w * v_i(t)                          # 慣性
         + c1 * r1 * (p_i - x_i(t))            # 個人認知
         + c2 * r2 * (g - x_i(t))              # 群體認知

# 位置更新:
x_i(t+1) = x_i(t) + v_i(t+1)

跟 GA 的比較

| 比較 | 基因演算法 | PSO | |:----|:---------|:---| | 表示方式 | 染色體編碼(二進位或排列) | 直接用參數向量 | | 運算元 | 交配、突變、選擇 | 速度更新、位置更新 | | 超參數 | 多(交配率、突變率、選擇壓力) | 少(w、c1、c2) | | 收斂特性 | 較慢但探索性強 | 快速收斂但可能過早 | | 實作難度 | 中(編碼方式需設計) | 低(直接更新向量) |

下一章預告:超參數最佳化

前面的演算法都是用在「訓練模型」,但元啟發式演算法本身也有超參數。下一章教你如何自動調整這些超參數——用 Bayesian Optimization 取代手動嘗試。

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!