量子退火算法入门(1) : QUBO是什么?

量子计算机

量子计算机是利用“量子叠加”,“纠缠”等量子力学现象实现并行计算的计算机。传统计算机需要大量时间才能得出答案的问题,量子计算机可能会在短时间内解决,因此有望在各个领域得到应用。根据解决问题的方法,量子计算机可以大致分为量子门法(门:gate)和量子退火法(退火:annealing)两种。本文只讲解量子退火法相关的建模和计算过程。

量子退火法能解决什么问题?

量子退火法就是模拟退火算法的量子实现版。我们先撇开量子力学的相关知识,关注于实际问题。本篇文章专注于量子退火法的输入输入输入

量子退火法都必须把问题映射成一个叫【哈密顿算符(Hamiltonian) 】的能量表达式,一般用H表示,然后求出让H值最小的变量组合。这个表达式是个二次多项式,里面的变量只能取0或1。下面举个例子。
请添加图片描述
也就是x1和x2都只能取值0或1,我们要算出来,让H最小的x1和x2的值。因为x1和x2的取值组合和对应的H值,如下表所示:
请添加图片描述
从上面的表格可以看出,(x1, x2) = (0, 1)的时候,H=0,是最小值。使用量子退火解决法,可以解决所有可以转变成二次多项式的,变量取值只能是0或1的问题。

上面的例子只有两个变量,所以很容易算出(x1, x2)的最优解,但是当有成千上万个x变量时,普通计算机就要花很久来计算,而量子退火机可以在数分钟内得出结果(计算时间依赖问题规模而定)。

那怎么把一次多项式和高次多项式转变成二次多项式呢?下面先举一个把一次多项式,转换成二次多项式的例子。

请添加图片描述
上面是这个一次多项式,因为里面的x(x1,x2,x3)只能取0或1。所以,x = x2。那么就可以转换成下面👇的二次多项式了。
请添加图片描述
同理,下面的四次多项式,可以这么转换。(三次多项式的转换比较麻烦,以后有机会再说。)
请添加图片描述
因为即使把H里面的【每一项都乘以整数倍】和【去除常数项】也不会影响的最小值的解。所以,下面的转化没有任何问题。这里用→表示经过整数倍或者去掉常数项的过程。
请添加图片描述

量子退火法和QUBO

上面的哈密顿算符H是个二次多项式,那么为了容易用数学描述,我们可以把他们用矩阵表示。
请添加图片描述
中间这个数字的矩阵,叫做QUBO矩阵,QUBO是(Quadratic Unconstrained Binary Optimization)的缩写,翻译成汉语就是,二次无约束二值优化。

为了和物理模型对应,我们一般会把QUBO变换以下的形式,

  1. 把二次项的下标按照从小到大排列,比如(x2x1)→(x1x2)。
  2. 把能转换的二次项转换为一次项,并写在二次项后面。

下面是个例子:
在这里插入图片描述

这样所有的哈密顿算符H都可以写成下面的形式了。
请添加图片描述

Python演示模拟退火算法如何利用QUBO求解

最后用python的代码看一下怎么使用QUBO求解哈密顿算符H最小值。这次使用pip install wildqat安装wildqat包,然后用模拟退火算法演示。以后用D-Wave替换就是量子退火版了。

只需获得二项式的QUBO矩阵,就可以得到让哈密顿算符H取最小值的解。
下面的二项式,化简后的到QUBO矩阵。
请添加图片描述
然后把QUBO矩阵输入到下面的程序中,就可以得到(x1, x2, x3)=(0, 1, 0)就是让y取最小值的解。


import wildqat as wq
a = wq.opt()
a.qubo = [[-3,4,-2],
		  [0,-5,6],
		  [0,0,3]]
a.sa()
>>> [0, 1, 0]

下一篇讲讲为什么要写成这样的形式,这样的形式怎么和物理模型对应。以及实际问题怎么转换成QUBO。

备注

这篇文章是我读下面这本书的读书感想,因为是日语的,我把感想写成了汉语,上面的截图很多出自这本书。这本书并不是正式出版的书,作者是研究生,书是自己编辑的,里面虽然有些小错误,但是质量非常好。感谢作者。
《最適化問題とWildqatを用いた量子アニーリング計算入門》
https://booth.pm/ja/items/1415833

  • 95
    点赞
  • 297
    收藏
    觉得还不错? 一键收藏
  • 80
    评论
您好!您提到了使用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问题需要根据具体情况进行调整和修改。此外,该代码还可以进一步优化,例如通过选择更合适的初始温度、冷却速率和迭代次数来改进算法的性能。 希望这个示例能对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 80
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值