前言
上篇讲的subQUBO属于方法论,这次讲个通过编码量子比特的方式,同样的约束条件,不同的编码,所需的量子比特数是不同的。有的编码方式,很节省量子比特。比如,这次要讲的Domain wall encoding。
一、Domain wall encoding是什么?
1.1 直觉上的理解
Domain wall的概念来自于物理学,具体的由来我还没有考古,等我有时间了再补充。
- 它主要是可以用N-1位量子比特,来代表N位的One-hot编码。
- 它的概念解释中用的变量是Ising machine的spin变量,也就是变量取值是+1或-1。
下面资料的图主要来自以下文章:
https://qiita.com/sotobenjamin0307/items/2cd329923fb3f0c03692
Domain-Wall / Unary Encoding in QUBO for Permutation Problems
https://ieeexplore.ieee.org/document/9951263
大家对比一下0~4的one-hot编码和Domain wall encoding的区别。
- one hot编码,有几个数值,就需要几个量子比特。
- Domain wall encoding,N个数值的话,就只需要N-1个spin。
为什么4个量子比特可以代表5个数值呢?
- 因为,它隐藏了首尾两个默认值,
- 所以,就是它本来用了N+2个spin,所有会有N个边,就是下图中的竖线段的位置。
就想象成,10个电线杆的话,需要8段线。
1.2 Domain wall encoding的数学定义
- one hot编码的约束项,等价于下面的Domain wall encoding的约束项。
- spin串里,从-1变为+1的位置下标数值i,就是该编码的代表的数值。(*满足该条件的位置仅存在一个)
下面的Domain wall value就是,上面👆约束项的最小值。可以代入验算一下。
二、Domain wall encoding的python实现
1. 安装amplify库
pip install -U amplify
2.创建Domain wall约束
from amplify import domain_wallgen = VariableGenerator()
q = gen.array("Binary", 4)
dw = domain_wall(q)
也可以换成Binary变量,具体约束项参考以下文档。
https://amplify.fixstars.com/en/docs/amplify/v1/constraint.html
总结
Domain wall encoding的概念并不难理解,但是网上资料太少了,搞懂也花了点时间,不过终于搞懂了,希望能帮到大家。还有更高级的Domain wall encoding在某些问题上可以缩减到正常one hot编码的几十分之一。以后有机会再介绍。