当前位置: 首页 > news >正文

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多


文章目录

  • 前言
  • ー、复习QUBO:中药配伍的复杂性
    • 1.QUBO 的介入:寻找最佳药材组合
  • 二、难题:QUBO矩阵未知的问题
    • 1.为什么这么难?
  • 三、稀疏建模(Sparse Modeling)
    • 1. 欠定系统中的稀疏解
    • 2. L1和L2的选择:
  • 三、压缩感知算法(Compressed Sensing)
    • 1. 压缩感知的性质
    • 2. ISTA算法
  • 四、Python实现
    • 1. 代码和结果解释
  • 四、总结


前言

主要是来自大関真之教授的直播课程: 【実践的量子ソリューション創出論・量子力学B・合同補講】第4回: 量子アニーリングによるブラックボックス最適化を実装する【東北大学全学教育・東北大学工学部】
这篇主要讲,怎么用少量数据去推定QUBO矩阵,然后迭代求解未知函数的方法。牵涉的知识如下:

  • QUBO建模
  • 压缩感知算法(Compressed Sensing)
  • 稀疏建模(Sparse Modeling)
  • ISTA算法(iterative shrinkage thresholding algorithm:软阈值迭代算法)

ー、复习QUBO:中药配伍的复杂性

提示:仅用公式进行问题描述,太难懂了,就举个例子,不用深究。

中药讲究配伍,即不同药材组合在一起能产生比单一药材更好的疗效,并且能减少副作用。但是,中药材之间的相互作用非常复杂,哪些药材组合在一起能更好地降血压、哪些药材组合会产生不良反应,这些都很难通过传统方式(例如人工经验)进行高效筛选。

1.QUBO 的介入:寻找最佳药材组合

QUBO 是一种数学优化技术,它特别适用于解决组合优化问题。我们可以将中药配伍问题转化为 QUBO 问题,然后利用量子退火或经典计算方法来寻找最佳的药材组合。

QUBO 如何应用于降血压中药配伍:

  1. 定义二进制变量:

    • 对于每一种可能用于降血压的中药材(比如,黄芪、决明子、菊花、钩藤、杜仲等),我们都定义一个二进制变量 x i 。 对于每一种可能用于降血压的中药材(比如,黄芪、决明子、菊花、钩藤、杜仲等),我们都定义一个二进制变量 x_i。 对于每一种可能用于降血压的中药材(比如,黄芪、决明子、菊花、钩藤、杜仲等),我们都定义一个二进制变量xi
    • 如果 x i = 1 ,则表示在最终的配伍中包含这种药材;如果 x i = 0 ,则表示不包含这种药材。 如果 x_i = 1,则表示在最终的配伍中包含这种药材;如果 x_i = 0,则表示不包含这种药材。 如果xi=1,则表示在最终的配伍中包含这种药材;如果xi=0,则表示不包含这种药材。
  2. 构建目标函数(成本函数):

    • 目标函数需要反映出我们希望达成的疗效的综合打分,例如:
      • 疗效最大化: 包含能有效降低血压的药材组合。我们可以根据现有研究或实验数据,赋予每个药材一个 “降压能力” 的权重,然后尽可能选择权重高的药材组合。
      • 副作用最小化: 避免产生不良反应的药材组合。可以根据文献或实验数据,赋予每个药材一个 “副作用” 的权重,然后尽可能避免选择副作用权重高的药材组合。
      • 协同作用最大化: 鼓励选择有协同增效作用的药材组合。可以使用药材之间相互作用的实验数据来计算协同作用,并将其纳入目标函数。
    • 因此,目标函数会是这样的形式:
      E = ∑ i ( Q i i ∗ x i x i ) ⏟ 对角元素 + ∑ i , j ( i < j ) ( Q i j ∗ x i x j ) ⏟ 上角元素 E = \underbrace{\sum_i(Q_{ii} * x_ix_i)}_{对角元素} + \underbrace{\sum_{i,j(i<j)}(Q_{ij} * x_ix_j)}_{上角元素} E=对角元素 i(Qiixixi)+上角元素 i,j(i<j)(Qijxixj)
      • x i 是二进制变量,表示是否使用第 i 种药材。 x_i是二进制变量,表示是否使用第i种药材。 xi是二进制变量,表示是否使用第i种药材。
      • Q i i 代表第 i 种药材的个体权重 ( 例如,降压能力、副作用 ) 。 Q_{ii}代表第i种药材的个体权重 (例如,降压能力、副作用)。 Qii代表第i种药材的个体权重(例如,降压能力、副作用)
      • Q i j 代表第 i 种和第 j 种药材的相互作用权重 ( 例如,协同作用或不良反应 ) 。 Q_{ij}代表第i种和第j种药材的相互作用权重 (例如,协同作用或不良反应)。 Qij代表第i种和第j种药材的相互作用权重(例如,协同作用或不良反应)
    • 目标是找到能使 Q 的值最小化的 xi 的组合。
  3. 约束条件:

    • 有些情况下,我们可能需要加入一些约束条件,例如:
      • 配方中药材的总数不超过某个值(例如不超过5种)。
      • 必须包含某几种基础药材。
      • 必须避免某些药材同时出现。
    • 这些约束条件也会被转化为 QUBO 中的惩罚项(添加到目标函数中),以确保优化结果满足要求。
  4. 优化:

    • 使用量子退火器,寻找使 QUBO 目标函数 E 最小化的二进制变量x 组合。
    • 计算出的 x_i 的值(0或1)就对应着最佳的配伍组合。

