定义问题以及用QUBO表示约束

本文介绍了如何使用QUBO(Quadratic Unconstrained Binary Optimization)来表示和解决二值优化问题。通过定义目标函数、问题缩放和建立QUBO来表示约束,展示了D-Wave系统在解决此类问题中的工作原理。具体讨论了如何构建一个确保只有一个变量为真的QUBO模型,并将其转换为图结构。通过实例解释了QUBO在解决如旅行销售人员问题等约束满足问题中的应用。

定义问题以及用QUBO表示约束

D-Wave擅长解决的问题之一就是二值优化(optimization of binary variables)问题。二值变量只有变量 0(NO, or FALSE)和变量 1(YES, or TRUE)。

传统计算机可以被认为是由逻辑门(logic gates)组成的,逻辑门是一种简单的决策装置,其根据输入产生输出。虽然 D-Wave 系统并不是基于门的,但巧合的是一个特殊的门(异或门)形成了系统要解决的第一个优化问题。

异或门内容如下:
假设由两个二值的输入a,ba,ba,b 。若a=0且b=0a=0 且b=0a=0b=0,则输出为 111, 若a=1且b=1a=1 且b=1a=1b=1,则输出为 111, 其他情况下输出为0.

定义目标函数

对于一个有两个qubit的问题,我们希望在退火之后的 qubits 得到一样的值。qubit 的状态有4种情况,如下表所示:

q0q_0q0q1q_1q1
00
01
10
11

我们需要定义一个目标函数,使其最终实现状态(0,0)和(1,1)。在目标函数中,qubit 是变量。bias(qubit 偏置) 和 strengths(couplers 的强度)是线性项和二次项上的系数。两个 qubit 问题的目标函数有三个项。目标函数的形式如下:

f(s)=a1q1+a2q2+b1,2q1q2(5.1)f(s) = a_1 q_1 + a_2 q_2 + b_{1,2} q_1 q_2 \tag{5.1}f(s)=a1q1+a2q2+b1,2q1q2(5.1)

其中 sss 是变量 q=[q1,q2]q=[q_1,q_2]q=[q1,q2] 的向量,a1a_1a1和$ a_2$ 是 qubit biases,b1,2b_{1,2}b1,2 是 coupler 的权重(strengths)。

设置满足最初目标的 a1,a2,b1,2a_1,a_2,b_{1,2}a1,a2,b1,2。首先可以看到,当 q1q_1q1q2q_2q2 都等于0(记为(0,0))时,目标函数的值为0,也没有其他可调参数。这就是我们希望得到的状态,对应于基态的最小能量应该为0。同时不希望有状态(0,1)和(1,0)。一种办法就是给 a1,a2a_1,a_2a1,a2 两个 biases 都设置为 0.1:

q0q_0q0q1q_1q1Objective Value
000
010.1
100.1
110.2 + b1,2b_{1,2}b1,2

又因为状态(1,1)也是我们希望得到的状态,一种方式就是给coupler权重设置 b1,2=−0.2b_{1,2}=-0.2b1,2=0.2 .最终的目标函数是:

f(s)=0.1q1+0.1q2−0.2q1q2(5.2)f(s)=0.1q_1 + 0.1q_2 - 0.2q_1q_2 \tag{5.2}f(s)=0.1q1+0.1q20.2q1q2(5.2)

上述表格的输出就变成如下所示:

q0q_0q0q1q_1q1Objective Value
000
010.1
100.1
110

当我们对这个问题在D-Wave系统上运行了很多次退火之后(也称为 采样(samples) or 读取(reads)),我们希望得到基态(0,0)和(1,1),而不是激发态(0,1)和(1,0)。

把这个问题在D-Wave2000Q系统上运行1000次之后,可以获得1000个采样结果。

EnergyStateOccurrences
0(0,0)555
0(1,1)443
0.1(0,1)1
0,1(1,0)1

如果再次运行这个问题,我们期望得到的 energy 0 可能会有不同,但是一定是在500的附近(样本的50%左右)。

需要注意的是,结果中大多数情况是(0,0)和(1,1),调用足够多次QPU时,会看到偶尔的(0,1)和(1,0)这样的解。对于更复杂的 QUBOs ,这种反复求解同一个问题以获得一系列答案的过程称为采样(sampling)

问题缩放(Problem Scaling)

考虑另外一个 2-qubit 问题,这次给 qubit biases 和 coupler strength 分别赋值0.5和1,目标函数如下:

f(s)=0.5q1+0.5q2−q1q2(5.3)f(s) = 0.5q_1 + 0.5q_2 - q_1q_2 \tag{5.3}f(s)=0.5q1+0.5q2q1q2(5.3)

同上,可以得到如下结果:

q0q_0q0q1q_1q1Objective Value
000.5
010.5
100.5
110

因为这个问题的激发态和前面那个问题中的值不同,导致基态和激发态之间的能量差更大(0.5 和 0.1),所以这次可能会看到不同的结果。话句话说,当基态和激发态之间存在较大的间隙(能量差)时,从基态更不容易达到激发态。

前面在第一个问题中,我们在返回的结果中可以看到了一小部分激发态。如果我们多次运行这两个问题,通常会观察到相同的结果,但实际是第二个问题(明显)存在较大差距,这与我们的预期的50%差别有点大。

这一结果是由D-Wave系统的一个称为**自动缩放(auto-scaling)**的功能引起的。每个QPU的偏差 aaa 和强度 bbb 都有一个允许的范围值。除非我们明确禁用自动缩放,否则D-Wave软件会调整问题的 aaabbb 的值,使得把问题发送到QPU之前采用整个可用的(a,b)范围。因此,在运行这两个问题时,它们向QPU呈现相同的(a,b)值,因此返回的解决方案实际上是相同的。当在运行结束返回能量值和目标值时,我们使用的是预缩放(pre-scaling)值。

下面来测试一下这个功能。首先运行第一个问题1000次(激发态的值是 0.1),禁用 auto-scaling。这次看到的结果如下所示:

EnergyStateOccurrences
0(0,0)272
0(1,1)526
0.1(0,1)124
0.1(1,0)68

然后运行第二个问题1000次(激发态的值是 0.5),禁用 auto-scaling。这次看到的结果如下所示:

EnergyStateOccurrences
0(0,0)436
0(1,1)563
0.5(0,1)1
0.5(1,0)0

这些结果表明,在没有自动缩放(auto-scaling)的情况下,第一个问题比第二个问题具有更小的间隙(基态和激发态的能量差),并且返回更多的激发态样本。间隙越小,从基态变到激发态越容易(激发态的次数越多)

用 QUBO 来表示约束

先用 QUBOs 定义一个简单的约束(constraints),可以拓展到更大更复杂的问题中。

exactly-one-true 约束是一个布尔(Boolean)可满足性satisfiability)问题,给定一组变量,我们想知道何时恰好有一个变量为1(真)。

例如,当优化一个旅行销售人员通过一系列城市的路线时(TSP),需要一个约束条件,必须强制销售人员在旅行的每个阶段只能在一个地方(exactly one city),同时在多个地方是无效的。

Figure 6.1: The traveling salesperson problem(TSP) is an optimization problem that can be solved using exactly-one-true constraints. Map data © 2017 GeoBasis-DE/BKG (© 2009), Google.

下面就来说明一下如何以D-Wave可以解决的方式来构建一个简单的 exactly-one-true。步骤如下:

  1. 从目标函数开始:在这个例子中,就是从有三个变量的 exactly-one-true 约束开始,然后建立一个满足这个目标的真值表。
  2. 建立一个能够得到所期望的状态且抑制其他状态的 QUBO。
  3. 把 QUBO 转换到一个graph中。
对目标函数建真值表

考虑一个简单的例子:给定三个变量 a,b,ca,b,ca,b,c ,我们想知道什么时候恰好只有一个变量是1。(也就是说,a,b,ca,b,ca,b,c 中只有一个变量是1,而其他两个变量是0),真值表表示如下:

aaabbbcccExactly 1
000FALSE
100TRUE
010TRUE
110FALSE
001TRUE
101FALSE
011FALSE
111FALSE
建立一个只有一个为真的 QUBO

我们希望找到一个函数 E(a,b,c)E(a,b,c)E(a,b,c) ,当这个目标为真时,使得函数是最小的,可以用下式表示:

a+b+c=1 a + b + c = 1a+b+c=1

a+b+c−1=0 a + b + c - 1 = 0a+b+c1=0

上述第二个式子表示的含义是,当 a,b,ca,b,ca,b,c 都为0时,结果时 -1, 这是一个比 TRUE 状态更低的能量状态。避免这个情况出现的方式是,给这个方程加平方:

(a+b+c−1)2(a + b + c - 1 )^2(a+b+c1)2

于是就有平方表达式:

E(a,b,c)=(a+b+c−1)2 E(a,b,c) = (a + b + c - 1)^2E(a,b,c)=(a+b+c1)2

因为这些变量都是二值的(0 和 1),有 a2=aa^2 = aa2=a于。是我们的目标函数就变成了

E(a,b,c)=2ab+2ac+2bc−a−b−c+1E(a,b,c) = 2ab + 2ac + 2bc - a - b - c + 1E(a,b,c)=2ab+2ac+2bcabc+1

