量子退火算法入门(7):如何QUBO中的三次多项式怎么转换?


前言

本文还是大部分截图来自于:《最適化問題とWildqatを用いた量子アニーリング計算入門》 https://booth.pm/ja/items/1415833

终于有人问到怎么将QUBO中的三次多项式转换为二次多项式了。直接以一个例题开始讲解。中间会用到之前文章里的知识,大家最好读了该系列前两篇之后,再阅读此文。


一、三次多项式的例题

问题:通过量子退火算法求解令下面 H H H最小化的 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3值。
在这里插入图片描述

下面讲解如何导出对应的QUBO矩阵。

Step1. 变量替换。

首先,把两个变量的乘积用一个变量替代,这里用 x 4 x_4 x4替代 x 2 x 3 x_2x_3 x2x3

在这里插入图片描述
因为我们使用了上面的变量替换,所以我们要满足以下约束:
在这里插入图片描述

Step2. 加入约束项。

上面的约束对应的约束项 H ′ H' H如下👇,由 x 2 , x 3 , x 4 x_2,x_3,x_4 x2,x3,x4能构成的二次多项式构成。
在这里插入图片描述
这里补充一句,在本系列第二篇中,直接给大家列出了常见约束的H表达式,这次我们需要手动推导。大家从头到尾,要谨记一句话:

【我们最终的目标是令目标 H H H最小化的同时,满足约束。所以,约束 H ′ H' H代入令目标 H H H最小化的变量 x 2 , x 3 , x 4 x_2,x_3,x_4 x2,x3,x4具体值时,也是最小化的。】

于是,接下来所有的变换都是为了寻找 H ′ H' H的适当的系数(a, b, c, d, e, f)。本系列第二篇中每个常见约束的求解,都经历了寻找对应系数的过程。

Step3. 寻找合适的约束项系数。

我们可以这么想,通过合适的系数(a, b, c, d, e, f),使得 x 2 , x 3 , x 4 x_2,x_3,x_4 x2,x3,x4满足式(2)时,令 H ′ = 0 H'=0 H=0;不满足式(2)时, H ′ > 0 H'>0 H>0。那就这么约定了。

  1. x 2 x 3 = x 4 x_2x_3=x_4 x2x3=x4时,如我们约定好的,令 H ′ = 0 H'=0 H=0,整理如下表:
    在这里插入图片描述
    这时,上表中的 x 2 , x 3 , x 4 x_2,x_3,x_4 x2,x3,x4按行代入式(4)后,对应的只包含系数(a, b, c, d, e, f)的等式如下:

在这里插入图片描述

  1. x 2 x 3 ≠ x 4 x_2x_3≠x_4 x2x3=x4时,如我们约定好的,令 H ′ > 0 H'>0 H>0,整理入下表:
    在这里插入图片描述
    这个时候, ( k 1 , k 2 , k 3 , k 4 ) (k_1,k_2,k_3,k_4) k1,k2,k3,k4都是比0大的常量。在a=b=0的前提下,把上表中的所有指按行代入式(4)后,得到等式如下:

在这里插入图片描述
接下来,我们要寻找合适的 ( k 1 , k 2 , k 3 , k 4 ) (k_1,k_2,k_3,k_4) k1,k2,k3,k4,比如下面的两组赋值都不行❌。
在这里插入图片描述
于是我们找了很久,终于发现 ( k 1 , k 2 , k 3 , k 4 ) (k_1,k_2,k_3,k_4) k1,k2,k3,k4如下👇取值时,满足约束。
在这里插入图片描述

Step4. 获得确定系数的约束项 H ′ H' H

把已经确定的(a, b, c, d, e, f)和 ( k 1 , k 2 , k 3 , k 4 ) (k_1,k_2,k_3,k_4) k1,k2,k3,k4代入式(4)就行了。得到最终的 H ′ H' H如下:

在这里插入图片描述
Step5. 获得最终的二次多项式 H H H

这里就不必多说了,别忘了还有个 λ \lambda λ 系数,需要手动指定。
在这里插入图片描述
我们把 λ \lambda λ =1,代入上式,得到下面最终的QUBO矩阵。
在这里插入图片描述

二、Python实现

1.引入库

import wildqat as wq
import numpy as np

H_A = np.array([
	[1,0,0,-1],
	[0,0,0,0],
	[0,0,0,0],
	[0,0,0,0]])
H_A = np.array([
	[0,0,0,0],
	[0,0,1,-2],
	[0,0,0,-2],
	[0,0,0,3]])
k, l = 1, 1

a = wq.opt()
a.qubo = k * H_A + l * H_B

for i in range(5):
	print("x = {}".format(a.sa()))
	print("H = {}".format(a.E(-1)))

结果打印如下,有兴趣的可以看看,取值是否满足约束。
在这里插入图片描述

总结

提示:写的比较匆忙,可能有很多错误,大家发现了留言告诉我:

还是挺麻烦的,不过不难理解,是可以写程序自动化的,这也是为什么我们需要pyqubo这中自动化转换QUBO的程序。

  • 36
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
您好!您提到了使用Matlab来模拟退火算法求解QUBO(Quadratic Unconstrained Binary Optimization)问题。下面是一个简单的示例代码,用于演示如何在Matlab实现退火算法来解决QUBO问题: ```matlab % 定义目标函数 Q = [1 -1 2; -1 2 -1; 2 -1 3]; % Q矩阵 f = [1; -2; 3]; % 线性偏置向量 % 模拟退火参数设置 initial_temperature = 100; final_temperature = 0.001; cooling_rate = 0.95; iteration_per_temperature = 100; % 初始化当前解和当前能量 current_solution = randi([0, 1], size(Q, 1), 1); current_energy = current_solution' * Q * current_solution + f' * current_solution; % 模拟退火算法主循环 temperature = initial_temperature; while temperature > final_temperature for i = 1:iteration_per_temperature % 生成一个新的解 new_solution = current_solution; index = randi(length(new_solution)); new_solution(index) = ~new_solution(index); % 计算新解的能量 new_energy = new_solution' * Q * new_solution + f' * new_solution; % 根据Metropolis准则接受或拒绝新解 if new_energy < current_energy || rand < exp((current_energy - new_energy) / temperature) current_solution = new_solution; current_energy = new_energy; end end % 降低温度 temperature = temperature * cooling_rate; end % 输出最优解和最优能量 optimal_solution = current_solution; optimal_energy = current_energy; disp('Optimal Solution:'); disp(optimal_solution); disp('Optimal Energy:'); disp(optimal_energy); ``` 请注意,这只是一个简单的示例代码,用于解决一个具体的QUBO问题需要根据具体情况进行调整和修改。此外,该代码还可以进一步优化,例如通过选择更合适的初始温度、冷却速率和迭代次数来改进算法的性能。 希望这个示例能对您有所帮助!如果您有任何其他问题,请随时提问。
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值