二、难题:QUBO矩阵未知的问题

1.为什么这么难?

  1. 很多问题没有确定的QUBO矩阵
    比如,中药配伍的问题,你不能通过像TSP问题那样,已经知道地点位置,地点间距离,相应的约束条件。

  2. 获得验证数据的周期太长或者难度太大。
    比如,中药配伍的话,你收集一个配方的实验数据,就需要很多人力物力,这样成本代价太高了,不能无限的验证下去。

已经有少量数据的情况下,怎么近似求解QUBO?

  • 思路如下图:

在这里插入图片描述

数据足够多的话,是不是可以解方程。比如,中药配伍问题的情况,各变量的含义如下:

  • x 变量就是用或者不用某位药,n维就代表有n种药。
  • b变量就是每次不同中药组合的测量后的综合药效列表,假定有m个。
  • a 就是每次不同的QUBO矩阵上三角里的元素n列表。a 是无数种可能的,但是里面肯定有一个是我们想要的接近现实的解。
    在这里插入图片描述
    上面的式子有的难懂,给大家举个实例。
  • x
x_typevalue
x₁1
x₂0
x₃1
x₁x₂0
x₁x₃1
x₂x₃0
  • a
a⁽¹⁾a⁽²⁾a⁽³⁾a⁽⁴⁾a⁽⁵⁾a⁽⁶⁾
a₁0.5-0.30.8-0.40.6-0.7
a₂-0.60.7-0.20.5-0.80.2
a₃0.4-0.50.9-0.60.3-0.4
  • b
bvalue
b₁1.9
b₂-1.6
b₃1.6

上面的式子变换一下:

在这里插入图片描述

下面解释一下变换后的式子中各个变量的维度:

  1. 向量 b 是 m 维向量: b ∈ ℝᵐ

  2. 矩阵 A = [a⁽¹⁾, …, a⁽ⁿ⁾] 的维度是:

    • 每个 a⁽ⁱ⁾ 是 m 维向量
    • 一共有 n 个这样的向量
    • 所以 A 的维度是 m × n
  3. x是 n(n+1)/2 维向量(QUBO矩阵的上三角里所有元素): x ∈ R n ( n + 1 ) / 2 x ∈ ℝ^{n(n+1)/2} xRn(n+1)/2

  4. 通过矩阵乘法 Ax:

    • A(m×n) × x(n×1) = b(m×1)
    • 结果 b 是 m 维向量,与原始定义一致

三、稀疏建模(Sparse Modeling)

线性方程组大家都知道,学完线性代数,也都知道可以换成矩阵形式。我就直接贴上wiki截图了。
https://zh.wikipedia.org/zh-cn/%E7%BA%BF%E6%80%A7%E6%96%B9%E7%A8%8B%E7%BB%84
在这里插入图片描述

  • 一般情况下,1个方程解1个未知数,2个方程解2个未知数,这是我们平时接触较多的求解线性系统的情况,称之为适定系统。
    那如果,一个方程有两个未知数呢?这种情况就是欠定系统了。
    在压缩感知理论中,一般用下列式子来表示一个欠定系统:
    b = A x \mathbf{b} = \mathbf{A} \mathbf{x} b=Ax
    其中 R M × N , X ∈ R M , b ∈ R N . 且当 M < N 时,系统维欠定系统 . 其中\mathbb{R}^{M \times N}, X \in \mathbb{R}^M, b \in \mathbb{R}^N. 且当M < N时,系统维欠定系统. 其中RM×N,XRM,bRN.且当M<N时,系统维欠定系统.

方程组的数量不足意味着决定解的条件不足。由于条件不足,如果再增加一些条件就可以确定解。
例如,如果预先知道解,通过将其代入,就可以有效地减少N。现在假设已知解,且x的各分量几乎为0。
在这种情况下,可以从方程组中删除值为0的分量。如果将非零项的数量记为K,那么从M个方程实际上就是求解K个非零分量,即使M < N,只要M > K,就可以求解。

这种大部分分量为零或预期为零的性质称为"稀疏性",具有这种性质的解称为"稀疏解"。

1. 欠定系统中的稀疏解

下面的所有截图都在这个日文资料里:https://www-adsys.sys.i.kyoto-u.ac.jp/mohzeki/Presentation/lecturenote20160727.pdf
对于N维的未知向量x,M维的实数值向量b和M × N的观测矩阵A,假设满足以下关系:

这里即使M < N,当x的分量中大部分为零(具有稀疏性)时,如果非零分量的数量K满足M > K,就可以求得解。
然而,这K个非零分量究竟在哪里?这是未知的。那么如何求解呢?
虽然遗憾,但没有决定性的方法,只能从N个分量中选取K个分量,寻找满足y = Ax的解。从N个中选取K个的组合数,随着N的增大会呈指数级增长。对于高维问题,进行这样的计算在现实中是不可行的。而且虽然说是K个非零项,但K这个数字真的已知吗?这也不一定知道。

