跳到主要內容區塊

計資中心電子報C&INC E-paper

技術論壇

量子科技簡介_量子啟發式運算 #2:演算法實戰——從模擬退火到Python實作
  • 卷期:v0077
  • 出版日期:2026-06-20

作者:張晏瑞 / 中原大學智慧運算與大數據碩士學位學程助理教授


 

上一篇我們釐清了「量子退火機」與「量子啟發式演算法」這兩條面對最佳化難題的技術路徑,並承諾在「演算法流」這條路徑上動手實作。本篇將把概念落地成程式碼:從模擬退火(Simulated Annealing, SA)的物理直覺切入,拆解它的三個關鍵元件——能量函數、鄰域擾動、Metropolis 接受準則——並在不到 50 行的 Python 中,於Google Colab上實際求解一個 10 自旋的易辛模型。最後比較三種冷卻排程的效果,並指出 SA 的局限,作為通往下一篇「平行回火與模擬量子退火」的橋樑。

 

一、從金屬退火到電腦退火:借用大自然的智慧

回顧上一篇,我們把最佳化問題改寫成了易辛模型(Ising Model)的能量函數:

任務於是變成:讓這群「磁鐵」找到能量 H 最低的排列方式。

模擬退火(Simulated Annealing, SA)這個演算法的命名,直接借用了冶金學的物理過程:把一塊金屬加熱到高溫,讓內部原子劇烈震動、自由跳動;接著緩慢降溫,原子在過程中會「自然地」找到能量最低的排列,形成完美晶格。如果降溫太快,原子來不及調整位置就會留下缺陷——在最佳化的語言裡,這就是「卡在局部最佳解」。

Kirkpatrick 等人在 1983 年提出的關鍵洞見是:這個物理過程可以被翻譯成一段純粹的數學程序,在任何一台傳統電腦上執行。具體對應如下:

