IEEE QCNC 2025 · 开源 Python 包

v202610新增:Benders 对偶分解割

HQC-Bend

面向(混合)整数线性规划的混合量子-经典多割 Benders 分解算法。

输入一个 Gurobi 模型,HQC-Bend 会把二进制主问题交给量子或量子启发式退火器,把连续子问题交给经典 CPU,并不断添加最优性割和可行性割,直到上下界收敛。

Zhongqi Zhao · Mingze Li · Lei Fan · Zhu Han
休斯顿大学 电子与计算机工程系

solve.py
import gurobipy as gp
from HQCMCBD import HQCMCBD_algorithm

model = gp.Model("MILP")
# ... 变量、约束、目标函数 ...

solver = HQCMCBD_algorithm(model, mode="default")
solver.run()

建好模型后只需两行代码,即可全自动完成混合量子-经典求解。

01 · 研究动机

(混合)整数线性规划无处不在,而且很难求解

很多规划和运营问题同时包含是/否决策(是否开通一条线路、启动一台发电机、打开一台冷水机组)和连续量(流量、功率、温度)。这类问题就是(混合)整数线性规划,即 (M)ILP。

  • 网络问题在工厂、仓库和零售商之间平衡生产与需求。
  • 路径规划选择车辆路线,降低运输成本和里程。
  • 数据中心能源管理在温度约束下调度电池、冷水机组和冷却塔。
  • 机组组合决定每个时段由哪些发电机组运行。
~10% McKinsey 预测:到 2030 年,美国数据中心电力需求的年增长率。这类能源问题需要更快的求解器。

为什么难

(M)ILP 是 NP-hard 问题:除非 P = NP,否则不存在能在多项式时间内求解所有实例的算法。

  1. P图连通性
  2. NP整数分解
  3. NP-complete图三着色
  4. NP-hard(M)ILP、停机问题

经典方法包括枚举法、分支定界法和割平面法,它们都运行在 CPU 上。

02 · 量子与经典

CPU?QPU?两者并用。

两种处理器各有所长、各有所短。HQC-Bend 把问题中适合各自的部分分别交给它们。

优势劣势
CPU 中央处理器
  • 通用性强
  • 运行经典算法效率高
  • 并行能力有限
  • 某些任务上速度较慢
QPU 量子处理器
  • 量子并行
  • 量子隧穿,可跳出局部极小值
  • 部分问题上可实现指数级加速*
  • 仅适用于特定问题
  • 处于 NISQ(含噪声中等规模量子)时代,错误率较高
1

展开叠加

叠加态同时覆盖巨大的候选解空间。

2

编码问题

把优化问题嵌入量子系统的能量景观中。

3

释放算力

系统演化到低能量状态,读出后即为经典解。

QPU

主问题是纯二进制问题,正是退火器原生求解的形式(QUBO)。

CPU

子问题是连续线性规划,经典求解器可以快速并行地处理。

03 · 工作原理

一个类,三个阶段,一个循环

HQC-Bend 把目标模型分解为二进制主问题(MAP)和连续子问题(SUB),并在两者之间迭代。

HQC-Bend 算法架构:目标 Gurobi 模型先经过预处理(1);主问题在 CPU 或 QPU 上用 Hybrid BQM、Direct BQM 或 CQM 求解(2);若阈值检查未通过,二进制解被送到在 CPU 1 至 N 上以 normal 或 L-shaped 方案求解的子问题(3),子问题向主问题返回最优性割和可行性割。检查通过后输出最优解 [x; y]。
算法类的逻辑流程,各编号阶段的说明见下文。
1

预处理

读取你的 gurobipy 模型,区分二进制变量 \mathbf{x} 和连续变量 \mathbf{y},并提取各矩阵。

\mathbf{c},\mathbf{H},\mathbf{e} 进入 MAP,\mathbf{d},\mathbf{A},\mathbf{G},\mathbf{b} 进入 SUB。

2

主问题

在 CPU(Gurobi)、QPU(D-Wave CQM/BQM)或本地量子启发式采样器上求解,返回一个或多个二进制候选解 \mathbf{x}^{*}。

根据 λ 上下界的阈值检查决定是否停止。

3

子问题与割平面

对每个候选解,子问题在 CPU 1…N 上以 normal、L-shaped 或 bdd 方案求解,并向 MAP 返回最优性割或可行性割。

循环持续进行,直到间隙收敛或达到 max_steps。

目标模型

主问题(MAP)