因此,当这些非零分量的数量也未知时,应该采取什么样的策略来寻找满足b = Ax的解呢?
其实就是用各种正则化L0,L1,L2正则。

  • L0正则:
    在这里插入图片描述
    ∥ x ∥ 0 ,代表非 0 解的个数。越小越稀疏。 \|\mathbf{x}\|_0,代表非0解的个数。越小越稀疏。 x0,代表非0解的个数。越小越稀疏。

  • L1正则:
    在这里插入图片描述
    ∥ x ∥ 1 = ∣ x 1 ∣ + ∣ x 2 ∣ + ⋯ + ∣ x N ∣ , 代表 x 的绝对值总和。 0 越多, ∥ x ∥ 1 越小越稀疏。 \|\mathbf{x}\|_1 = |x_1| + |x_2| + \cdots + |x_N|, 代表x的绝对值总和。0越多,\|\mathbf{x}\|_1越小越稀疏。 x1=x1+x2++xN,代表x的绝对值总和。0越多,x1越小越稀疏。

  • L2正则:
    在这里插入图片描述
    ∥ x ∥ 2 = x 1 2 + x 2 2 + ⋯ + x N 2 \|\mathbf{x}\|_2 = \sqrt{x_1^2 + x_2^2 + \cdots + x_N^2} x2=x12+x22++xN2

2. L1和L2的选择:

在这里插入图片描述
下面的图是一个L1和L2求解的结果,明显L1成功获得了真实解,L2失败。
在这里插入图片描述

三、压缩感知算法(Compressed Sensing)

根据正则的性质,我们已经知道可以获得这样的解选择技术。

  • 这时需要思考的问题是:我们真的需要稀疏解吗?真正的解是稀疏解吗?
    • 前者关注的是变量选择的问题。当我们对方程的真实解不感兴趣,而只是在寻找能满足方程的最少变量组合时,这是一个重要的问题。
    • 至于后者,当我们不是要选择变量而是要寻找真实解时,就需要考虑稀疏解是否合适。对于本质上具有稀疏解的方程问题,有选择性地找出稀疏解会产生巨大的效果。

压缩感知这个框架是利用正则的特性从欠定方程组中获得稀疏解,从而更准确地确定我们想要了解的内容。它就像信息科学中的名侦探。
特别是,通过L1范数最小化来估计原始信息的方法被称为基追踪(Basis Pursuit)。

1. 压缩感知的性质

当观测矩阵A的各分量从均值为0、方差为1的高斯分布生成时,以下列曲线为边界,在α较大且ρ较小的区域内,通过L1正则最小化可以以极高的概率成功恢复原始信号。其中α = M/N,ρ = K/NP,Q(t)是标准正态分布的尾部概率积分。
1 α = 1 + π 2 t e t 2 2 { 1 − 2 Q ( t ) } \frac{1}{\alpha} = 1 + \sqrt{\frac{\pi}{2}}te^{\frac{t^2}{2}}\{1-2Q(t)\} α1=1+2π te2t2{12Q(t)}
ρ 1 − ρ = 2 ( e − t 2 2 t 2 π − Q ( t ) ) \frac{\rho}{1-\rho} = 2\left(\frac{e^{-\frac{t^2}{2}}}{t\sqrt{2\pi}}-Q(t)\right) 1ρρ=2(t2π e2t2Q(t))
Q ( t ) = ∫ t ∞ e − x 2 2 2 π d x Q(t) = \int_t^{\infty}\frac{e^{-\frac{x^2}{2}}}{\sqrt{2\pi}}dx Q(t)=t2π e2x2dx
α = M N , ρ = K N \alpha = \frac{M}{N}, \quad \rho = \frac{K}{N} α=NM,ρ=NK

在这里插入图片描述

上图展示了压缩感知中L1正则最小化重构的可行性边界。让我详细解释一下:

  1. 坐标轴含义
  • 横轴 ρ = K/N:表示稀疏度(信号中非零元素的比例)
  • 纵轴 α = M/N:表示测量数与信号维度的比值(压缩比)
  1. 图中的区域
  • 蓝色区域:这是L1范数最小化能够成功重构原始信号的区域
    • 当(ρ,α)点落在这个区域内时,我们可以以很高的概率通过L1最小化重构出原始信号
    • 特别是在α较大(即测量数较多)且ρ较小(即信号较稀疏)的情况下,重构成功率最高
  1. 分界线
  • 实线曲线:表示L1重构的理论边界
  • 虚线 α = ρ:这条对角线表示测量数等于非零元素个数的情况
  1. 实际意义
  • 这个图帮助我们理解在给定信号稀疏度ρ的情况下,需要多少测量值(由α决定)才能成功重构
  • 在蓝色区域内,压缩感知是有效的,即可以用少量测量重构出原始信号
  • 区域外则表示测量数不足,无法保证信号重构的成功

这个图对于实际应用压缩感知非常有用,它可以帮助我们确定所需的最小测量数,以保证可以成功重构具有特定稀疏度的信号。下面这句话很重要,我说三遍。

  • 压缩感知,重要的不仅仅是选择稀疏解,关键在于不能仅仅是选择"差不多"解,还需要其中包含正确答案。
  • 压缩感知,重要的不仅仅是选择稀疏解,关键在于不能仅仅是选择"差不多"解,还需要其中包含正确答案。
  • 压缩感知,重要的不仅仅是选择稀疏解,关键在于不能仅仅是选择"差不多"解,还需要其中包含正确答案。

2. ISTA算法

