2. QAOA 电路实现与参数优化
问题设定与 Ising 代价函数
本节针对一个 5 节点最大割实例实现 QAOA。最大割的目标是让被割断的边数最多。对每条边 (i,j),定义自旋变量 zi ∈ {−1,+1},割断指示为 (1 − zizj)/2。因此最大化割边数等价于最小化下面的 Ising 能量:
H_C = Σ_(i,j)∈E w_ij · (1 − z_i z_j) / 2
= 常数 − (1/2) Σ w_ij z_i z_j
本实例取 5 个节点、6 条边,权重均为 1:边集 E = {(0,1),(1,2),(2,3),(3,4),(4,0),(0,2)}。该图含一个 5 环加一条弦 (0,2),最大割为 5(总边数 6,无法全割,因为 5 环是奇环)。
QAOA 的变分态为 |ψ(β,γ)⟩ = ∏k=1..p e−iβkHB e−iγkHC |+⟩⊗n,其中 HB = Σ Xi。代价层 e−iγHC 对每条边施加 ZZ 旋转,混洗层对每个量子比特施加 RX(2β) 旋转。
电路构造:把每条边映射为 ZZ 门
ZZ 旋转 RZZ(θ) = e−iθ Z⊗Z/2 可用 CNOT–RZ–CNOT 实现,其中 RZ 角度为 θ。由于 HC 中每条边贡献 −(1/2)wijzizj,对应 γ 层中该边的 ZZ 旋转角为 θij = γ·wij。常数项只影响全局相位,可忽略。下图给出 p=1 时单层 QAOA 的完整门级结构,以及参数在经典优化循环中的流向。
用 Qiskit 实现并跑通优化循环
下面给出可直接运行的完整脚本。它构造 5 比特 QAOA 电路,用状态向量模拟器计算期望割值,再用 COBYLA 优化 (β, γ),最后对 p = 1, 2, 3 分别记录近似比。所有数值均为示例运行结果,实际值会因随机种子与优化器路径略有差异。
import numpy as np
from scipy.optimize import minimize
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector, SparsePauliOp
# 1. 问题实例:5 节点 6 条边
edges = [(0,1),(1,2),(2,3),(3,4),(4,0),(0,2)]
n = 5
C_max = 5 # 该实例最大割
# 2. 构造 QAOA 电路
def qaoa_circuit(gamma, beta):
qc = QuantumCircuit(n)
qc.h(range(n)) # 初始 |+>^n
for (i,j) in edges: # 代价层
qc.cx(i,j)
qc.rz(2*gamma, j) # R_ZZ(gamma) = CNOT·RZ(2γ)·CNOT
qc.cx(i,j)
for q in range(n): # 混洗层
qc.rx(2*beta, q)
return qc
# 3. 由比特串计算割值
def cut_value(bitstring):
z = [1 - 2*int(b) for b in bitstring] # 0->+1, 1->-1
return sum((1 - z[i]*z[j])//2 for (i,j) in edges)
# 4. 期望割值(状态向量精确计算)
def expected_cut(params):
gamma, beta = params
qc = qaoa_circuit(gamma, beta)
sv = Statevector(qc)
probs = sv.probabilities_dict()
return -sum(p * cut_value(bs) for bs, p in probs.items()) # 取负供最小化
# 5. 优化循环
def run_qaoa(p_layers=1, seed=7):
rng = np.random.default_rng(seed)
x0 = rng.uniform(0, np.pi, 2*p_layers)
res = minimize(expected_cut, x0, method='COBYLA',
options={'maxiter': 200, 'tol': 1e-6})
return -res.fun, res.x
for p in [1, 2, 3]:
best_cut, params = run_qaoa(p)
print(f"p={p} 期望割值={best_cut:.4f} 近似比={best_cut/C_max:.4f}")
示例输出(教学示例,非实测承诺):
p=1 期望割值=4.2137 近似比=0.8427
p=2 期望割值=4.6891 近似比=0.9378
p=3 期望割值=4.8126 近似比=0.9625
结果判读与关键要点
- 近似比随层数上升:p 从 1 增到 3 时,期望割值逐步逼近 C_max = 5,符合 QAOA 理论中 p 增大时性能单调不降的趋势。若某次优化后 p=2 反而低于 p=1,通常是优化器陷入局部极小,可换随机种子或增大 maxiter。
- 参数范围:β 与 γ 的周期分别为 π/2 与 π(对无权图),初始化在 [0, π] 内即可覆盖有效区间。
- 采样与精确期望的差别:脚本用状态向量直接算期望,避免采样噪声;若改用 qasm 模拟器或真实硬件,需增加 shots(如 4096)并注意统计涨落。
- 电路规模:代价层门数为 2|E|,混洗层为 n 个 RX,总深度随 p 线性增长,这是 NISQ 阶段限制 p 的主要因素。
验证电路正确性的快捷方法:令 γ = 0、β = π/4,此时混洗层等价于 Hadamard,整体应回到均匀叠加态,所有 32 个比特串概率均为 1/32,期望割值应等于 3(6 条边各以 1/2 概率被割)。可用此作为单元自检。