量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!


文章目录

  • 前言
  • 一、约束部分的QUBO怎么求?
  • 二、PyQUBO的输出结果怎么不是QUBO矩阵?
  • 三、我的建模太复杂了,可以不用PyQUBO吗?
  • 四、怎么构建sum(x_1+...+x_i)== K的约束?
  • 总结


前言

提示:本教程,大家可以随时在下面留言,呼声高的约束我随时补充:

PyQUBO的代码比较少,散落在我的很多文章里,这次专门写一篇,就不讲具体案例了,专门讲讲常见的约束用python怎么写。


一、约束部分的QUBO怎么求?

有的读者可能读懂了,PyQUBO建模的时候,虽然会给出QUBO矩阵,但是并不是单独给出目标函数和约束函数,各自的QUBO矩阵,而是你先把两部分都构建好,然后扔给PyQUBO自动求出来整体QUBO矩阵。而且,QUBO矩阵由于太过稀疏,是以dict的形式返回的。

所以,你要保证目标函数和约束函数里,都是有PyQUBO封装的binary目标变量。所以大家几乎会用到下面三个PyQUBO的封装类。

 from pyqubo import Array, Constraint, Placeholder

下面是一个挺经典的顶点图覆盖的问题的目标H。参考链接:

https://qard.is.tohoku.ac.jp/T-Wave/pyqubo%e3%82%92%e7%94%a8%e3%81%84%e3%81%a6%e9%a0%82%e7%82%b9%e8%a2%ab%e8%a6%86%e5%95%8f%e9%a1%8c%e3%82%92%e8%a7%a3%e3%81%8f/
  • x 是目标binary变量,sum(x)是我们的最小化目标函数,x就是PyQUBO里的Array创建。
  • λ c o v e r \lambda_{cover} λcover是约束强度,这个可以用Placeholder创建,之后用dict传给最终的目标函数。
  • Constraint是PyQUBO封装好的用来定义约束函数的。

量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!_第1张图片

from pyqubo import Array, Constraint, Placeholder, solve_qubo

# BINARY变量
x = Array.create('x', shape=NUM_VER, vartype='BINARY')

# QUBO的建模
H_cover = Constraint(sum((1-x[u])*(1-x[v]) for (u,v) in edges), "cover")
H_vertices = sum(x)
H = H_vertices + Placeholder("cover") * H_cover

# 自动编译
model = H.compile()

# 用feed_dict代入Placeholder的具体数值
feed_dict = {"cover": 1.0}
qubo, offset = model.to_qubo(feed_dict=feed_dict)

二、PyQUBO的输出结果怎么不是QUBO矩阵?

因为QUBO矩阵一般很稀疏,所以,是通过每个二次项的两个变量对 ( x [ i ] , x [ j ] ) (x[i], x[j]) x[i],x[j],和一个(float系数)构建dict变量,作为结果输出的。
但是,neal或者openjij都是接受这种形式的QUBO作为输入的,所以不用自己再做变化。如果你想获得矩阵形式的QUBO,自己写for循环就能搞定,for循环不会写的,我就爱莫能助了。

量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!_第2张图片

三、我的建模太复杂了,可以不用PyQUBO吗?

当然可以,下面附上,for循环和PyQUBO创建同一个求解函数的对比程序。这是PyQUBO开发者自己做的对比图。也就是说,你可以用多维数组,用for循环,自己构建目标函数。具体怎么编译成QUBO,可以去看看D-Wave的教程,他们当时没有PyQUBO时就是用for循环干的。

量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!_第3张图片

四、怎么构建sum(x_1+…+x_i)== K的约束?

对应的PyQBUO式子如下:
量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!_第4张图片
代码示例:

K = 3
constr = (sum(x)-K)**2
constraint = Placeholder('a')*Constraint(constr, label='larger_than_K')

总结

有什么想问的,评论里留言,我会及时更新文章。
那些库装不上的,直接发代码让我debug的,还是自己解决吧。

你可能感兴趣的:(量子退火Python实战,量子退火算法,python,算法,量子计算,pyqubo,MathorCup2023)