主要特点

  • 混合量子-经典计算。QPU 求解二进制主问题,CPU 求解连续子问题。
  • 模块化结构。预处理、主问题求解器和加割方案相互独立,便于扩展。
  • 原生支持 Gurobi 和 Python。输入就是普通的 gurobipy 模型,可作为脚本运行,也可在 Jupyter Notebook 中运行。
  • 子问题并行。多个二进制候选解在 CPU 集群上同时评估。
  • 更强的割。Benders 对偶分解在二进制循环开始前,先在主问题的 LP 松弛上提升割。
  • 多种量子后端。支持 D-Wave BQM 和 CQM 求解器,以及 OpenJij 和模拟分岔采样器。

04 · 主问题求解器

从二进制主问题到 QUBO

由于 λ 被离散为若干二进制位(见配置),主问题是纯二进制的。各量子模式把目标函数和约束编码为 QUBO,每个约束作为惩罚项加入:

其中 P_c 是约束 c 的惩罚系数,g(\cdot) 是该约束编码后的惩罚项。

CPUHybrid_mode: false

Gurobi

经典基准。用 Gurobi 精确求解 MAP,每次迭代添加一个割。

CPU + QPU"cqm"

约束二次模型(CQM)

D-Wave Leap 混合 CQM 求解器。约束以原生形式传入,而不是转成惩罚项。

CPU + QPU"bqm_hybrid"

混合 BQM

D-Wave Leap 混合采样器,经典模块与量子模块协同工作,性能均衡。

QPU"bqm_quantum"

直接 BQM

通过嵌入组合器(embedding composite)在 D-Wave QPU 上进行纯量子退火。

本地"openjij"

OpenJij

在本机运行的量子启发式退火,无需云端令牌。

本地"bifurcation"

模拟分岔

基于 PyTorch 的量子启发式 Ising 求解器,HQC-Bend 在 NVIDIA GPU 上运行它。GPU 安装指南

D-Wave 混合求解服务的内部结构

混合模式运行在 D-Wave 的混合求解服务(Hybrid Solver Service)上。它把经典启发式模块(CH)与量子模块(QM)组合成多个并行线程,共同返回一个或多个高质量候选解。HQC-Bend 可以把每个候选解各自转化为一个割(多割)。

示意图参考 Osaba, Villar-Rodríguez, Gomez-Tejedor and Oregi, “Hybrid quantum solvers in production: how to succeed in the NISQ era?”, IDEAL 2024, pp. 423–434。

经典启发式模块(CH)与量子模块(QM)组成的三个并行线程生成候选解 BQM CQM CHCHCH QMQMQM 候选解

05 · 加割方案

三种加割方式:Normal、L‑shaped 与 Benders 对偶分解

对于 MAP 给出的二进制候选解 \mathbf{x}^{*},子问题会产生对偶解 \mathbf{w}^{*},并据此生成以下两种割之一:

最优性割
可行性割

原始子问题(PSUB)

对偶子问题(DSUB)

  1. 在当前 \mathbf{x}^{*} 下求解对偶子问题 DSUB。
  2. 若 DSUB 有最优解 \mathbf{w}^{*},添加一条最优性割。
  3. 否则说明在该 \mathbf{x}^{*} 下子问题不可行:添加一条可行性割。

多割

量子采样器返回的不只是一个解,而是一整个低能量二进制状态的分布。设置 Mcut_flag: true 后,HQC-Bend 取最好的 Cutnums 个候选解,在 CPU 上并行求解它们的子问题,并在一次迭代中为每个候选解各添加一个割。每轮添加的割越多,λ 的上下界收紧得越快。

每个割都是一个从下方约束 λ 的平面。迭代持续进行,直到 λ 的上下界之差小于 threshold.gap。

左:二进制变量 x1、x2 上从下方约束 t 的割平面三维图。右:t 的上界在前三轮保持 28,随后降到 17;下界从 11 升到 17,两者在第 4 轮相遇。
Benders 分解第四轮。左:累计的割平面;右:λ(图中记为 t)的上下界在第 4 轮相遇。

06 · 配置

改方法,不改代码

一个 JSON 文件控制求解后端、加割方案、λ 的精度和停止准则。mode="manual" 读取 config.json,mode="default" 读取 config_default.json。即使对这一领域了解不多,用户也能自由切换数学方法。

连接变量 λ
算法
Benders 对偶分解(bdd)
量子后端

config.json

将其保存为 config.json,放在 HQCMCBD.py 所在目录,并以 mode="manual" 运行。

