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 倍,原因在於:

  1. PSO 有記憶:每個粒子記得自己的最佳位置(p_best)和全域最佳位置(g_best),這些記憶直接引導搜尋方向
  2. PSO 沒有選擇/交叉/突變的開銷:GA 需要評估適應度、執行選擇、交叉、突變,每個步驟都有計算成本
  3. 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 的核心概念與實作方法。下一章將在此基礎上,進一步探索更進階的應用場景——你將學會如何將本章的知識擴展到更複雜的真實世界問題中。

確保你已經完全理解本章的內容再前進,因為下一章會直接建立在這些基礎概念之上。

解鎖完整教學內容

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