Particle Swarm Optimization
🔥 Vibe Prompt
"Minimize Rastrigin function in 5D: f(x)=10n+sum(x_i^2 - 10cos(2πx_i)). Compare PSO vs Gradient Descent."
import random, math
def rastrigin(x): return 10*len(x) + sum(xi**2 - 10*math.cos(2*math.pi*xi) for xi in x)
class PSO:
def __init__(self, dim, n_particles=50):
self.particles = [[random.uniform(-5.12, 5.12) for _ in range(dim)] for _ in range(n_particles)]
self.velocities = [[random.uniform(-1, 1) for _ in range(dim)] for _ in range(n_particles)]
self.p_best = [p[:] for p in self.particles]
self.g_best = min(self.particles, key=rastrigin)[:]
self.w, self.c1, self.c2 = 0.7, 1.5, 1.5
def step(self):
for i, p in enumerate(self.particles):
for d in range(len(p)):
r1, r2 = random.random(), random.random()
self.velocities[i][d] = (self.w * self.velocities[i][d] +
self.c1*r1*(self.p_best[i][d] - p[d]) +
self.c2*r2*(self.g_best[d] - p[d]))
p[d] += self.velocities[i][d]
if rastrigin(p) < rastrigin(self.p_best[i]):
self.p_best[i] = p[:]
if rastrigin(p) < rastrigin(self.g_best):
self.g_best = p[:]
pso = PSO(dim=5)
for gen in range(100):
pso.step()
if gen % 20 == 0:
print(f"Gen {gen}: best = {rastrigin(pso.g_best):.4f}")
print(f"\nPSO final: {rastrigin(pso.g_best):.4f}")
print(f"Global minimum is 0 at x=(0,...,0)")
Metaheuristic Course Complete! 🎉
- ✅ Hill Climbing
- ✅ Tabu Search
- ✅ Simulated Annealing
- ✅ Genetic Algorithm
- ✅ Particle Swarm
Key Points
- Understand the core concepts thoroughly
- Practice with hands-on code examples
- Apply knowledge to real-world problems
- Review and reinforce through exercises
Further Learning
- Official documentation
- Open source projects on GitHub
- Community forums and discussions
- Related courses and tutorials
PSO 為什麼比其他演算法快?
PSO 的收斂速度通常比 GA 快 2-10 倍,原因在於:
- PSO 有記憶:每個粒子記得自己的最佳位置(p_best)和全域最佳位置(g_best),這些記憶直接引導搜尋方向
- PSO 沒有選擇/交叉/突變的開銷:GA 需要評估適應度、執行選擇、交叉、突變,每個步驟都有計算成本
- PSO 的參數更直觀:w(慣性)、c1(認知)、c2(社會),調整起來比 GA 的突變率/交叉率更直覺
PSO vs GA vs SA:實戰比較
| 場景 | 最適合 | 原因 | |:----:|:------:|------| | 連續空間函數最佳化(Rastrigin、Ackley) | PSO 🥇 | PSO 天生在連續空間中移動,收斂最快 | | 超參數調優 | PSO 🥇 | 超參數大多是連續值(學習率、正則化係數) | | TSP 與排列問題 | SA 🥇 | SA 對排列擾動很直觀,PSO 需要特殊編碼 | | 神經網路架構搜尋 | GA 🥇 | 神經網路架構是離散的(層數、神經元數) | | 多目標最佳化 | GA 🥇(NSGA-II) | GA 有多目標的成熟變體 | | 需要可解釋的解 | SA 🥇 | SA 的收斂路徑容易視覺化 |
# 快速測試:比較 PSO 和 GA 在 Rastrigin 函數上的收斂速度
import time
def rastrigin(x):
return 10*len(x) + sum(xi**2 - 10*math.cos(2*math.pi*xi) for xi in x)
# PSO:50 個粒子,100 次迭代
pso = PSO(dim=10, n_particles=50)
start = time.time()
for _ in range(100):
pso.step()
time_pso = time.time() - start
print(f"PSO: {pso.g_best_value():.4f} (耗時 {time_pso:.3f}s)")
下一章預告:把最佳化變成服務
你已經學會了三種元啟發式演算法——模擬退火、遺傳演算法、粒子群最佳化。每一種都有其擅長的領域。下一章 超參數調優應用 將帶你回到機器學習的世界,用 GA 自動搜尋 ML 模型的最佳超參數組。
從理論到實踐,從演算法到應用——這就是元啟發式的完整學習路徑。 3. 🔍 除錯與分析:遇到相關問題時能快速定位根本原因 4. 🏗️ 整合應用:將本章所學整合到你的實際專案中
銜接下一章
本章深入探討了 粒子群最佳化 PSO 的核心概念與實作方法。下一章將在此基礎上,進一步探索更進階的應用場景——你將學會如何將本章的知識擴展到更複雜的真實世界問題中。
確保你已經完全理解本章的內容再前進,因為下一章會直接建立在這些基礎概念之上。