热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于DWavedimod使用详解

dimoddimod是采样器的一个共享API,提供了:BQM(binaryquadraticmodel)类,

dimod

dimod 是采样器的一个共享 API,提供了:


  • BQM(binary quadratic model )类,BQM其包含了如使用了 D-Wave 系统的采样器的 Ising 和 QUBO(quadratic unconstrained binary optimization);
  • DQM(discrete quadratic model)类和高阶(non-quadratic)模型;
  • 采样器和组合采样器的参考例子;
  • abstract base classes 用于构建新采样器和组合采样器;

Introduction

关于 Ocean 编程模型(BQM的使用和求解 hard 问题的采样器)参见 Ocean’s Programming Model。


Binary Quadratic Models

dimod 可以用适合不同性能和易用性需求的类来表示 BQM。BQM支持的所有表达参见Binary Quadratic Models。


BQM Generation

如图四个节点的 maximum cut 问题,

在这里插入图片描述
Star graph with four nodes.

QUBO矩阵如下表示:
Q=[−32220−10000−10000−1]Q = \left[ \begin{matrix} -3 & 2 & 2 & 2 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & -1 \end{matrix} \right] Q=3000210020102001
BQM 的 python dict 表示比较方便:

qubo = {(0, 0): -3, (1, 1): -1, (0, 1): 2, (2, 2): -1,(0, 2): 2, (3, 3): -1, (0, 3): 2}
dict_bqm = dimod.BQM.from_qubo(qubo)

大范围且是混合结构的BQMs可以用 AdjArrayBQM 类表示。

import numpy as np
q_array = np.array([[-3.0, 2, 2, 2],[0, -1.0, 0.0, 0.0],[0, 0, -1.0, 0.0],[0, 0, 0, -1.0]])
array_bqm = dimod.AdjArrayBQM(q_array, 'BINARY')

超大范围的BQMs可以利用 methods 从文件中读数据,如 from_file() 或其他,每个类文件中会有描述。

此外,dimod 还提供了多种 BQM 生成器。

map_bqm = dimod.generators.random.ran_r(1, 7, cls=dimod.AdjVectorBQM)

BQM Attributes

dimod 的 BQM 对象提供了对一些属性和视图的访问接口。参见 Binary Quadratic Models 中特定类型的文档。

dict_bqm.shape
(4,3)
list(map_bqm.variables)
[0, 1, 2, 3, 4, 5, 6]

BQM Methods

BQM 支持大量方法,大都很常用,有些是特定于某个类的,在每个类的文档中进行了描述,方便构建和操作 BQM。

map_bqm.num_interactions
21
map_bqm.remove_interaction(5, 6)
map_bqm.num_interactions
20

Samplers and Composites

dimod 包括供参考的采样器和组合器用于处理二元二次模型(或高阶模型)和提炼采样( refining sampling),用来测试开发代码。

采样器和组合器介绍参见 Samplers and Composites。

所有支持的采样器参见 Samplers and Composites。


Using Samplers

利用ExactSolver测试采样器计算上述 maximum cut 问题所有可能的样本的能量如下:

qubo = {(0, 0): -3, (1, 1): -1, (0, 1): 2, (2, 2): -1,(0, 2): 2, (3, 3): -1, (0, 3): 2}
dict_bqm = dimod.BQM.from_qubo(qubo)
sampler_exact = dimod.ExactSolver()
sampleset = sampler_exact.sample(dict_bqm)
print(sampleset)0 1 2 3 energy num_oc.
1 1 0 0 0 -3.0 1
11 0 1 1 1 -3.0 1
2 1 1 0 0 -2.0 1
...
10 1 1 1 1 0.0 1
['BINARY', 16 rows, 16 samples, 4 variables]

Using Composed Samplers

该例子使用了一个 Boolean NOT Gate 的组合采样器, Getting Started 文档中有具体描述。

FixedVariableComposite函数在提交给采样器之前,组合设置了值并删除了指定变量。

from dimod import FixedVariableComposite, ExactSolver
Q = {('x', 'x'): -1, ('x', 'z'): 2, ('z', 'x'): 0, ('z', 'z'): -1}
composed_sampler = FixedVariableComposite(ExactSolver())
sampleset = composed_sampler.sample_qubo(Q, fixed_variables={'x': 1})
print(sampleset)x z energy num_oc.
0 1 0 -1.0 1
1 1 1 0.0 1
['BINARY', 2 rows, 2 samples, 2 variables]

Creating Samplers

API for Samplers and Composites 可以创建自己的 dimod 采样器和组合采样器。

该例子通过实现单个方法(如 sample_ising)创建 dimod 采样器。

class LinearIsingSampler(dimod.Sampler):def sample_ising(self, h, J, **kwargs):kwargs = self.remove_unknown_kwargs(**kwargs)sample = linear_ising(h, J, **kwargs) # Defined elsewhereenergy = dimod.ising_energy(sample, h, J)return dimod.SampleSet.from_samples(sample, vartype=dimod.SPIN, energy=energy)@propertydef properties(self):return dict()@propertydef parameters(self):return dict()

Samples

dimod 提供的SampleSet类包含了一些采样器。返回的结果和样本在 Solutions 中有介绍。支持的 sampleset 方法在 Samples 中有说明。

以下例子创建了以恶个样本集,然后描述了一些 SampleSet 的参数和方法。

bqm = dimod.generators.random.ran_r(1, 7)
sampler = dimod.ExactSolver()
sampleset = sampler.sample(bqm)

打印最优解的能量:

print(sampleset.first.energy)
-9.0

打印最优解:

print(sampleset.lowest()) 0 1 2 3 4 5 6 energy num_oc.
0 +1 -1 +1 -1 +1 -1 -1 -9.0 1
1 +1 +1 +1 -1 +1 -1 -1 -9.0 1
...
7 -1 +1 -1 +1 -1 -1 +1 -9.0 1
['SPIN', 8 rows, 8 samples, 7 variables]

转换格式

sampleset.to_pandas_dataframe() 0 1 2 3 4 5 6 energy num_occurrences
0 -1 -1 -1 -1 -1 -1 -1 3.0 1
1 1 -1 -1 -1 -1 -1 -1 7.0 1
2 1 1 -1 -1 -1 -1 -1 7.0 1
...

Non-Binary and Non-Quadratic Models

dimod 也提供了DQMs discrete quadratic models 和一些 Higher-Order Composites 以及把高阶多项式转换为 BQMs 的功能。


Discrete Quadratic Models

DQMs 的介绍参见 Discrete Quadratic Models。使用 Leap hybrid DQM 求解器的例子参见 dwave-examples GitHub repository。


Higher-Order Models

该例子使用了 dimod 的 ExactSolverreference samper 解决了高阶无约束二次优化模型(higher-order unconstrained binary optimization (HUBO) model)。

import dimod
poly = dimod.BinaryPolynomial.from_hubo({('a', 'a'): -1,('a', 'b'): -0.5,('a', 'b', 'c'): -2})
sampler = dimod.HigherOrderComposite(dimod.ExactSolver())
sampleset = sampler.sample_poly(poly)
print(sampleset.first.sample["a"])
1

Reference Documentation

一些例子参见如下文档:https://docs.ocean.dwavesys.com/en/stable/docs_dimod/reference/index.html


推荐阅读
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
author-avatar
Carmen果果时代
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有