全部配置项
配置项含义取值
lambda_var连接 MAP 与 SUB 的变量 λ,表示为 \lambda = \lambda_{+}^{\mathbb{Z}} + \lambda_{+}^{\mathbb{Q}\setminus\mathbb{Z}} - \lambda_{-}^{\mathbb{Z}}对象
nonneg_bits_length非负整数部分的位数 \lambda_{+}^{\mathbb{Z}}正整数
decimal_bits_length正小数部分的位数 \lambda_{+}^{\mathbb{Q}\setminus\mathbb{Z}}正整数
negative_bits_length负整数部分的位数 \lambda_{-}^{\mathbb{Z}}正整数
submethod子问题的求解方法normal, l_shape, bdd
bdd.root_iterationsBDD 根节点阶段的最大 LP 迭代次数;为 0 时等同于 l_shape非负整数
bdd.lagrangian_iterations每个拉格朗日割的最大乘子更新次数;为 0 时只生成加强割非负整数
bdd.mip_gapBDD 子问题的 Gurobi MIPGap非负数
bdd.time_limit每个 BDD 子问题的 Gurobi 时间限制(秒)正数或 null
debug_mode导出主问题和子问题的 LP 文件true, false
Hybrid_mode用量子或量子启发式后端求解主问题(Q+C),而不是用 Gurobi(C+C)true, false
dwave.modeMAP 交给量子求解器时的编码方式cqm, bqm_hybrid, bqm_quantum, openjij, bifurcation
dwave.DWave_tokenD-Wave Leap API 令牌。若为占位值,则改为读取环境变量 DWAVE_API_TOKEN字符串
dwave.Mcut_flag每次迭代添加多个割(否则只加一个)true, false
dwave.CutnumsMcut_flag 为 true 时每次迭代添加的割数正整数
dwave.num_of_read从量子求解器读取的样本数正整数
threshold.type停止准则检查的间隙:绝对间隙 |\bar\lambda - \underline\lambda| 或相对间隙 100\cdot|\bar\lambda - \underline\lambda| / |\bar\lambda|(百分比)absolute, relative
threshold.gap所选间隙低于该值 ε 时停止运行正数
max_steps迭代达到该次数后算法停止正整数

07 · 快速上手

