dwave-hybrid
参考链接:https://docs.ocean.dwavesys.com/en/latest/docs_hybrid/sdk_index.html
dwave-hybrid 是一个通用的、最小的 python 框架,用于构建混合异步分解求解器,求解QUBO( quadratic unconstrained binary optimization)问题。
dwave-hybrid
促使了求解发展的三个方面:
-
Hybrid 方法结合了量子和经典计算资源;
-
评估了算法成分的组合和问题分解策略;
-
使用工作流(workflow)结构和参数来获取最佳应用结果;
Introduction
Dwave-Hybrid提供了一种框架,用于通过并行求解器迭代任意大小的样本集,以找到最佳解决方案。
对应的代码部分文档参见 Reference Documentation。介绍部分只是 package 的概览。
使用的步骤是:先运行一个混合求解器(hybrid solver)来处理任意大小的QUBOs,然后在框架中开发自己的组件。
-
Overview 展示了框架并解释了关键概念;
-
Using the Framework 展示了如何使用框架。通过使用一个已经提供的参考求解器来建立这个框架,可以快速开始。( Kerberos, 求解一个因为太大而不能 minor-embed 到 D-Wave 系统的问题)
-
然后,使用框架建立(hybrid)工作流。比如,一个和 qbsolv 相似的求解器,它可以在整个问题使用禁忌搜索,同时提交部分问题到 D-Wave 系统上。
-
Developing New Components 指导大家开发自己的 hybrid components。
-
Reference Examples 描述了一个 workflow 例子,包括代码。
Overview
dwave-hybrid
框架可以快速设计并测试通过采样器迭代的样本集来解决任意 QUBO 的 workflows。分解大问题,而且可以并行运行两个及以上求解技术/策略。
如下的 Schematic Representation
图展示了一个例子配置。样本在超过四个平行求解器上迭代。顶部分支表示运行在整个问题上的经典 tabu 搜索,直到其他分支完成后被中断。
这些使用不同的分解器将当前样本集的一部分( iteration i
)分配给采样器,例如 D-Wave 系统(第二高的分支)或其他并行结构如模拟退火和禁忌搜索。分支组件(分解器、采样器、组合器)的通用表示如最下面分支。用户定义的标准从当前采样器选择并且求解输出一个样本集用于 i+1
次迭代。
Schematic Representation
可以使用框架运行一个提供的混合求解器或使用提供的组件(如 tabu 采样器和 energy-based 分解器)配置 workflows。
还可以使用该框架构建自己的组件以合并到 workflows 中。
Using the Framework
该部分展示了使用参考采样器(reference sample)来求解任意大小的问题并说明了如何使用提供的组件(components)创建(hybrid)workflows。
Reference Hybrid Sampler:Kerberos
dwave-hybrid 包括一个使用该框架构建的参考示例采样器:Kerberos 是一个兼容 dimod 的混合异步分解采样器,它能够解决任意结构和大小的问题。 它通过在具有高能量影响的问题变量上并行运行禁忌搜索、模拟退火和 D-Wave 子问题采样来找到最佳样本。
如下是使用 Kerberos 求解大 QUBO 的例子:
import dimod
from hybrid.reference.kerberos import KerberosSampler
with open('../problems/random-chimera/8192.01.qubo') as problem:
bqm = dimod.BinaryQuadraticModel.from_coo(problem)
len(bqm)
8192
solution = KerberosSampler().sample(bqm, max_iter=10, convergence=3)
solution.first.energy
-4647.0
Building Workflows
如 Overview 部分所示,通过在 workflows 中安排采样器等组件来构建混合求解器。
Building Blocks
使用的基础 components (Building Blocks)是基于 Runnable
类:分解器、采样器、组合器。该 components 输入一组样本 SampleSet
,输出更新之后的样本。与 components 迭代相关联的State
包含 problem、sample、以及可选的 additional information。
以下示例演示了仅使用一个Runnable
的简单工作流(workflow),代表经典 tabu 搜索算法的采样器,用于解决问题(完全经典,无需分解)。该示例解决了相同耦合(coupled)的节点的三角形图的小问题。全零样本的初始 State
作为开始点集。解决方案(new_state)源于TabuProblemSampler Runnable
的单个迭代。
import dimod
# Define a problem
bqm = dimod.BinaryQuadraticModel.from_ising({
}, {
'ab': 0.5, 'bc': 0.5, 'ca': 0.5})
# Set up the sampler with an initial state
sampler = TabuProblemSampler(tenure=2, timeout=5)
state = State.from_sample({
'a': 0, 'b': 0, 'c': 0}, bqm)
# Sample the problem
new_state = sampler.run(state).result()
print(new_state.samples)
a b c energy num_occ.
0 +1 -1 -1 -0.5 1
['SPIN', 1 rows, 1 samples, 3 variables]
Flow Structuring
该框架提供了用于构建使用了“building-block”components 的 workflows,如 Overview 部分所示,可以创建Runnable
类的一个分支;例如decomposer | sampler | composer
, 它将问题的一部分委托给采样器,例如 D-Wave 系统。
以下示例展示了包含一个分解器(decomposer)、本地 tabu 求解器(sampler)、一个组合器(composer)。一个 10-variable 的二次二元模型通过其变量的能量影响(the energy impact of its variables)分解成 6-variable 的子问题进行两次采样。使用效用函数(utility function)min_sample()
设置所有 -1 值的初始状态(initial state)。
import dimod # Create a binary quadratic model
bqm = dimod.BinaryQuadraticModel({
t: 0