其中函数 E(a,b,c)E(a,b,c)E(a,b,c) 的能量(energy)就是目标函数的值。

加入 energy 这一列之后再看一下真值表。需要注意的是,最低能态和 exactly-one-true 约束是匹配的。解越好,能量越低。

aaabbbcccExactly 1Energy
000FALSE1
100TRUE0
010TRUE0
110FALSE1
001TRUE0
101FALSE1
011FALSE1
111FALSE4

表达为 QUBO 的形式则为:

E(x0,x1,x2)=2x0x1+2x0x2+2x1x2−x0−x1−x2+1E(x_0,x_1,x_2) = 2x_0x_1 + 2x_0x_2 + 2x_1x_2 - x_0 - x_1 -x_2 + 1E(x0,x1,x2)=2x0x1+2x0x2+2x1x2x0x1x2+1

把 QUBO 转换到 Graph 中

QUBO 能量函数能用三角图表示如图6.2。每个二值变量都是一个带有线性系数的 bias 节点。每个二次项都变成节点之间的一条 edge。

Figure 6.2: Triangular graph showing biased nodes and edges.
### 什么是 QUBO 问题QUBO(Quadratic Unconstrained Binary Optimization,二次无约束二进制优化)是一类重要的组合优化问题,其目标是找到一组二进制变量(0 或 1)的取值,使得一个二次目标函数取得最小值或最大值。QUBO 的一般形式为: $$ \text{Minimize } f(x) = x^T Q x $$ 其中 $ x $ 是一个由二进制变量组成的向量,$ Q $ 是一个实数矩阵,表示各个变量之间的相互作用权重。由于 QUBO 问题属于 NP-Hard 类问题,传统计算机在求解大规模 QUBO 实例时面临计算复杂度急剧上升的挑战。 QUBO 具有广泛的应用场景,包括金融投资组合优化、供应链管理、机器学习中的特征选择、图像分割、物流路径规划等领域。它之所以受到关注,是因为许多实际问题都可以被建模为 QUBO 形式,并借助专用优化工具进行求解。 ### QUBO 在量子计算中的应用 量子计算为解决 QUBO 问题提供了新的可能性,尤其是基于量子退火(Quantum Annealing)和变分量子优化算法(VQE)的量子计算架构。由于 QUBO 问题与 Ising 模型具有数学上的等价性,因此它天然适合在量子硬件上求解。 ORCA Computing 的研究表明,光量子计算机可以有效求解 QUBO 问题,并在某些场景下展现出优于经典方法和 D-Wave 的量子退火方法的表现[^1]。ORCA 的方法通过将 QUBO 的解空间映射到光量子系统的输出状态,使得当前的光量子计算机能够在不依赖大规模容错机制的前提下,实现对 QUBO 问题的高效求解。此外,ORCA 的光量子系统可以在室温下运行,具备商业化部署的潜力。 另一家量子计算公司玻色量子推出了“天工量子大脑”,这是一台基于相干光子技术的 100 量子比特光量子计算机,专门用于求解 Ising/QUBO 模型。该系统能够在毫秒级时间内给出集合划分等组合优化问题的全局最优解[^2]。 ### QUBO 问题的编程实现示例 以下是一个使用 Python 和 Qiskit(IBM 的量子计算框架)将集合划分问题转化为 QUBO 并使用 VQE 求解器进行求解的简化示例: ```python from qiskit.algorithms.optimizers import SPSA from qiskit.circuit.library import TwoLocal from qiskit.algorithms import VQE from qiskit.algorithms import Estimator from qiskit.quantum_info import SparsePauliOp # 定义 QUBO 矩阵 Q Q = [[-1, 2], [2, -1]] # 将 QUBO 转换为 Ising 模型的 Pauli 算子形式 # 此处省略具体转换逻辑,假设我们已获得对应的 Pauli 算子 hamiltonian = SparsePauliOp.from_list([ ("ZZ", 1), ("IX", -1), ("XI", -1) ]) # 设置 VQE 参数 ansatz = TwoLocal(2, 'ry', 'cz', reps=1, entanglement='linear') optimizer = SPSA(maxiter=100) estimator = Estimator() # 构建 VQE 求解器 vqe = VQE(ansatz=ansatz, optimizer=optimizer, estimator=estimator) # 执行 VQE 求解 result = vqe.compute_minimum_eigenvalue(hamiltonian) # 输出结果 print("最优解能量:", result.optimal_value) print("最优参数:", result.optimal_parameters) ``` 上述代码展示了如何使用量子计算框架来求解 QUBO 问题的基本流程。在实际应用中,QUBO 到 Ising 模型的转换需要根据具体问题建模,而求解器的选择和参数优化也需结合硬件特性进行调整。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值