✓ 原子的位置 → 解空間中的某個候選解(一組

✓ 熱震動 → 隨機擾動目前解

✓ 溫度 → 一個可控參數 ,主導「接受較差解」的機率

✓ 緩慢降溫 → 預設的冷卻排程(cooling schedule),從高溫逐漸降到接近 0

 

二、演算法的三大支柱

SA 的精巧之處在於:它只需要三樣元件,就能跳出傳統演算法陷入局部最佳解的困境。

1. 能量函數 E(s)

把任何問題——TSP 路徑長度、投資組合風險、最大切割問題的切邊數——寫成一個可計算的能量函數。給定一組決策 s,我們要能算出它對應的「成本」是多少。

2. 鄰域擾動(Neighborhood Move

從目前解 s 出發,定義「鄰居解 s′」的產生方式。最常見的做法是隨機翻轉一個自旋(把某個 σᵢ 由 +1 翻成 −1,或反之)。這個小擾動,正模擬了金屬中原子的熱震動。

3. Metropolis 接受準則

這是 SA 的靈魂。當我們從 s 跳到 s′,能量變化 ΔE = E(s′) − E(s) 時,新解被接受的機率為:

P_accept = 1                       若 ΔE ≤ 0

P_accept = exp(− ΔE / T)            若 ΔE > 0

這個公式的奧妙在於:當新解較好(能量下降),永遠接受;當新解較差(能量上升),仍然有機會被接受,接受機率取決於兩件事——變差程度 ΔE 越大,越不容易被接受;目前溫度 T 越高,越容易被接受。

換言之,高溫時 SA 在解空間大幅亂跳,像血氣方剛的青年到處探險;低溫時 SA 變得保守、只接受改善解,像謹慎的老人專注局部優化(如圖 1 所示)。這就是「先大膽探索、再小心收斂」的核心策略,也是傳統貪婪演算法做不到的。

20260620_007709_05

Figure 1  Metropolis 接受機率示意圖。當 ΔE > 0 時,接受機率隨溫度 T 下降而急速衰減——高溫近似隨機漫步,低溫近似貪婪下降。

 

三、Python實作:求解一個 10 自旋 Ising 問題

接下來我們把整套邏輯翻譯成 Python,整段程式碼可直接複製到 Google Colab 上執行。

步驟 1:產生一個隨機 Ising 問題

20260620_007709_01

 

步驟 2:撰寫 SA 主迴圈

20260620_007709_02

 

步驟 3:執行與視覺化

20260620_007709_03

 

執行後,能量曲線呈現鋸齒狀下降(如圖 2 所示):高頻波動代表「探索」(接受了較差解),整體往下趨勢代表「收斂」。對 10 自旋的小問題,我們甚至可以用暴力法窮舉所有 2¹⁰ = 1024 種組態驗證 SA 的答案。對於更大的問題(例如 N = 100,組態數已達 1.27 × 10³⁰),暴力法完全不可行,但 SA 仍能在數秒內給出高品質解——這就是「啟發式」之所以實用的原因。

20260620_007709_04

Figure 2  10 自旋 Ising 模型上的 SA 能量演化曲線。可見前期能量呈現鋸齒狀大幅波動(高溫探索),後期逐漸平緩收斂至最低能量。

 

四、冷卻排程的藝術

SA 看似簡單,但「怎麼降溫」決定了它的成敗。三種常見的冷卻排程是:

✓ 線性冷卻:Tₖ = T₀ − k·β

✓ 指數冷卻:Tₖ = T₀ · αᵏ(剛剛實作所用)

✓ 對數冷卻:Tₖ = T₀ / log(1+k)(理論上保證收斂到全域最佳,但慢到不實用)

把三種排程都跑一遍,將能量曲線疊在同一張圖上(如圖 3 所示),可直觀地看出:降太快會卡在局部最佳,降太慢則浪費運算資源。實務上「指數冷卻」是最常用的折衷——前期保留充足的探索空間,後期能快速收斂。

20260620_007709_04

Figure 3  三種冷卻排程的能量演化比較。線性冷卻過早凍結於局部最佳,對數冷卻收斂緩慢,指數冷卻在實務上取得最佳平衡。

 

調參時的幾條經驗法則:

✓ T₀ 應設得足夠高,使初始接受機率約 80%–95%(高溫近乎隨機漫步)

✓ T_end 應接近 0,但不可為 0(避免分母錯誤)

✓ n_iter 至少應為 N × 100 ~ N × 1000,視問題崎嶇程度而定

 

五、SA的力量、極限,與下一站

模擬退火是個歷久不衰的演算法。它的優勢顯而易見:邏輯簡單、適用範圍廣、無需特殊硬體。也因此,它常被當作組合最佳化研究的「基準線(baseline)」——任何新方法都得先打贏 SA 才有意義。

但 SA 也有它的痛點:

1. 效率隨問題規模惡化:自旋數從 10 跳到 1000,所需迭代次數大幅成長。

2. 能量地景極崎嶇時仍會卡住:尤其是有許多深而窄的局部最小值時。

3. 冷卻排程需要繁瑣調參:不同問題的最佳 T₀、α 都不一樣。

為了克服這些限制,研究者發展出了更進階的演算法家族:

✓ 平行回火(Parallel Tempering, PT):同時跑多個不同溫度的 SA 並交換狀態。

✓ 模擬量子退火(Simulated Quantum Annealing, SQA):用 Path Integral Monte Carlo 模擬量子穿隧。

✓ 數位退火(Digital Annealer):富士通在 ASIC 上實作的高速並行 SA 變體。

✓ 直接呼叫真實量子退火機(D-Wave QPU):跳到硬體流路徑。

這些技術都站在 SA 的肩膀上往前推。在下一篇文章中,我們將深入探討平行回火與模擬量子退火這兩個「介於 SA 與真正量子退火之間」的量子啟發式技術,並比較它們在同一個Ising 問題上的表現。

 

敬請期待:《量子啟發式運算 #3:穿越溫度與量子的橋樑——平行回火與模擬量子退火》