ISTA是一个通过L1正则化,迭代求解欠定系统的算法,流程如下(证明自己网上可查):

  1. 令t = 0,初始化x[0]。例如可以设置 x [ 0 ] = A T y x[0] = A^T y x[0]=ATy

  2. 通过平方完成法求解g(x)的二次函数近似的顶点:
    v [ t ] = x [ t ] + ( 1 / L λ ) A T ( y − A x [ t ] ) v[t] = x[t] + (1/Lλ)A^T(y - Ax[t]) v[t]=x[t]+(1/Lλ)AT(yAx[t])

  3. 应用软阈值函数:
    x [ t + 1 ] = S 1 / L ( v [ t ] ) x[t+1] = S_{1/L}(v[t]) x[t+1]=S1/L(v[t])

  4. 重复步骤2-4直到满足终止条件。

四、Python实现

import numpy as np
import matplotlib.pyplot as plt
from openjij import SASampler
from IPython.display import clear_outputdef grad_comp(y, A, x):"""计算梯度Args:y: 观测值向量A: 测量矩阵x: 当前解向量Returns:grad: 梯度向量"""grad = -np.dot(A.T, (y - A.dot(x)))return graddef SoftThr(v, thr):"""软阈值函数实现Args:v: 输入向量thr: 阈值Returns:z: 经过软阈值处理的向量"""z = np.zeros(len(v))# 处理大于阈值的元素itemp = np.where(v > thr)z[itemp] = v[itemp] - thr# 处理小于-阈值的元素itemp = np.where(v <= -thr)z[itemp] = v[itemp] + thrreturn zdef opt_qvec(x, x0, y, A, Tall=10, p=10.0, flag=True):"""使用ADMM算法优化QUBO向量Args:x: 初始解向量x0: 目标解向量y: 观测值向量A: 测量矩阵Tall: 最大迭代次数p: ADMM惩罚参数flag: 是否显示优化过程图像Returns:x: 优化后的解向量"""N = A.shape[0]# 计算A的伪逆相关矩阵Atemp = A.dot(A.T)Ainv = np.linalg.inv(Atemp)Atemp = A.T.dot(Ainv)Nvec = len(x)# ADMM算法的辅助变量z = np.zeros(Nvec)u = np.zeros(Nvec)# ADMM迭代for t in range(Tall):# 更新xx = Atemp.dot(y) + (np.eye(Nvec) - Atemp.dot(A)).dot(z + u)# 更新z(软阈值步骤)z = SoftThr(x - u, 1/p)# 更新对偶变量uu = u + (z - x)# 如果需要,绘制优化过程if flag:clear_output(True)plt.plot(x)plt.plot(x0)plt.show()return xdef Xmat_make(x):"""构造QUBO问题的特征向量Args:x: 输入向量Returns:Xvec: 包含一阶项和二阶项的特征向量"""Ns = len(x)# 向量长度为一阶项数量加上二阶项数量Xvec = np.zeros(Ns + Ns*(Ns-1)//2)# 填充一阶项t = 0for i in range(Ns):Xvec[t] = x[i]t = t + 1# 填充二阶项(交互项)for i in range(Ns):for j in range(Ns):if i < j:Xvec[t] = x[i]*x[j]t = t + 1return Xvecdef ycomp(Xvec, Qvec):"""计算QUBO问题的能量Args:Xvec: 特征向量Qvec: QUBO系数向量Returns:Ene: 能量值"""Ene = np.dot(Xvec, Qvec)return Enedef QUBO_create(Qvec, Ns):"""从向量形式构造QUBO矩阵Args:Qvec: QUBO系数向量Ns: 系统大小Returns:QUBO: QUBO矩阵"""# 计算二阶项数量Noff = (Ns*(Ns-1))//2# 提取对角项(一阶项)和非对角项(二阶项)Qdiag = Qvec[:Ns]Qoff = Qvec[Ns:]# 构造QUBO矩阵QUBO = np.diag(Qdiag)# 填充非对角元素t = 0for i in range(Ns):for j in range(Ns):if i < j:QUBO[i,j] = Qoff[t]t = t + 1return QUBO# 主程序开始# 设置系统大小
Ns = 20# 生成随机的QUBO问题
# 生成对角项
Qdiag = np.random.randn(Ns)
QUBO = np.diag(Qdiag)# 生成稀疏的非对角项
Noff = (Ns*(Ns-1))//2
Qoff = np.random.randn(Noff)
rho = 0.2  # 稀疏度参数
mask = (np.random.rand(Noff) < rho)
Qoff = mask*Qoff# 合并对角项和非对角项
Qvec = np.concatenate((Qdiag,Qoff))# 生成训练数据
M = 100  # 训练样本数
Adata = []  # 特征矩阵
ydata = []  # 能量值# 随机生成训练样本
for d in range(M):# 生成随机二值向量x = (np.random.rand(Ns) > 0.5)x = x.astype(np.int16)# 计算特征向量和对应能量Xvec = Xmat_make(x)Ene = ycomp(Xvec,Qvec)Adata.append(Xvec)ydata.append(Ene)# 将数据转换为numpy数组
y = np.array(ydata)
A = np.array(Adata)# 使用ADMM算法学习QUBO参数
Nvec = Noff + Ns
Qinf = np.zeros(Nvec)
Qinf = opt_qvec(Qinf, Qvec, y, A, Tall=100)# 构造学习到的QUBO矩阵
QUBO = QUBO_create(Qinf, Ns)# 使用量子退火采样器求解QUBO问题
sampler = SASampler()
sampleset = sampler.sample_qubo(QUBO, num_reads=1)# 迭代优化过程
Ns = 20
Ndata = 5  # 初始数据点数
Nall = 195  # 总迭代次数# 初始化数据集
Adata = []
ydata = []for d in range(Ndata):x = (np.random.rand(Ns) > 0.5)x = x.astype(np.int16)Xvec = Xmat_make(x)Ene = ycomp(Xvec,Qvec)Adata.append(Xvec)ydata.append(Ene)# 记录优化过程中的能量
Enelist = []
Eneminlist = []
xlist = []
Qinf = np.dot(A.T,y)# 主优化循环
for d in range(Nall):# 更新QUBO参数y = np.array(ydata)A = np.array(Adata)Qinf = opt_qvec(Qinf, Qvec, y, A, Tall=10, flag=False)QUBO = QUBO_create(Qinf, Ns)# 使用量子退火采样器获得新解sampleset = sampler.sample_qubo(QUBO, num_reads=1)x = sampleset.record[0][0]# 检查是否重复解for xtemp in xlist:if np.array_equal(x,xtemp):x = (np.random.rand(Ns) > 0.5)x = x.astype(np.int16)breakxlist.append(x)# 计算新解的能量Xvec = Xmat_make(x)Ene = ycomp(Xvec,Qvec)Enelist.append(Ene)Enemin = np.min(Enelist)Eneminlist.append(Enemin)# 更新数据集ydata.append(Ene)Adata.append(Xvec)# 绘制优化过程clear_output(True)plt.plot(Enelist)plt.plot(Eneminlist)plt.show()

