一、什么是 MWPM?
最小权重完美匹配(Minimum-Weight Perfect Matching) 是图论中的经典优化问题:
给定一个带权无向图 G=(V,E)G=(V,E)G=(V,E),其中每条边 eee 有一个非负权重 w(e)w(e)w(e),MWPM 的目标是找到一个完美匹配(perfect matching),使得匹配中所有边的权重之和最小。
完美匹配 的定义:一组边的集合,使得图中每个顶点恰好被覆盖一次(即每个顶点只属于匹配中的一条边)。
二、MWPM 与量子纠错的关系
在量子纠错码(特别是表面码 和环面码)中,MWPM 是解码的核心算法:
| 量子纠错概念 | 对应的图论概念 |
|---|---|
| XXX 检查算符(测量点) | 图的顶点(node) |
| 单量子比特 ZZZ 错误 | 图的边(edge) |
| 综合征 = 哪些检查算符反对易 | 缺陷点(defects) |
| 找到最可能的错误模式 | 找最小权重完美匹配 |
| 边的权重 | wi=log1−pipiw_i = \log\frac{1-p_i}{p_i}wi=logpi1−pi |
为什么权重这样设计? 因为权重与错误概率直接相关:
p(E)=∏i(1−pi)∏i(pi1−pi)ei(2)p(E) = \prod_i (1-p_i) \prod_i \left(\frac{p_i}{1-p_i}\right)^{ei} \qquad (2)p(E)=i∏(1−pi)i∏(1−pipi)ei(2)
取对数后:logp(E)=const−∑iwiei\log p(E) = \text{const} - \sum_i w_i eilogp(E)=const−∑iwiei,权重越小 → 概率越大。
三、MWPM 解码的完整流程
以一个距离-5 表面码为例:
步骤 1:构建匹配图(Matching Graph)
o ── o ── o ── o ── o (边界节点用空心 ○ 表示)
| | | | | 每个 ○ 是一个 X-检查算符
o ── o ── o ── o ── o 每条 ─ 对应一个量子比特
| | | | | Z 错误发生在边上
o ── o ── o ── o ── o
| | | | |
o ── o ── o ── o ── o
| | | | |
o ── o ── o ── o ── o
在边界处,单个 ZZZ 错误只与一个检查算符反对易,所以添加边界节点(用空心方块 □ 表示),边界节点之间用权重为 0 的边连接。
步骤 2:测量综合征 → 确定缺陷点
假设以下错误发生了(红色边):
o ══ o ── o ── o ══ o ═ = 发生 Z 错误的边
| | | | |
o ── o ── o ══ o ── o ★ = 缺陷点(蓝色星)
| | | | | (两个相邻错误共享的算符不会缺陷)
o ── o ══ o ── o ── o
| | | | |
o ── o ── o ── o ══ o ◻
| | | | |
o ══ o ── o ── o ── o ◻
◻───◻ (边界节点,权重=0)
步骤 3:构建综合征图(Syndrome Graph)
缺陷点之间两两连边,权重 = 原图中最短路径距离。
缺陷点:★A, ★B, ★C, ★D(共 4 个)
★A ──3── ★B
| \ /
2 \4 / 5
| \ /
★D ──6── ★C
步骤 4:运行开花算法找 MWPM
尝试所有可能的完美匹配:
| 匹配方案 | 边权重之和 |
|---|---|
| (A-B) + (C-D) | 3 + 6 = 9 ← 最小 |
| (A-C) + (B-D) | 4 + ? = 更大 |
| (A-D) + (B-C) | 2 + 5 = 7 ← 实际最小 |
算法会选择权重和最小的匹配。
步骤 5:输出校正
对匹配中的每对缺陷,取最短路径上的边作为校正操作。
四、精确匹配 vs 局部匹配
| 特性 | 精确匹配(Exact Matching) | 局部匹配(Local Matching) |
|---|---|---|
| 综合征图 | 完全图(所有缺陷两两相连) | 每个缺陷只连接 mmm 个最近邻居 |
| 时间复杂度 | O(N3logN)O(N^3 \log N)O(N3logN)(瓶颈在开花) | O(N2mlogN)O(N^2 m \log N)O(N2mlogN) |
| 表面码解码 | O(L6logL)O(L^6 \log L)O(L6logL) | O(L4mlogL)O(L^4 m \log L)O(L4mlogL) |
| 解码性能 | 最优(最小权重保证) | 几乎相同(近似误差 <10−6<10^{-6}<10−6) |
| 适用场景 | 小规模、需要精确结果 | 大规模模拟(推荐 m=20∼30m=20\sim30m=20∼30) |
经验规律: 当 m≥16m \geq 16m≥16 时,局部匹配与精确匹配的逻辑错误率没有统计学差异。
五、用 PyMatching 实现的代码示例
python
import numpy as np
from pymatching import Matching
# 1. 定义检查矩阵(5-qubit 重复码示例)
H = np.array([
[1, 1, 0, 0, 0], # 检查算符 S1: 测量 qubit 0 和 1
[0, 1, 1, 0, 0], # S2: 测量 qubit 1 和 2
[0, 0, 1, 1, 0], # S3: 测量 qubit 2 和 3
[0, 0, 0, 1, 1], # S4: 测量 qubit 3 和 4
])
# 2. 创建 Matching 对象
m = Matching(H)
# 3. 模拟错误:qubit 2 和 3 发生 Z 错误
noise = np.array([0, 0, 1, 1, 0])
syndrome = H @ noise % 2 # 结果: [0, 1, 0, 1]
# 4. 解码(使用局部匹配,默认 m=30)
correction = m.decode(syndrome)
print(f"校正结果: {correction}") # 输出: [0, 0, 1, 1, 0]
# 5. 验证解码是否成功
recovery = (correction + noise) % 2
is_success = all(H @ recovery % 2 == 0)
print(f"解码成功: {is_success}") # True
六、直观理解
MWPM 解码的核心思想可以概括为:
"把 syndrome 中的缺陷点两两配对,使得配对的总'代价'最小。每对缺陷之间的路径就是需要纠正的错误位置。"
就像快递配送问题:你有 NNN 个包裹要送(缺陷点),要把它们两两配对送到同一个目的地,使得总行驶距离最短。MWPM 就是找到这个最优配对方案。