粒子群最佳化 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 取代手動嘗試。