从 Gurobi 模型到混合求解

  1. 1

    安装

    需要 Python 3.8+ 以及带有效许可证的 Gurobi 9.1.2+。HQCMCBD.py 在加载时会导入所有后端,因此即使只用一种模式,也需要全部安装。

    git clone https://github.com/djzts/HQCMCBD-API.git
    cd HQCMCBD-API
    pip install gurobipy numpy dimod dwave-system openjij torch simulated-bifurcation

    使用 D-Wave 模式(cqm、bqm_hybrid、bqm_quantum)时,请在环境变量中设置 DWAVE_API_TOKEN,不要把令牌提交到配置文件中。

    GPU 加速的模拟分岔("bifurcation")

    bifurcation 后端调用 simulated_bifurcation.minimize(..., device="cuda"),因此需要一块驱动支持 CUDA 11.8 的 NVIDIA 显卡。GPU_acced_Q 安装指南一步步介绍了环境搭建:Python 3.10(推荐用 conda 新建环境)、CUDA 11.8 版 PyTorch 2.6.0 以及 simulated-bifurcation 1.2.0。简要步骤如下,请在上面的安装命令之后运行,以免 GPU 版 PyTorch 被替换:

    pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu118
    pip install simulated-bifurcation==1.2.0
    python -c "import torch, simulated_bifurcation as sb; print(torch.__version__, torch.cuda.is_available())"

    最后一条命令应输出 2.6.0+cu118 True。PyTorch 的 cu118 安装包已自带 CUDA 运行库,无需另装 CUDA Toolkit。如果输出 False,请参考指南中的常见问题。

  2. 2

    导入

    Python 脚本
    from HQCMCBD import HQCMCBD_algorithm
    Jupyter Notebook
    import warnings
    warnings.filterwarnings("ignore")
    %run HQCMCBD_notebook.ipynb
  3. 3

    构建模型

    任何包含二进制变量和非负连续变量的 gurobipy 模型都可以。下面是包中的示例问题(Example.ipynb)。

    import gurobipy as gp
    from gurobipy import GRB
    import numpy as np
    
    A = np.array([[0, 0], [0, 0], [0, 0], [0, 0],
                  [-1, -1], [-1, 0], [-1, 0], [0, -1], [0, -1]])
    G = np.array([[1, 0, 1, 0], [1, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1],
                  [0, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])
    b = np.array([1, 1, 1, 1, -1, 0, 0, 0, 0])
    c = np.hstack(np.array([-15.0, -10.0]))
    h = np.hstack(np.array([8, 9, 5, 6]))
    
    # 创建 Gurobi 模型
    model = gp.Model("MILP")
    
    # 添加变量
    x = model.addMVar(shape=len(c), vtype=GRB.BINARY, name="x")
    y = model.addMVar(shape=len(h), vtype=GRB.CONTINUOUS, lb=0, name="y")
    z = model.addVar(vtype=GRB.CONTINUOUS, lb=0, name="z")
    p = model.addVar(vtype=GRB.BINARY, name="p")
    
    # 目标函数与约束
    model.setObjective(c @ x + h @ y, GRB.MAXIMIZE)
    model.addConstr(A @ x + G @ y <= b, name="constraints")
    model.addConstr(z == 1, name="constraints_eq")
    model.addConstr(p == 1, name="constraints_eq2")
    
    model.optimize()

    最大化模型会在内部转换为最小化问题,结果仍按原始符号约定输出。

  4. 4

    运行(只需两行)

    自定义方法 · config.json
    solver = HQCMCBD_algorithm(model, mode="manual")
    solver.run()
    默认设置 · config_default.json
    solver = HQCMCBD_algorithm(model, mode="default")
    solver.run()
  5. 5

    查看收敛过程

    每一轮都会输出目标值、λ 的上下界以及相对和绝对间隙。间隙达到阈值时停止运行。

    输出 · Example-3bin-output.ipynb,manual 模式(节选)
    Benders decomposition Round - 2
    The 2-th Config file of quantum sampling is created successfully at .\data_output\Gurobi_info-round-2.json.
    create optimality cut
    Round 2:
        Current Objective value is 12.0;
        lambda_upper is 20.0;
        lambda_lower is 11.0;
        Relative gap is 81.818%.
        Absolute gap is 9.0
    Benders decomposition Round - 3
    create optimality cut
    Round 3:
        Current Objective value is 6.0;
        lambda_upper is 19.0;
        lambda_lower is 17.0;
        Relative gap is 11.765%.
        Absolute gap is 2.0
    Benders decomposition Round - 4
    create optimality cut
    Round 4:
        Current Objective value is 5.0;
        lambda_upper is 17.0;
        lambda_lower is 17.0;
        Relative gap is 0.0%.
        Absolute gap is 0.0
    optimal found, it takes 4  Rounds.
    data_output/每一轮的目标值、λ 上下界、求解器元数据和 MAP 解。
    LP_output/开启 debug_mode 时导出的 MAP 和子问题的 Gurobi LP 文件。
    LP_output_dwave/量子和量子启发式求解器的输出文件。

08 · 结果

几轮之内,上下界即可收敛

两张图都跟踪了每次迭代中连接变量 λ 的上下界和目标值。

示例问题:三次迭代中 λ 下界从 -62 升到 -17,上界从 0 降到 -17,目标值收敛到 -2 附近。
示例问题。即上文快速上手中的模型,λ 的上下界在三次迭代后相遇。
机组组合问题:第一次迭代后 λ 上下界和目标值从约 -65,000 跃升到约 20,000,并在五次迭代内收敛。
机组组合。经典的电力系统 MILP,目标值和上下界都快速收敛。

示例问题数据

总结

HQC-Bend 是一个基于 HQC-Bend 算法、用于求解复杂 (M)ILP 问题的 Python 包。它把适合量子计算的优化任务交给量子计算,其余部分交给经典求解器,为 (M)ILP 问题提供高效、稳健的求解方案。

09 · 应用

数据中心能源管理

配套仓库 djzts/HQCMBD 中有一个为 HQC-Bend 构建的数据中心模型。它与 HQC-Bend 天然契合:启停决策是二进制变量,交给量子主问题;功率和温度是连续变量,交给 CPU 子问题。

  • 9个服务器区域(3 × 3 网格)
  • 150 kWh电池,充/放电功率上限 60 / 90 kW
  • 15–24 °C区域允许温度
  • 2.5 kW/m²IT 与服务器负载密度

决策变量

  • 二进制 电池充/放电状态 u^{\text{chr}}_t, u^{\text{dis}}_t
  • 二进制 冷水机组和冷却塔启停 x^{\text{chiller}}_{j,t}, x^{\text{tower}}_{j,t}
  • 连续 电池功率 p^{\text{chr}}_t, p^{\text{dis}}_t
  • 连续 区域温度和送风温度 T^{\text{Zone}}_{i,t}, T^{\text{sup}}_{i,t}
  • 连续 通风风量 v^{\text{vent}}_t

优化目标

最小化从电网购电的成本:

电网购电量等于 HVAC 负载加服务器负载加电池充电量,再减去光伏发电量。调度方案必须满足电池约束、考虑相邻区域换热的区域热动态、通风要求,以及冷水机组和冷却塔的容量约束。

打开模型 Notebook 查看全部参数

完整 MILP 模型

10 · 相关研究

基于该方法的已发表成果

同样的思路(二进制主问题在量子硬件上求解,连续子问题由经典求解器处理)已应用于卫星与空间网络、联邦学习和能源系统等方向的同行评审论文。

  • 6篇同行评审论文
  • 5篇 IEEE 期刊论文
  • 2023–2025发表年份
  1. 能源系统

    Quantum assisted combinatorial Benders' algorithm for the synergy of hydrogen and power distribution systems with mobile storage

    Mingze Li, Siyuan Wang, Lei Fan, Zhu Han

    IEEE Transactions on Power Systems, vol. 40, no. 5, pp. 3967–3978, 2025

    协同调度氢能系统与配电系统,包括车载移动储氢设施的行驶路线和装卸量。主问题以 QUBO 形式在量子退火器上求解,子问题在经典 CPU 上求解。

  2. 卫星网络

    Quantum-Assisted Online Task Offloading and Resource Allocation in MEC-Enabled Satellite-Aerial-Terrestrial Integrated Networks

    Yu Zhang, Yanmin Gong, Lei Fan, Yu Wang, Zhu Han, Yuanxiong Guo

    IEEE Transactions on Mobile Computing, 2024

    在低轨卫星、高空平台和地面基站共同服务物联网设备的场景下,最小化服务时延。基于 Lyapunov 的在线控制算法把随机优化问题分解为逐时隙问题,再借助量子计算求解。

  3. 空间网络

    Quantum-assisted joint virtual network function deployment and maximum flow routing for space information networks

    Yu Zhang, Yanmin Gong, Lei Fan, Yu Wang, Zhu Han, Yuanxiong Guo

    IEEE Transactions on Mobile Computing, vol. 24, no. 2, pp. 830–844, 2025(2024 年在线发表)

    联合优化用户关联、虚拟网络功能部署和流量路由。得到的 MILP 用混合量子-经典 Benders 分解求解,其中主问题被转换为 QUBO。

  4. 联邦学习

    Hybrid quantum–classical benders' decomposition for federated learning scheduling in distributed networks

    Xinliang Wei, Lei Fan, Yuanxiong Guo, Yanmin Gong, Zhu Han, Yu Wang

    IEEE Transactions on Network Science and Engineering, vol. 11, no. 6, pp. 6038–6051, 2024

    同时调度多个联邦学习模型,选择参与方并确定学习率。该联合问题是 NP-hard 的 MINLP,用混合量子-经典 Benders 分解求解。

  5. 卫星网络

    Quantum-assisted joint caching and power allocation for integrated satellite-terrestrial networks

    Yu Zhang, Yanmin Gong, Lei Fan, Yu Wang, Zhu Han, Yuanxiong Guo

    IEEE Transactions on Network Science and Engineering, vol. 11, no. 6, pp. 5163–5174, 2024

    联合优化内容分发、缓存放置和发射功率,以最大化网络吞吐量。大规模 MINLP 用混合量子-经典广义 Benders 分解求解。

  6. 联邦学习

    Quantum assisted scheduling algorithm for federated learning in distributed networks

    Xinliang Wei, Lei Fan, Yuanxiong Guo, Yanmin Gong, Zhu Han, Yu Wang

    32nd International Conference on Computer Communications and Networks (ICCCN), IEEE, pp. 1–10, 2023

    该方法的首个应用:多模型联邦学习调度,把问题分解为二进制主问题和小规模连续子问题,结合量子计算与经典计算求解。

你的研究用到了 HQC-Bend?欢迎联系我们,我们会把你的论文加到这里。

11 · 引用

引用 HQC-Bend

如果你在工作中使用了 HQC-Bend,请引用 QCNC 2025 论文:

@inproceedings{zhao2025hqc,
  title={HQC-Bend: A Python Package of Hybrid Quantum-Classical Multi-cuts Benders' Decomposition Algorithm},
  author={Zhao, Zhongqi and Li, Mingze and Fan, Lei and Han, Zhu},
  booktitle={2025 International Conference on Quantum Communications, Networking, and Computing (QCNC)},
  pages={591--597},
  year={2025},
  organization={IEEE},
  url={https://github.com/djzts/HQCMCBD-API}
}