引言
组合优化(路径规划、排班、网络分割)是量子计算最有潜力的应用之一——**QAOA(量子近似优化算法)**是其中最著名的变分方法。本文讲透 QAOA:先从「怎么把优化问题编码成哈密顿量」讲起(MaxCut 为例),再给 QAOA 的电路结构(交替的相位分离算子 + 混合算子),接着用 Qiskit 从零实现并优化 MaxCut,然后讲参数优化循环与收敛、与经典求解器的对比,最后明确 QAOA 的适用边界(什么时候值得用量子)。
前置:/quantum-qubit-gates-basics/(旋转门与测量)、/quantum-qiskit-programming/(Qiskit)、/quantum-hardware-annealing/(量子退火对比)。
目录
- 1. 组合优化问题:为什么难
- 2. 问题编码:从目标函数到 Ising 哈密顿量
- 3. MaxCut 案例:把问题变成哈密顿量
- 4. QAOA 电路结构:相位分离 + 混合算子
- 5. 变分循环:参数优化与收敛
- 6. Qiskit 实战:MaxCut 的 QAOA 求解
- 7. 与经典求解器对比:何时值得用量子
- 8. QAOA 的深度 p:近似比与量子优势
- 9. 工程要点:噪声、初始参数与扩展
- 10. 速查表
- 延伸阅读
1. 组合优化问题:为什么难
组合优化 = 从指数级候选里找最优解:
例:MaxCut 把图顶点分两组,最大化「被切开」的边数
n 个顶点 → 2^n 种分组方案
n=50 → 2^50 ≈ 10^15 → 穷举不可能
经典困难:
MaxCut 是 NP-hard(一般图)
近似:经典算法给近似比(如 0.878 的 Goemans-Williamson)
QAOA:量子变分方法,期望给出更好的近似比
| 问题 | 目标 | 经典 |
|---|---|---|
| MaxCut | 切最多的边 | 近似比 0.878 |
| 最大团 | 最大的完全子图 | NP-hard |
| 旅行商 | 最短路径 | 近似算法 |
心智:组合优化难在「候选指数爆炸」——量子优化的思路:把问题编码成哈密顿量,让量子态在能量景观里找最低点。
2. 问题编码:从目标函数到 Ising 哈密顿量
核心思想:把「优化目标」变成「量子哈密顿量的期望值」:
变量 x_i ∈ {0,1}(选/不选)
目标函数 f(x) → 改写成 Pauli 算符 Z 的多项式
→ 构造哈密顿量 H_C(成本算子)
→ 解的最优 = H_C 的最小本征态
Ising 模型(量子优化的标准语言):
H_C = Σ w_ij · Z_i · Z_j + Σ h_i · Z_i
Z = 泡利 Z 算符(Z|0⟩=|0⟩, Z|1⟩=-|1⟩)
二进制变量 ↔ 自旋:x_i = (1 - Z_i)/2
# Qiskit 里把优化问题转哈密顿量(用 QAOA 模块)
from qiskit_optimization.translators import from_docplex_mp
# 或用 qiskit_optimization.applications 直接建 MaxCut
from qiskit_optimization.applications import Maxcut
maxcut = Maxcut(graph)
qp = maxcut.to_quadratic_program() # 二次规划
记忆:编码 = 把「0/1 选边」翻译成「Z 算符的能量」——优化找最小能量,就是找最优解。
3. MaxCut 案例:把问题变成哈密顿量
MaxCut 的数学:
图 G(V,E),分两组 S 与补集
边 (i,j) 被切 = 顶点在不同组
目标:最大化被切边数
变量 x_i ∈ {0,1}(0=组A, 1=组B)
边被切:x_i XOR x_j = x_i + x_j - 2x_i·x_j
MaxCut → minimize -Σ_{边} (x_i + x_j - 2x_i x_j)
转 Ising(用 Z 代替 x,x = (1-Z)/2):
H_C = Σ_{(i,j)∈E} (1 - Z_i·Z_j)/2
要最大化被切边 → 最小化 H_C 的能量
# 用 Qiskit Optimization 直接构造 MaxCut
from qiskit_optimization.applications import Maxcut
import networkx as nx
G = nx.Graph()
G.add_edges_from([(0,1),(0,2),(1,2),(2,3),(1,3)]) # 例图
maxcut = Maxcut(G)
qp = maxcut.to_quadratic_program()
print(qp.prettyprint()) # 看目标函数
记忆:MaxCut 的哈密顿量 = Σ(1 - Z_i Z_j)/2——每条边一项,能量最低的态就是最优分组。
4. QAOA 电路结构:相位分离 + 混合算子
QAOA 电路 = 交替两族算子,共 p 层:
初始态:所有比特 |+⟩(等权重叠加)
每层:
1. 相位分离算子 U_C(γ) = e^{-iγ·H_C} → 按成本哈密顿量给态「加相位」
2. 混合算子 U_M(β) = e^{-iβ·ΣX} → 在解空间里「混合探索」
参数 γ, β 由经典优化器调 → 期望 <H_C> 降到最低
p 层结构:
|+⟩ → U_C(γ₁)U_M(β₁) → U_C(γ₂)U_M(β₂) → … → U_C(γₚ)U_M(βₚ) → 测量
# Qiskit 里 QAOA 电路(用内置库)
from qiskit.circuit.library import QAOAAnsatz
qaoa_circuit = QAOAAnsatz(cost_operator=cost_hamiltonian,
reps=1) # p = 1 层
qaoa_circuit.measure_all()
记忆:QAOA = p 组「相位门 + 混合门」交替——γ 偏向好解、β 负责探索,p 越大越接近最优。
5. 变分循环:参数优化与收敛
QAOA 是「量子-经典混合」算法:
循环:
1. 经典选参数 (γ, β)
2. 量子机跑电路 → 测量 → 估 <H_C>
3. 经典优化器调 (γ, β) 再试
4. 直到 <H_C> 收敛 → 输出最优解
参数优化器:
from qiskit.algorithms.minimizers import COBYLA, SPSA, NFT
# COBYLA:简单稳健(小参数少)
# SPSA:噪声环境友好(梯度估计)
# NFT:二阶,更快收敛
初始参数的重要性:
随机初始化 → 收敛慢、易陷入局部
启发式初始化(利用 p-1 层的解)→ 快且稳
记忆:QAOA = 量子给「能量采样」、经典给「参数调优」——优化器选对、初始参数选好,收敛快一半。
6. Qiskit 实战:MaxCut 的 QAOA 求解
完整实现:
from qiskit import QuantumCircuit, Aer, execute
from qiskit.circuit.library import QAOAAnsatz
from qiskit.quantum_info import Pauli, SparsePauliOp
from qiskit.algorithms.minimizers import COBYLA
import numpy as np, networkx as nx
from qiskit_optimization.applications import Maxcut
# 1. 图与 MaxCut 哈密顿量
G = nx.Graph(); G.add_edges_from([(0,1),(0,2),(1,2),(2,3),(1,3)])
maxcut = Maxcut(G)
qp = maxcut.to_quadratic_program()
cost_h = qp.to_ising() # 转 Ising 哈密顿量
# 2. 构造 QAOA 电路(p=2)
qaoa = QAOAAnsatz(cost_operator=cost_h, reps=2)
qaoa.measure_all()
# 3. 参数优化循环(简化:网格试参数)
backend = Aer.get_backend('qasm_simulator')
best = (np.inf, None)
for gamma in np.linspace(0, np.pi, 20):
for beta in np.linspace(0, np.pi, 20):
params = np.array([gamma]*2 + [beta]*2)
bound = qaoa.assign_parameters(params)
counts = execute(bound, backend, shots=4096).result().get_counts()
# 期望能量
exp = sum(energy_from_bitstring(bits) * prob for bits, prob in counts.items())
if exp < best[0]: best = (exp, params)
# 4. 取最优比特串 → 解
_, params = best
bound = qaoa.assign_parameters(params)
counts = execute(bound, backend, shots=8192).result().get_counts()
best_bitstring = max(counts, key=lambda b: -cost_of(b))
print("最优分组:", best_bitstring)
记忆:QAOA 实战五步——建图转哈密顿量、构造 Ansatz、调参数、测能量、取最优串——小问题模拟器秒解。
7. 与经典求解器对比:何时值得用量子
QAOA 不是万能银弹——对比现实:
| 维度 | 经典(Gurobi/GW) | QAOA |
|---|---|---|
| 小问题 | 秒级最优 | 慢且有近似 |
| 大问题 | 可到十万变量 | 受比特数限制 |
| 噪声 | 无 | 有(需缓解) |
| 近似保证 | GW 有 0.878 | 无严格保证 |
| 优势条件 | — | 深度够 + 噪声低 |
什么时候值得考虑 QAOA:
1. 问题规模受限(几十比特)
2. 有结构性问题(局部哈密顿量友好)
3. 研究/教学/验证量子优势路径
4. 深度 p 足够 + 噪声可控
记忆:QAOA 目前「研究价值 > 实用价值」——小问题经典更快更准,量子优势要等容错硬件。
8. QAOA 的深度 p:近似比与量子优势
p 与质量的关系:
p = 1:一层 → 类似经典局部搜索,近似比有限
p 增大:更接近最优,但电路更深 → 噪声更大
极限:p → ∞ 可逼近最优(但无噪声时)
噪声机器:p 大到一定程度反而更差
近似比:
近似比 = 得到的解质量 / 最优解质量(≤ 1)
QAOA p=1 对 MaxCut 有理论近似比(最优的 0.5~0.7 量级)
p 增加可提升,但受噪声天花板
# 看 p 对能量收敛的影响
for p in [1, 2, 3]:
qaoa = QAOAAnsatz(cost_operator=cost_h, reps=p)
# 优化后看 <H_C>
print(f"p={p}: 最优能量 = {optimize(qaoa):.3f}")
记忆:p 是「精度旋钮」——p 大更准但更深更噪——噪声机器有「最佳深度」,不是越深越好。
9. 工程要点:噪声、初始参数与扩展
QAOA 工程化的三个要点:
| 要点 | 做法 |
|---|---|
| 噪声 | 错误缓解(ZNE/测量缓解)、低深度 |
| 初始参数 | 启发式(用上一层解过渡) |
| 扩展 | 问题分解、并行、硬件感知布局 |
错误缓解配合(见 /quantum-error-mitigation/):
from qiskit_ibm_runtime import SamplerV2, QiskitRuntimeService
# 用 SamplerV2 + 测量错误缓解
sampler = SamplerV2(backend=service.backend("ibm_sherbrooke"))
job = sampler.run([bound], shots=4096)
参数维度的「尺缩」:QAOA 的参数空间随 p 线性增长——优化器选 SPSA 抗噪。
记忆:QAOA 工程三件事——降噪(缓解+低深度)、稳初始化(启发式)、可扩展(分解)——别裸奔上噪声真机。
10. 速查表
| 需求 | 做法 |
|---|---|
| 问题转哈密顿量 | qp.to_ising() |
| MaxCut 建模 | Maxcut(graph).to_quadratic_program() |
| QAOA 电路 | QAOAAnsatz(cost_operator, reps=p) |
| 参数优化 | COBYLA / SPSA / NFT |
| 估能量 | 测量统计 → 期望值 |
| 深度 p | 大更准但更深更噪 |
| 噪声缓解 | ZNE / 测量缓解 |
| 初始参数 | 启发式(上层解过渡) |
| 对比经典 | 小问题经典更快 |
一句话记忆:QAOA = 组合优化编码成 Ising 哈密顿量 + p 层「相位门-混合门」交替电路 + 经典优化器调参;MaxCut 建图转 H_C、Qiskit Ansatz 一键生成;p 是精度旋钮但噪声有天花板;小问题经典更实用、量子优势待容错硬件——QAOA 是量子优化的旗舰,但要用得清醒。
延伸阅读
- /quantum-qubit-gates-basics/ — 旋转门与测量
- /quantum-qiskit-programming/ — Qiskit 编程
- /quantum-hardware-annealing/ — 量子退火对比
- /quantum-chemistry-simulation/ — VQE(另一个变分算法)
- /quantum-error-mitigation/ — 噪声缓解
- [[ml]] — 优化与梯度下降
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。