1. 代码和结果解释

1.1 代码细节

代码其实挺简化,但我们也可以从中看到一些细节:

  • Noff = int((Ns * (Ns - 1)) / 2) 计算了QUBO矩阵中非对角线的个数。
  • mask 的作用是只考虑稀疏的那些Qij。
  • np.random.rand(Ns) 在模拟实验中用于产生随机的01向量。
  • opt_qvec 是关键的函数,里面通过数据拟合Q矩阵,并用此Q矩阵进行退火优化。

1.2 总体思路回顾:

  1. 目标: 使用模拟退火算法(SA)或者量子退火算法(QA)来找到一个QUBO问题的最优解,但QUBO矩阵本身是未知的(“黑盒”)。
  2. 难点: QUBO矩阵是未知的,我们无法直接使用标准的退火方法。
  3. 解决方法: 使用压缩感知算法,逐步猜测和逼近真实的QUBO矩阵,并在这个过程中利用退火算法进行优化。
  4. 关键: 从客户(黑盒)那里获得数据,然后用这些数据来推断Q矩阵。

1.3 压缩感知算法的应用:

使用压缩感知算法的核心体现在opt_qvec函数内部和整个迭代过程中,它的思想是:

  1. 稀疏性假设: 假设QUBO矩阵是稀疏的(即有很多元素为零)。
  2. 数据采集: 通过不断询问(比如做问卷,问专家)黑盒获取数据,可以理解为通过不断迭代模拟退火算法来寻找更好的01向量。
  3. 逐步逼近: 使用采集到的数据,反推(拟合)出一个稀疏的QUBO矩阵。
  4. 更新和迭代: 然后使用这个推导出的Q矩阵进行退火,并继续这个采样拟合的过程,直到找到一个比较好的Q矩阵来推断。

1.4 最后的输出结果解读:
在这里插入图片描述

  • 最终图像部分
    • x轴表示退火优化的迭代步骤,y轴表示能量值。
    • 蓝色曲线:表示模拟退火算法在尝试优化(寻找更低的能量)过程中,每个采样点所对应的能量值
    • 橘色曲线:真实情况的能量值,用来对比模拟退火算法找到的解和真实解之间的差距。
  • 解读
    • 数据与优化协同作用: 这种蓝色线和黄色线的同步下降,生动地展示了压缩感知算法的核心——通过模拟退火(或量子退火)算法的优化搜索,不断引导QUBO矩阵的逼近,同时利用新的01向量的数据,使推导的矩阵越来越精确,最终在黑盒优化问题中找到好的解。
    • 蓝色尖峰出现: 蓝色线的尖峰,通常表示模拟退火算法在搜索过程中,随机尝试到了一个能量比较高的状态。这是退火算法的探索性的一部分,它会尝试从当前的局部最优解“跳出”,看看是否有更低的能量值。这种尖峰通常表示对目前解的否定。

四、总结

这个教程,真的是很直观地讲解了最先进的QUBO建模技术,以少见多。有什么问题,欢迎指正。
下一篇,更深入的讲解ISTA算法的升级版ADMM算法

相关文章:

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…...

JDK高频面试题(包重点)

一、什么是JDK JDK&#xff08;Java Development Kit&#xff09;即 Java 开发工具包&#xff0c;是 Java 编程的基础与核心&#xff0c;由 Sun Microsystems&#xff08;现归属于 Oracle 公司 &#xff09;开发&#xff0c;主要作用如下&#xff1a; 1、提供编译环境 它包含了…...

本地部署 LLaMA-Factory

本地部署 LLaMA-Factory 1. 本地部署 LLaMA-Factory2. 下载模型3. 微调模型3-1. 下载数据集3-2. 配置参数3-3. 启动微调3-4. 模型评估3-5. 模型对话3-6. 导出模型3-7. 使用 vllm 推理 1. 本地部署 LLaMA-Factory 下载代码&#xff0c; git clone https://github.com/hiyouga/…...

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC&#xff08;自动电平控制&#xff09;的前置音频放大器芯片&#xff0c;最初产品为单声道/立体声收录机及盒式录音机而开发&#xff0c;作为录音/回放的磁头放大器使用&#xff1b;由于产品的高增益、低噪声及ALC外部可调的特性&…...

20241227解决使用向日葵远程工具连接ubuntu20.04.5出现黑屏的问题

20241227解决使用向日葵远程工具连接ubuntu20.04.5出现黑屏的问题 2024/12/27 14:40 参考资料&#xff1a; 百度&#xff1a;先日葵 https://sunlogin.oray.com/ 贝锐向日葵 百度&#xff1a;向日葵 连接 ubuntu22.04.5 黑屏 https://blog.csdn.net/catssi/article/details/139…...

Thinkphp 使用workerman消息实现消息推送完整示例

1.版本说明&#xff1a;ThinkPHP6.0 、PHP8.0 2.实现原理 应用场景&#xff0c;监听用户登陆&#xff0c;修改用户登陆状态&#xff0c;通过心跳时间计算用户是否下线&#xff0c;其他应用场景自行修改逻辑即可。 第一步&#xff1a;安装workerman composer require topthin…...

Word论文交叉引用一键上标

Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击&#xff0c;标签为“替换为&#xff1a;”的文本框&#xff0c;注意光标一定要打在图红色方框圈中的文本框中&#xff01; 4.点击格式选择字体 5.勾选上标…...

使用vue3搭建前端模拟增删改查

主要工具 vue3 element-plus axios mockjs 使用mockjs模拟数据 import Mock from "mockjs"; // 内存模拟数据 const arr []; for (let i 0; i < 10; i) {arr.push({id: Mock.mock("id"),name: Mock.mock("cname"),place: Mock.mock("c…...

Stream API 的设计融合了多个经典设计模式

Stream API 的设计融合了多个经典设计模式&#xff1a; 1. 策略模式&#xff08;Strategy Pattern&#xff09; 策略模式定义了一个算法的家族&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。Stream API 中的每个操作&#xff08;如 filter(), map()&#xff…...

京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分&#xff1a; 1. 平台产品能力介绍 2. 业务赋能案例分享 3. 平台建设挑战与展望 作者&#xff1a;梁臣 京东 数据产品架构师 01平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用…...

mysql高频面试题

1. mysql里的索引类型 2. 聚簇索引和非聚簇索引的区别 聚簇索引适合场景: 主键、唯一性要求高的字段。需要对数据进行范围查询时。对数据的读取频繁,并且数据行的插入和删除较少时。非聚簇索引适合场景: 较多的查询条件,或者需要基于某些非主键字段进行查询时。需要创建多个…...

MySQL中Performance Schema库的详解(下)

昨天说了关于SQL语句相关的&#xff0c;今天来说说性能相关的&#xff0c;如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...

算法day_7 算法练习

这是我在2024年12月25日的算法练习&#xff0c;加油&#xff01;(▽) 题目一 &#x1f4aa; 1337. 矩阵中战斗力最弱的 K 行 已解答 | 简单 题目描述 &#x1f4dd; 给你一个大小为 m * n 的矩阵 mat&#xff0c;矩阵由若干军人和平民组成&#xff0c;分别用 1 和 0 表示。…...

一文详解MacOS+CLion——构建libtorch机器学习开发环境

对于希望在本地环境中进行深度学习开发的开发者来说&#xff0c;配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上&#xff0c;利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch&#xff0c;快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…...

CSS系列(39)-- Shapes详解

前端技术探索系列&#xff1a;CSS Shapes详解 ✨ 致读者&#xff1a;探索形状布局的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Shapes&#xff0c;这个强大的形状布局特性。 基础形状 &#x1f680; 圆形与椭圆 /* 基础圆形 */ .circle {widt…...

kafka的备份策略:从备份到恢复

文章目录 一、全量备份二、增量备份三、全量恢复四、增量恢复 前言&#xff1a;Kafka的备份的单元是partition&#xff0c;也就是每个partition都都会有leader partiton和follow partiton。其中leader partition是用来进行和producer进行写交互&#xff0c;follow从leader副本进…...

Android着色器SweepGradient渐变圆环,Kotlin

Android着色器SweepGradient渐变圆环&#xff0c;Kotlin import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.SweepGradient import android…...

SQL 实战:聚合函数高级用法 – 多层分组与动态统计

在数据分析中&#xff0c;聚合函数如 COUNT()、SUM()、AVG()、MAX()、MIN() 等是最常用的工具之一。它们允许我们对大量数据进行汇总和统计。然而&#xff0c;随着业务需求的复杂化&#xff0c;我们常常需要进行更复杂的统计操作&#xff0c;例如多层次的分组统计、动态分组等。…...

从零创建一个 Django 项目

1. 准备环境 在开始之前&#xff0c;确保你的开发环境满足以下要求&#xff1a; 安装了 Python (推荐 3.8 或更高版本)。安装 pip 包管理工具。如果要使用 MySQL 或 PostgreSQL&#xff0c;确保对应的数据库已安装。 创建虚拟环境 在项目目录中创建并激活虚拟环境&#xff…...

Spring Boot 3.4新特性:RestClient和RestTemplate的重大更新详解

本文将深入探讨Spring Boot 3.4版本中关于RestClient和RestTemplate的重要更新。。 1. 背景介绍 在Spring生态系统中&#xff0c;HTTP客户端一直是一个重要的组件。从最早的RestTemplate&#xff0c;到WebClient&#xff0c;再到现在的RestClient&#xff0c;每一次演进都带来…...

ANSYS EMC Plus:谐振腔中的天线

概述 本博客说明了如何使用 EMA3D 和 MHARNESS 模拟工具来模拟腔内天线产生的电场。下面简要概述了完成模拟所需的步骤&#xff0c;视频链接中提供了完整的演示。 步骤1&#xff1a;定义模拟域 准备模拟的第一步是定义模拟域。该域应包含所有需要分析的几何图形。在此演示中…...

lv_ffmpeg学习及播放rtsp

lvgl8.3有ffmpeg支持 FFmpeg support typedef struct {lv_img_t img;lv_timer_t * timer;lv_img_dsc_t imgdsc;bool auto_restart;struct ffmpeg_context_s * ffmpeg_ctx; } lv_ffmpeg_player_t;typedef enum {LV_FFMPEG_PLAYER_CMD_START,LV_FFMPEG_PLAYER_CMD_STOP,LV_FFMP…...

Java前端基础—HTML

Java前端基础—HTML 目录 Java前端基础—HTML1.简介2.基础语法2.1HTML页面固定结构2.2标题标签2.3段落标签2.4换行标签2.5水平线标签2.6文本标签2.7图片标签2.8音频标签2.9视频标签2.10链接标签2.11列表标签2.12表格标签2.13表单标签2.14语义标签 1.简介 1.网页组成&#xff1…...

salesforce 控制 Experience Cloud 站点用户可以看到哪些用户

在 Salesforce 的 Experience Cloud 中&#xff0c;您可以通过多种方式控制站点用户&#xff08;如社区用户&#xff09;之间的可见性。这包括用户之间的信息可见性以及他们可以访问的其他用户数据。以下是几种方法和设置&#xff0c;用于实现对 Experience Cloud 站点用户可见…...

C语言实现尼科彻斯定理

1.题目&#xff1a; 2.分析 【1】怎么输出连续奇数&#xff1a;下面是输出m个连续奇数的代码 #include<stdio.h>int main(){int m,x;scanf("%d",&m);for(int i0;i<m:i){printf("%d",x);xx2;}return 0; } 【2】啥叫尼科彻斯定理&#xff1f;…...

【Ubuntu添加右键wine运行exe程序文件】

【前提】你在Ubuntu中安装了wine 【效果展示】右键在打开方式中显示用wine运行 以bilibli安装包为例&#xff0c;在B站安装包右键选择打开方式 省去了在终端中输入wine命令 【步骤】如何添加右键wine运行exe程序文件 新建一个文本文档 其中填入以下内容 [Desktop Entry]…...

7. Linux网络服务配置全面指南

本章目录&#xff1a; 引言7. 网络服务配置7.1 DNS服务器配置安装BIND配置区域文件创建区域文件测试与重启DNS服务示例图&#xff1a;DNS解析流程 7.2 Web服务器部署&#xff08;Apache/Nginx&#xff09;Apache与Nginx的选择安装Apache示例&#xff1a;部署静态网站安装Nginx配…...

深入探讨 Nginx 性能优化:从基础到高级的最佳实践

目录 引言Nginx 性能优化的意义Nginx 性能优化的主要方向系统层面的优化 4.1 优化操作系统的文件描述符4.2 调整 TCP 参数4.3 使用高效的磁盘 I/O 调度器 Nginx 配置优化 5.1 优化 worker 进程和连接数5.2 使用异步和非阻塞 I/O 模式5.3 配置 Gzip 压缩5.4 开启缓存和缓存控制…...

纯 HTML+CSS+JS 实现一个炫酷的圣诞树动画特效

纯 HTMLCSSJS 实现一个炫酷的圣诞树动画特效 前言 圣诞节快到了&#xff0c;今天给大家带来一个简单但是效果不错的圣诞树动画特效。这个特效完全使用原生 HTML、CSS 和 JavaScript 实现&#xff0c;包含闪烁的星星、随机彩灯等元素&#xff0c;非常适合节日气氛&#xff01;…...

Python使用requests_html库爬取掌阅书籍(附完整源码及使用说明)

教程概述 本教程先是幽络源初步教学分析掌阅书籍的网络结构&#xff0c;最后提供完整的爬取源码与使用说明&#xff0c;并展示结果&#xff0c;切记勿将本教程内容肆意非法使用。 原文链接&#xff1a;Python使用requests_html库爬取掌阅书籍&#xff08;附完整源码及使用说明…...

Linux网络——UDP的运用

Linux网络——UDP的运用 文章目录 Linux网络——UDP的运用一、引入二、服务端实现2.1 创建socket套接字2.2 指定网络接口并bind2.3 接收数据并处理2.4 整体代码2.5 IP的绑定的细节 三、用户端实现3.1 创建套接字3.2 指定网络接口3.3 发生数据并接收3.4 绑定问题 四、代码五、UD…...

axios

文章目录 [TOC](文章目录) 一、axios的基本使用axios请求1、引用axios,并发送请求axios发送请求的简化写法2、接受响应数据&#xff0c;并对响应的数据进行处理 三、axios拦截器&#xff08;instance&#xff09;1、请求拦截2、响应拦截 axios拦截器、vue中的路由守卫、servlet…...

MacOS下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具&#xff0c; 下面介绍MacOS私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业&#xff0c;支持在本地或专属服务器上运行&#xff0c;以实现对数据和系统的完全控制。 1、Mac 服务端安装 Mac安装包下载地址&a…...

vue2/3,Spring Boot以及生产环境跨域解决方案

vue2和vue3跨域解决方案 Vue 2 (基于 Webpack) 的跨域解决方案 1. 创建或编辑 vue.config.js 文件 Vue CLI为Webpack项目提供了简单的代理配置方式。你可以通过创建或编辑项目的根目录下的 vue.config.js 文件来设置开发服务器的代理规则&#xff1a; // vue.config.js mod…...

TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化

相关阅读 TestMAX/DFT Compilerhttps://blog.csdn.net/weixin_45791458/category_12865937.html?spm1001.2014.3001.5482 时序单元的状态 未映射的时序单元(Unmapped Sequential Cell) 在Design Compiler读取了一个RTL设计后&#xff0c;Design Compiler内置的HDL Compiler工…...

Elasticsearch:analyzer(分析器)

一、概述 可用于将字符串字段转换为单独的术语&#xff1a; 添加到倒排索引中&#xff0c;以便文档可搜索。级查询&#xff08;如 生成搜索词的 match查询&#xff09;使用。 分析器分为内置分析器和自定义的分析器&#xff0c;它们都是由若干个字符过滤器&#xff08;chara…...

蓝桥杯——异或森林

问题描述 在一个神秘的世界中&#xff0c;存在着一个称为"异或森林"的地方。异或森林中的每个树木都拥有独特的力量。肖恩进入了这片森林&#xff0c;他得到了一个任务&#xff1a;找出数组中满足条件的连续子数组&#xff0c;使得连续子数组中所有元素异或运算结果…...

第一个C++程序 - Hello World, 编译与运行

引言 编写并运行你的第一个 C 程序是学习这门语言的第一步。通过这个简单的例子&#xff0c;你将了解如何创建、编译和运行一个基本的 C 程序。本文将详细介绍每个步骤&#xff0c;并确保初学者能够顺利上手。 一、编写 "Hello World" 程序 1. 创建源代码文件 首先…...

学习threejs,PerspectiveCamera透视相机和OrthographicCamera正交相机对比

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PerspectiveCamera透…...

测试 - 4 ( 9000 字详解 )

一&#xff1a;性能测试 1.1 什么是性能测试 性能测试和功能测试虽然都在系统测试阶段进行&#xff0c;但两者有本质区别。功能测试主要关注系统“能否完成特定功能”&#xff0c;例如一辆车是否具备四个轮子、方向盘、挡风玻璃&#xff0c;以及是否能够正常行驶。而性能测试…...

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程&#xff0c;分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前&#xff0c;确保服务器已配置好 Docker、MySQL 和 Redis&#xff0c;可参考下列链接进行操作&#xff1…...

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…...

WebGPU入门初识

什么是 WebGPU&#xff1f; WebGPU 是一种现代图形 API&#xff0c;旨在取代 WebGL&#xff0c;提供更高性能和更灵活的 GPU 加速能力。它基于 Vulkan、Metal 和 Direct3D 12&#xff0c;为 Web 开发者带来了类似于原生图形 API 的性能和控制力。 与 WebGL 不同&#xff0c;Web…...

Go语言基础语法

文章目录 Go语言基础语法一、引言二、基础语法1、变量声明与作用域1.1、全局变量1.2、局部变量1.3、块作用域 2、基本数据类型3、控制流程3.1、条件语句3.2、循环语句 4、函数5、并发编程 三、使用示例四、并发编程示例五、变量作用域详解六、总结 Go语言基础语法 一、引言 G…...

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肝细胞癌&#xff08;hepatocellular carcinoma&#xff0c;HCC&#xff09;早期复发仍然是一个具有挑战性的领域&#xff0c;其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…...

layui动态拼接生成下拉框验证必填项失效问题

利用 jQuery 动态拼接下拉框时&#xff0c;lay-verify"required" 失效了&#xff0c;有以下几种原因。 1. <form></form>标签 加入 layui 类&#xff0c;class"layui-form" 。提交按钮上加自动提交&#xff0c;lay-submit ""; 。需…...

Speckly:基于Speckle文档的RAG智能问答机器人

前言 Speckly 是一个基于 检索增强生成 (RAG) 技术的智能问答机器人&#xff0c;它能像一位经验丰富的工程师&#xff0c;理解你的问题&#xff0c;并从 Speckle 文档中精准地找到答案。更厉害的是&#xff0c;它甚至可以帮你生成代码片段&#xff01;&#x1f680; 本文将详…...

NodeRed使用心得,实现增删改查等

使用场景介绍 在VUE中使用nodeRed实现对节点的 增删改查等功能&#xff0c;且储存成功之后下点击时启动对应流程 安装与配置 1.安装NodeRed npm install -g --unsafe-perm node-red 安装完成后&#xff0c;你可以通过运行以下命令来启动Node-RED node-red-start2. 配置文件 N…...

万物皆有解法(序)

万物皆有解法&#xff08;序&#xff09; 《万物有解》一&#xff1a;解的存在 解&#xff1a;可做解释解答&#xff0c;此文引申为原因。可做解除、解围&#xff0c;此文引申为解法、方法。 先有事物存于世-what&#xff0c;再有原因为何存-why&#xff0c;再有解法如何除去…...

OpenCV相机标定与3D重建(37)计算两幅图像之间单应性矩阵(Homography Matrix)的函数findHomography()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到两个平面之间的透视变换。 cv::findHomography 是 OpenCV 库中用于计算两幅图像之间单应性矩阵&#xff08;Homography Matrix&#xff09;的…...