案例解析:基于量子计算的分子对接-QDOCK(Quantum Docking)
分子对接(Moleculardocking)在药物发现中具有重要意义,但对接的计算速度和准确率始终难以平衡,其巨大解搜索空间对传统计算机来说异常艰巨。
本文通过引入网格点匹配(GPM, Grind point matching)和特征原子匹配(FAM, Feature atom matching)两种方法,将分子对接问题中的采样过程编码为二次无约束二进制优化(QUBO)问题来加速分子对接,使其能够通过量子计算机(如相干伊辛机CIM)进行求解。结果表明,GPM的采样能力接近Glide SP(一种进行广泛搜索的方法),并且据估计,同等问题的求解在CIM硬件上要比在传统计算机上快至少1000倍。该方法有望在未来加速小分子和多肽的药物虚拟筛选。
图1 基于光量子计算机的分子对接示意图
一、背景介绍
分子对接是一种广泛应用于虚拟筛选、先导化合物优化和机制研究的计算技术,其核心是通过优化配体与蛋白质的结合姿态和自由能 ( Δ G B i n d ) (\Delta G_{Bind}) (ΔGBind)确定结合模式。
然而,该问题的NP-hard特性导致精确求解需枚举大量构象,现有方法(如模拟退火、分步枚举、深度学习模型和GPU并行计算)仍难以应对十亿级数据库(如ZINC)的筛选需求。量子计算机(如量子退火器和CIM)为解决NP-hard问题提供了新途径,其通过将问题映射为QUBO模型并利用量子比特的相互作用实现高效求解。
二、建模思路
2.1 问题表述
分子对接的采样过程是寻找到一个配体分子和靶蛋白结合的具体构象,用数学形式可表示成以下模型:假设一个配体由 n n n个原子组成 ( a 1 , a 2 , a 3 , … , a n ) (a_1,a_2,a_3,\dots,a_n) (a1,a2,a3,…,an),第 i i i个原子 a i a_i ai的坐标表示为 r i r_i ri,则一个分子对接任务就是最小化以下目标函数:
Δ G Bind ( a 1 , a 2 , … , a n , r 1 , r 2 , … , r n ) r i ∈ D \Delta G_{\text{Bind}}(a_1, a_2, \dots, a_n, \mathbf{r}_1, \mathbf{r}_2, \dots, \mathbf{r}_n) \mathbf{r}_i \in \mathbf{D} ΔGBind(a1,a2,…,an,r1,r2,…,rn)ri∈D D D D代表对接定义的docking box限定的对接空间,以上这个公式也被称为“能量函数”。
2.2 QUBO建模
2.1中描述的模型是一个经典的优化问题,对于传统的优化算法难以在短时间内得到一个较优的解,本文中提出一种建模思路,首先将 D D D等距离散化成 N N N个格点 ( g 1 , g 2 , g 3 , … , g n ) (g_1,g_2,g_3,\dots,g_n) (g1,g2,g3,…,gn),如果原子 a i a_i ai匹配到格点 g s i g_{s_i} gsi上, a i a_i ai和 a j a_j aj的距离是 d i j d_{ij} dij, g s i g_{s_i} gsi和 g s j g_{s_j} gsj的距离是 D s i s j D_{s_is_j} Dsisj,此时上面的函数可以表示为:
Δ G Bind ( a 1 , a 2 , … , a n , r 1 , r 2 , … , r n ) ≈ Δ G Bind ′ ( a 1 , a 2 , … , a n , g s 1 , g s 2 , … , g s n ) = ∑ i = 1 n w a i g s i s i = 1 , 2 , … , N s . t . ∣ d i j − D s i s j ∣ ≤ c dist \begin{aligned} &\Delta G_{\text{Bind}}(a_1, a_2, \dots, a_n, \mathbf{r}_1, \mathbf{r}_2, \dots, \mathbf{r}_n) \approx \Delta G'_{\text{Bind}} \\ &(a_1, a_2, \dots, a_n, g_{s_1}, g_{s_2}, \dots, g_{s_n}) = \sum_{i=1}^{n} w_{a_i g_{s_i}} \\ &s_i = 1, 2, \dots, N \quad s.t. \ |d_{ij} - D_{s_i s_j}| \leq c_{\text{dist}} \end{aligned} ΔGBind(a1,a2,…,an,r1,r2,…,rn)≈ΔGBind′(a1,a2,…,an,gs1,gs2,…,gsn)=i=1∑nwaigsisi=1,2,…,Ns.t. ∣dij−Dsisj∣≤cdist 这里的 w a i g s i w_{a_i g_{s_i}} waigsi就是原子 a i a_i ai放在格点 g s i g_{s_i} gsi上的合适度(fitness),后面会介绍合适度怎么计算的,可以把这一项看成是 Δ G B i n d \Delta G_{Bind} ΔGBind的分子间的约束项。此外,还需要增加一些约束项,即在优化过程中须保持分子本身的结构,即分子内的约束项。
此时上面的式子就可以转化成QUBO模型, x i j x_{ij} xij是一组二值变量,代表了 a i a_i ai和 g j g_j gj是否匹配(0代表不匹配,1代表匹配),所以上面的式子就可以写成二次项形式,其中 c d i s t c_{dist} cdist为距离阈值,用于添加空间几何约束:
Δ G Bind ′ ( a 1 , a 2 , … , a n , g s 1 , g s 2 , … , g s n ) = Δ G Bind ′ ( a 1 , a 2 , … , a n , g 1 , g 2 , … , g N , x 11 , x 12 , … , x n N ) = ∑ i = 1 n ∑ j = 1 N w a i g j x i j 2 x i j = { 1 , a i matches g j 0 , a i does not match g j s . t . ∣ d i k − D j l ∣ ≤ c dist and ∑ i = 1 n x i j ≤ 1 \begin{aligned} &\Delta G'_{\text{Bind}}(a_1, a_2, \dots, a_n, g_{s_1}, g_{s_2}, \dots, g_{s_n}) \\ &= \Delta G'_{\text{Bind}}(a_1, a_2, \dots, a_n, g_1, g_2, \dots, g_N, x_{11}, x_{12}, \dots, x_{nN}) \\ &= \sum_{i=1}^{n}\sum_{j=1}^{N} w_{a_i g_j} x_{ij}^2 \\ &x_{ij} = \begin{cases} 1, & a_i \text{ matches } g_j \\ 0, & a_i \text{ does not match } g_j \end{cases} \\ &s.t. \ |d_{ik} - D_{jl}| \leq c_{\text{dist}} \text{ and } \sum_{i=1}^{n} x_{ij} \leq 1 \end{aligned} ΔGBind′(a1,a2,…,an,gs1,gs2,…,gsn)=ΔGBind′(a1,a2,…,an,g1,g2,…,gN,x11,x12,…,xnN)=i=1∑nj=1∑Nwaigjxij2xij={1,0,ai matches gjai does not match gjs.t. ∣dik−Djl∣≤cdist and i=1∑nxij≤1
加入惩罚项
但是,在优化上面这个式子时,有两点约束条件要考虑:一是保持配体形状;二是一个格点只能匹配一个原子。因此,可以将约束也写成二次多项式形式,二者的惩罚项系数分别记为 K d i s t K_{dist} Kdist(保持配体形状)和 K m o n o K_{mono} Kmono(原子和格点的一一对应),如下所示:
Δ G Bind ′ ′ ( a 1 , a 2 , … , a n , g 1 , g 2 , … , g N , x 11 , x 12 , … , x n N ) = ∑ i = 1 n ∑ j = 1 N w a i g j x i j 2 + K dist ∑ i = 1 n ∑ j = 1 N ∑ k = 1 n ∑ l = j + 1 N u i j k l x i j x k l + K mono ∑ i = 1 n ∑ j = 1 N ∑ k = 1 n ∑ l = j + 1 N v i j k l x i j x k l = ( x 11 x 12 … x n N ) T ( w a 1 g 1 K dist u 1112 + K mono v 1112 ⋯ K dist u 11 n N + K mono v 11 n N 0 w a 1 g 2 ⋯ K dist u 12 n N + K mono v 12 n N ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ w a n g N ) ( x 11 x 12 … x n N ) u i j k l = { 1 , ∣ d i k − D j l ∣ > c dist 0 , ∣ d i k − D j l ∣ > c dist v i j k l = { 1 , j = l and i ≠ k 0 , otherwise x i j = { 1 , a i matches g j 0 , a i does not match g j \begin{aligned} &\Delta G''_{\text{Bind}}(a_1, a_2, \dots, a_n, g_1, g_2, \dots, g_N, x_{11}, x_{12}, \dots, x_{nN}) \\ &= \sum_{i=1}^{n}\sum_{j=1}^{N} w_{a_i g_j} x_{ij}^2 + K_{\text{dist}} \sum_{i=1}^{n}\sum_{j=1}^{N}\sum_{k=1}^{n}\sum_{l=j + 1}^{N} u_{ijkl}x_{ij}x_{kl} \\ & \quad + K_{\text{mono}} \sum_{i=1}^{n}\sum_{j=1}^{N}\sum_{k=1}^{n}\sum_{l=j + 1}^{N} v_{ijkl}x_{ij}x_{kl} \\ &= \begin{pmatrix} x_{11} \\ x_{12} \\ \dots \\ x_{nN} \end{pmatrix}^T \begin{pmatrix} w_{a_1g_1} & K_{\text{dist}}u_{1112} + K_{\text{mono}}v_{1112} & \cdots & K_{\text{dist}}u_{11nN} + K_{\text{mono}}v_{11nN} \\ 0 & w_{a_1g_2} & \cdots & K_{\text{dist}}u_{12nN} + K_{\text{mono}}v_{12nN} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & w_{a_ng_N} \end{pmatrix} \begin{pmatrix} x_{11} \\ x_{12} \\ \dots \\ x_{nN} \end{pmatrix} \\ &u_{ijkl} = \begin{cases} 1, & |d_{ik} - D_{jl}| > c_{\text{dist}} \\ 0, & |d_{ik} - D_{jl}| > c_{\text{dist}} \end{cases} \quad v_{ijkl} = \begin{cases} 1, & j = l \text{ and } i \neq k \\ 0, & \text{otherwise} \end{cases} \\ &x_{ij} = \begin{cases} 1, & a_i \text{ matches } g_j \\ 0, & a_i \text{ does not match } g_j \end{cases} \end{aligned} ΔGBind′′(a1,a2,…,an,g1,g2,…,gN,x11,x12,…,xnN)=i=1∑nj=1∑Nwaigjxij2+Kdisti=1∑nj=1∑Nk=1∑nl=j+1∑Nuijklxijxkl+Kmonoi=1∑nj=1∑Nk=1∑nl=j+1∑Nvijklxijxkl= x11x12…xnN T wa1g10⋮0Kdistu1112+Kmonov1112wa1g2⋮0⋯⋯⋱⋯Kdistu11nN+Kmonov11nNKdistu12nN+Kmonov12nN⋮wangN x11x12…xnN uijkl={1,0,∣dik−Djl∣>cdist∣dik−Djl∣>cdistvijkl={1,0,j=l and i=kotherwisexij={1,0,ai matches gjai does not match gj 接下来,就可以使用量子算法对这个QUBO model进行求解,这样就可以得到在约束条件下,使得能量最低状态的原子与网格匹配的状态,即QUBO模型的解,该解可用于得到最终的采样构象。
2.3 获得配体的对接构象(docking pose)
得到原子在网格中的位置后,就可以计算RMSD (Root Mean Square Deviation),在这里只考虑刚性对接的情况,计算Kabsch RMSD旋转矩阵:
K rot = arg min K [ K ( r 1 st r 2 st … r n st ) + b − ( R s 1 R s 2 … R s n ) ] , where b = ∑ i = 1 n R s i n − ∑ i = 1 n R i st n \begin{aligned} K_{\text{rot}} &= \arg \min_{K} \left[ K \begin{pmatrix} \mathbf{r}_1^{\text{st}} \\ \mathbf{r}_2^{\text{st}} \\ \dots \\ \mathbf{r}_n^{\text{st}} \end{pmatrix} + \mathbf{b} - \begin{pmatrix} \mathbf{R}_{s_1} \\ \mathbf{R}_{s_2} \\ \dots \\ \mathbf{R}_{s_n} \end{pmatrix} \right], \text{ where } \mathbf{b} \\ &= \frac{\sum_{i=1}^{n} \mathbf{R}_{s_i}}{n} - \frac{\sum_{i=1}^{n} \mathbf{R}_{i}^{\text{st}}}{n} \end{aligned} Krot=argKmin K r1str2st…rnst +b− Rs1Rs2…Rsn , where b=n∑i=1nRsi−n∑i=1nRist 最终的对接姿态可以通过如下公式计算(这一过程可以通过Prody Python包实现):
( r 1 dock r 2 dock ⋯ r n dock ) = K rot ( r 1 st r 2 st ⋯ r n st ) + b \begin{pmatrix} \mathbf{r}_1^{\text{dock}} \\ \mathbf{r}_2^{\text{dock}} \\ \cdots \\ \mathbf{r}_n^{\text{dock}} \end{pmatrix} = K_{\text{rot}} \begin{pmatrix} \mathbf{r}_1^{\text{st}} \\ \mathbf{r}_2^{\text{st}} \\ \cdots \\ \mathbf{r}_n^{\text{st}} \end{pmatrix} + \mathbf{b} r1dockr2dock⋯rndock =Krot r1str2st⋯rnst +b
2.4 适配度 w w w的计算
为了刻画 w w w(即原子在网格点中适配度),本文引入了两种编码策略:网格点匹配(Grid Point Matching,GPM) 和 特征原子匹配(Feature Atom Matching,FAM)。这两种方法的核心思想是通过不同的方式定义配体原子 a i a_i ai与空间位置(网格点或特征原子) g j g_j gj之间的相互作用强度 w a i g j w_{a_ig_j} waigj。以下是这两种方法的具体描述:
网格点匹配(Grid Point Matching,GPM)
在GPM方法中,网格点直接在预定义的对接盒 D D D中以 2 A ˚ 2Å 2A˚的间隔生成。配体原子 a i a_i ai与网格点 g j g_j gj之间的相互作用强度 w a i g j w_{a_ig_j} waigj被定义为当原子类型 a i a_i ai放置在网格点 g j g_j gj上时的范德华力(van der Waals energy)。具体步骤如下:
- 生成网格点:在对接盒 D D D中以 2 A ˚ 2Å 2A˚的间隔生成网格点;
- 计算范德华力:使用AutoDockFR中的AutoGrid工具预计算每个网格点 g j g_j gj上的范德华力,并将其保存在每个网格点上;
- 定义 w a i g j w_{a_ig_j} waigj:对于每个配体原子 a i a_i ai和网格点 g j g_j gj, w a i g j w_{a_ig_j} waigj被定义为当原子 a i a_i ai放置在网格点 g j g_j gj上时的范德华力。
虽然AutoDockFR的打分函数中还包括静电和溶剂化项,但在GPM方法中,这些项被忽略,因为它们在离散空间中可能导致误差累积,从而影响性能。
特征原子匹配(Feature Atom Matching,FAM)
在FAM方法中,网格点首先在预定义的对接盒 D D D中以 1 A ˚ 1Å 1A˚的间隔生成,然后通过AutoSite算法将这些网格点粗粒化为3种类型的“特征原子”(Feature Atoms,FAs)。这三种特征原子分别是:
- 中性的碳原子(neutral C)
- 氢键供体氢原子(H-bond-donor H)
- 氢键受体氧原子(H-bond-acceptor O)
配体原子 a i a_i ai与特征原子 g j g_j gj之间的相互作用强度 w a i g j w_{a_ig_j} waigj被定义为配体原子和特征原子的电负性(Pauling’s electronegativity)之间的差异,具体公式为: w a i g j = ∣ χ a i − χ g j ∣ − 0.5 w_{a_ig_j} = |\chi_{a_i} - \chi_{g_j}| - 0.5 waigj=∣χai−χgj∣−0.5
。其中, χ a i \chi_{a_i} χai和 χ g j \chi_{g_j} χgj分别是配体原子 a i a_i ai和特征原子 g j g_j gj的电负性,这种定义方式反映了配体原子与特征原子之间形成氢键的倾向。
2.5 经典计算机的构象打分
之前已经提到,GPM和FAM的打分函数( Δ G Bind ′ \Delta G'_{\text{Bind}} ΔGBind′)是对 Δ G Bind \Delta G_{\text{Bind}} ΔGBind的粗略估计。实际上,本文发现【惩罚项节中的方程】在构象排序方面表现不佳。因此,本文将基于量子计算机的分子对接分为构象采样和打分两步,构象采样用于采样对接构象的可能状态,而后续的打分则用于对这些构象进行排序。相比之下,构象采样是NP-hard的,而构象打分则不是,而且它只需要一个粗略的打分函数。因此,在本文提出的的工作流程中,GPM和FAM用于构象采样,而构象打分可以留给经典计算机完成。
文章整体的思路可以由下图概括:
图2 基于QUBO的分子对接算法框架示意图
三、求解结果
3.1 采样性能比较
本文在CASF-2016数据集上评估了不同采样方法得到的构象与真实构象之间的最小差异(mRMSD, minimum RMSD),结果如下:
图3 GPM和FAM在CASF-2016上的采样表现
- GPM: 在257个测试案例中,GPM能够在225个案例(87.5%)中采样到高质量的对接构象(最小均方根距离mRMSD < 2 Å),平均mRMSD为1.1 Å,最大mRMSD约为5 Å。这表明GPM具有较强的采样能力,能够有效地找到接近真实晶体结构的对接构象;
- FAM: 在相同的测试案例中,FAM在173个案例(67.3%)中采样到高质量的对接构象,平均mRMSD为1.8 Å,最大mRMSD为9.4 Å。虽然FAM的性能略逊于GPM,但仍然显示出一定的有效性;
- Glide SP(benchmark): 作为一种广泛使用的对接软件,Glide SP在CASF-2016数据集的240个案例(93.4%)中能够采样到高质量的对接构象,平均mRMSD为1.0 Å,最大mRMSD为6.8 Å。GPM的性能与Glide SP接近,表明GPM在采样能力上具有竞争力。
3.2 影响采样性能的因素
图4 GPM和FAM的采样影响因素分析
本文对可能影响采样性能的因素进行了研究,比较了如下几种因素:
- 配体质量: 采样中的mRMSD与配体质量几乎没有相关性(GPM的R² = 0.001,FAM的R² = 0.009),说明这两种方法不受配体大小的显著影响;
- 量子比特数量: mRMSD与量子比特数量的相关性也很低(GPM的R² = 0.014,FAM的R² = 0.006),表明这两种方法在量子计算资源上的效率较高;
- 离散化误差: mRMSD与离散化误差具有良好的线性关系(GPM的R² = 0.938,FAM的R² = 0.916),且回归系数接近1。这表明对接盒的离散化程度是影响采样性能的主要因素。
3.3 计算成本分析
图6 GPM和FAM所需比特数分析
- 量子比特需求: GPM在CASF数据集上最大的量子比特需求为13,908,而FAM为3,640。这比当前实验CIM的最大量子比特数(约10万个)小1-2个数量级,为未来开发更复杂的对接方法提供了空间;
- 运行时间: 基于CIM的计算优势,采样时间估计为毫秒级,比经典计算机快3个数量级;
- 问题规模分析: GPM和FAM适用于小分子和肽的对接,因为它们的量子比特需求与配体原子数量呈二次关系,限制了输入配体原子的数量约为156(GPM)和305(FAM),分别对应于15和30个残基的肽。由于量子比特数量的限制,这两种方法目前不适用于蛋白质-蛋白质对接。
四、总结
大规模的组合优化问题求解对于传统计算硬件提出了不小的挑战,很多从算法层优化尝试在这类复杂问题上寻求一个兼顾速度和求解质量的方法。计算机辅助药物设计涉及大量的组合优化场景,在上述瓶颈下,很多问题难以在短时间内得到一个高质量的解,这种欠优的策略在药物发现领域往往失之毫厘,差之千里,造成了药物发现中先导化合物筛选假阳性率较高的境地,因此开发又快又好的计算方法是目前该领域的研究热点。
近期,量子计算硬件的发展使得在解决这类复杂问题上提出了新的解决思路,通过借助量子计算强大的并行处理能力,可全局搜所解空间,而得到能量最低的状态组合。该工作通过将分子对接过程的采样问题编码成QUBO model,可以适配光量子计算机进行求解,为分子筛选提供了全新的解决思路。
参考材料
- Zha J, Su J, Li T, et al. Encoding molecular docking for quantum computers[J]. Journal of Chemical Theory and Computation, 2023, 19(24): 9018-9024.
- 本项目中的代码目前已开源,可参考:GitHub - JinyinZha/QDock: QDock is a method encoding pose sampling in molecular docking for quantum computers
- 目前该开源代码中使用的求解工具为pyqubo,neal 包,可使用玻色量子开发的kaiwu SDK量子开发套件进行替换,请见项目文档
- 欢迎关注开物量子开发者社区,定期发布最新文章
相关文章:
案例解析:基于量子计算的分子对接-QDOCK(Quantum Docking)
分子对接(Moleculardocking)在药物发现中具有重要意义,但对接的计算速度和准确率始终难以平衡,其巨大解搜索空间对传统计算机来说异常艰巨。 本文通过引入网格点匹配(GPM, Grind point matching)和特征原子…...
人工智能和机器学习在包装仿真中的应用与价值
引言 随着包装成为消费品关键的差异化因素,对智能设计、可持续性和高性能的要求比以往任何时候都更高 。为了满足这些复杂的期望,公司越来越多地采用先进的仿真方法,而现在人工智能 (AI) 和机器学习 (ML) 又极大地增强了这些方法 。本文探讨…...
系统的环境变量
目录 基本概念 用途之一 环境变量表 命令行参数表 理解 更多的环境变量 基本概念 环境变量(environmentvariables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性 用途之一 我们看…...
css3伸缩盒模型第一章(主轴以及伸缩盒模型)
css3伸缩盒模型第一章(主轴) 一、伸缩盒模型简介 2009 年, W3C 提出了一种新的盒子模型 —— Flexible Box (伸缩盒模型,又称:弹性盒 子)。它可以轻松的控制:元素分布方式、元素对齐方式、元素视觉顺序 ……...
【MySQL】(9) 视图
一、什么是视图 视图是一张虚拟表,是表、其它视图的查询结果集。它本身不像基础表(物理表)一样存储数据,而是将 SQL 查询语句包装起来,通过执行查询语句动态生成数据。 二、视图的作用 当我们需要频繁使用一条查询语句…...
day10 python机器学习全流程实践
在机器学习的实践中,数据预处理与模型构建是极为关键的环节。本文将回顾数据预处理的全流程,并基于处理后的数据完成简单的机器学习建模与评估,暂不涉及复杂的调参过程。 一、预处理流程回顾 机器学习的成功,很大程度上依赖于高…...
Rust Ubuntu下编译生成环境win程序踩坑指南
前言: 1,公司要给一线搞一个升级程序,需要在win下跑。 之前都是找开发总监帮忙,但是他最近比较忙。就让我自己搞。有了下文.。说来惭愧,之前写过一篇ubuntu下编译windows的文章。里面的demo就一句话 fuck world。依赖…...
2025年- H12-Lc119-56.合并区间(普通数组)---java版
1.题目描述 2.思路 思路参考了代码随想录: 按照左边界从小到大排序之后,如果 intervals[i][0] < intervals[i - 1][1] 即intervals[i]的左边界 < intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴ÿ…...
合并两个有序链表
题目:21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入&#x…...
rsync命令详解与实用案例
rsync命令详解与实用案例 rsync是一款功能强大的Linux文件同步工具,通过高效的增量传输算法,能够显著减少数据传输量和时间,是备份、镜像和跨平台文件同步的理想选择。其核心价值在于只传输文件的差异部分,而非全量复制ÿ…...
gitee 如何修改提交代码的邮箱
gitee 如何修改提交代码的邮箱 1. 修改全局提交邮箱2. 修改特定仓库的提交邮箱3. 修改已提交记录的邮箱 4. 可能遇到的问题git filter-repo 拒绝执行解决办法方法一:使用 --force 参数 (亲测有效)方法二:创建一个全新的克隆仓库 注…...
MATLAB画一把伞
% 伞的参数num_ribs 5; % 伞骨数量修改为5R 1; % 伞的半径height 0.5; % 伞的高度handle_length 2; % 伞柄长度semicircle_radius 0.26; % 伞柄末端半圆的半径% 生成伞叶网格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…...
vue 实现文件流下载功能 前端实现文件流下载
首先场景就是,一般的文件下载是通过后端返回的文件地址下载文件,但当后端返回的是文件流的时候,下载要做特殊处理 案例截图: 下载成功: 代码处理,首先就是要在接口封装的地方加上 在 Vue 前端开发中实现文件流下载与普通文件下载的核心区别在于 数据处理方式。文件流…...
[Android]导航栏中插入电源菜单
1. 新增 frameworks/base/packages/SystemUI/res/layout/power.xml <?xml version"1.0" encoding"utf-8"?> <com.android.systemui.navigationbar.buttons.KeyButtonView xmlns:android"http://schemas.android.com/apk/res/android"…...
VSCode Verilog环境搭建
VSCode Verilog环境搭建 下载Iverilog安装Iverilog验证安装VS Code安装插件 下载Iverilog 官网下载Iverilog 安装Iverilog 一定要勾选这两项 建议勾选这两项 验证安装 运行Windows PowerShell输入命令:iverilog输入命令:Get-Command gtkwave …...
Hadoop 和 Spark 生态系统中的核心组件
通过jps命令,可以看到如下进程名,请解释一下它们各自是哪个命令产生的,有什么作用?一、Worker 1.来源:Spark 集群的 工作节点(Worker Node),由 start-worker.sh 启动 2.作用&#…...
MySQL多表操作
熟能生巧,全部代码在最后!!! 一、多表关系 一对一关系、一对多关系、多对多关系 注意多对多关系必须有中间表进行关联 多对多的关系就相当于是两个一对多关系 二、创建外键约束 专门用于多表操作的一种约束方式 控制的那个表…...
WPF TextBlock控件性能优化指南
WPF TextBlock控件性能优化指南 1. 引言 TextBlock作为WPF中最基础且使用最广泛的文本显示控件,其性能优化对整个应用程序的响应速度和资源占用有着重要影响。尽管TextBlock是一个轻量级控件,但在大型应用或需要显示大量文本的场景中,不恰当…...
DotNet 入门:(一) 环境安装
一、前言 本想用 Go 语言实现一个通过小爱同学操作电脑的,比如我对着手机说打开音乐,或调小音乐,电脑能做相应的处理。奈何我一时间没看懂,就想着用.Net 来试一下,于是就有了下面这篇文章。 二、安装.Net 环境 1. 下…...
初识Redis · 分布式锁
目录 前言: 分布式锁 setnx lua脚本和看门狗 redlock算法 Redlock 的加锁流程(5 步) 前言: 到了分布式锁这一章之后,我们首先能联想到的问题就是线程安全的问题,线程安全指的是多个线程在并发执行的…...
使用 OpenCV 实现图像中心旋转
在图像处理中,围绕中心点旋转图像是一个常见的需求。无论是为了数据增强、视觉效果,还是图像对齐,旋转图像都是一项基础且重要的操作。本文将详细介绍如何使用 OpenCV 实现围绕图像中心旋转的功能,并深入探讨其背后的数学原理。 一…...
云钥科技红外短波工业相机
云钥科技的红外短波相机是一款基于短波红外(SWIR,波长范围约1-3微米)技术的成像设备,专为高精度检测、全天候成像及特殊场景应用设计。以下从核心技术、性能参数、应用场景及产品优势等方面进行详细介绍: 一、核心…...
npm如何安装pnpm
在 npm 中安装 pnpm 非常简单,你可以通过以下步骤完成: 1. 使用 npm 全局安装 pnpm 打开终端(命令行工具),运行以下命令: npm install -g pnpm2. 验证安装 安装完成后,可以检查 pnpm 的版本以确保安装成功: pnpm --version如果正确显示版本号(如 8.x.x),说明安…...
GTC Taipei 2025 医疗域前瞻:从AI代理到主权生态,解码医疗健康与生命科学的未来图景
引言 2025年,全球医疗健康领域正经历一场由人工智能、机器人技术与分布式计算驱动的范式转移。随着NVIDIA及其生态伙伴在GTC Taipei 2025大会上的深度布局,医疗行业的核心趋势愈发清晰:AI代理程序(Digital AI Agents)赋能临床协作、医疗大数据与精准医学加速落地、医学影…...
【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要
针对推理模型,主要讲了四种方法,两种不需要训练模型,两种需要。 对于reason和inference,这两个词有不同的含义! 推理时计算不是新鲜事,AlphaGo就是如此。 这张图片说明了将训练和推理时计算综合考虑的关系&…...
npm打包内存不足- JavaScript heap out of memory
直接贴出报错信息 <--- Last few GCs --->[30904:0000010F60FE58E0] 22090 ms: Scavenge 2037.4 (2069.4) -> 2036.4 (2074.2) MB, 2.5 / 0.0 ms (average mu 0.228, current mu 0.216) allocation failure [30904:0000010F60FE58E0] 22101 ms: Scavenge 2…...
【最新 MCP 战神手册 08】工具使用详解:实现 AI 行动
文章目录 1. 开始啦!2. 第一部分:设计高效且安全的工具3. 第二部分:定义工具蓝图——参数、输出与约束条件4. 第三部分:弥合差距:LLM 兼容性(函数调用)5. 第四部分:实施与测试的最佳实践1. 开始啦! 在前几章中,我们将工具介绍为 AI 模型在 MCP 客户端引导下向 MCP 服…...
开发iOS App时,我常用的一款性能监控小工具分享
开发iOS App时,我常用的一款性能监控小工具分享 最近在做一个iOS应用的性能优化,频繁遇到内存泄露、界面卡顿和网络请求超时的问题。平时用Xcode Instruments虽然专业,但流程繁琐,临时排查问题不够灵活。 于是开始找有没有轻量一…...
如何防止 ES 被 Linux OOM Killer 杀掉
当 Linux 系统内存不足时,内核会找出一个进程 kill 掉它释放内存,旨在保障整个系统不至于崩溃。如果 ES 按照最佳实践去实施部署,会保留一半的内存,不至于发生此类事情。但事情总有例外,有的朋友可能 ES 和其他的程序部…...
Windows权限与icacls命令详解
在Windows操作系统中,权限管理是确保系统安全和资源访问控制的核心机制。特别是在使用NTFS(New Technology File System)文件系统的环境中,访问控制列表(ACL)用于定义哪些用户或组可以对文件、文件夹或其他…...
5.4.2 MVVM例2-用户控件的使用(水在水管中流动的实例)
本文以一个例子介绍用户控件的使用(UserControl),下图所示: 一、主要技术点 1.MainViewModel使用CommunityToolkit.Mvvm 这个Nuget包 2.LinearGradientBrush使用,下面代码可以产生如下的效果 <LinearGradientBrush x:Key="HorizontalBackground" …...
PHP代码-服务器下载文件页面编写
内部环境的服务资源下载页面有访问需求,给开发和产品人员编写一个简洁的下载页面提供资源下载。直接用nginxphp的形式去编写了,这里提供展示index.php文件代码如下: <?php // 配置常量 define(BASE_DIR, __DIR__); // 当前脚本所在目录作…...
51单片机快速入门之 SPI通信 2025年4月29日09:26:32
SPI通信 : SPI(Serial Peripheral Interface)通信是一种同步串行数据传输协议,主要用于嵌入式系统内部设备之间的通信。它由Motorola公司在2000年提出,广泛应用于微控制器、传感器、存储设备等之间的数据传输。 SPI通信的主要特点…...
SpringMVC再复习1
一、三层架构 表现层(WEB 层) 定义 :是应用程序与客户端进行交互的最外层,主要负责接收用户的请求,并将处理结果显示给用户。 作用 :在 Spring MVC 中,表现层通常采用 MVC 设计模式来构建。 技…...
音视频之H.265/HEVC网络适配层
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
01_微服务常见问题
文章目录 微服务常见问题一、常见问题概要一、问题详解1.1 服务拆分1.2 服务通信1.3 服务注册与发现1.4 服务治理1.5 数据一致性1.6 故障隔离与容错处理1.7 数据库设计1.8 性能测试与调优 微服务常见问题 一、常见问题概要 服务拆分:如何合理地拆分服务&#…...
Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界
Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界 引言 随着自动驾驶技术的迅速发展,仿真环境的构建变得愈发重要。传统的测试方法依赖物理车辆和道路进行验证,但这种方式不仅成本高昂,还存在一定的风险。为了加速自动驾驶技术的研发,仿真环境成为了一个必不可…...
【统计方法】交叉验证:Resampling, nested 交叉验证等策略 【含R语言】
Resampling (重采样方法) 重采样方法是从训练数据中反复抽取样本,并在每个(重新)样本上重新调整模型,以获得关于拟合模型的附加信息的技术。 两种主要的重采样方法 Cross-Validation (CV) 交叉验证 : 用于估计测试误…...
海外App数据隐私架构实战:构建GDPR、CCPA合规的全栈解决方案
一、隐私合规的架构范式转变 从“数据收集”到“数据最小化”传统模式:尽可能收集数据 → 导致合规风险隐私原生模式:默认不收集 → 按需申请 → 自动过期kotlin// Android权限动态申请示例(GDPR兼容) val request PermissionRe…...
Prometheus监控
1、docker - prometheusgrafana监控与集成到spring boot 服务_grafana spring boot-CSDN博客 2、【IT运维】普罗米修斯基本介绍及监控平台部署(PrometheusGrafana)-CSDN博客 3、Prometheus监控SpringBoot-CSDN博客 4、springboot集成普罗米修斯-CSDN博客…...
Vue3 Echarts 3D圆形柱状图实现教程以及封装一个可复用的组件
文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 首先实现一个基础柱状图3.3 添加上下2个椭圆面3.4 进阶封装一个可复用的3D圆形柱状图组件 总结 前言 在前端开发的数据可视…...
洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类
[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前缀的问题了,那当然首先就应该想到 Trie \text{Trie} Trie 树。 我们可…...
【3D基础】顶点法线与平面法线在光照与PBR中的区别与影响
顶点法线与平面法线在光照与PBR中的区别与影响 在3D图形学中,法线(Normal)是影响光照计算、表面细节表现和渲染质量的核心参数之一。法线用于描述一个表面或顶点的朝向,直接关系到光的反射与分布,从而影响最终像素的颜…...
jmeter-Beashell获取http请求体json
在JMeter中,使用BeanShell处理器或BeanShell Sampler来获取HTTP请求体中的JSON数据是很常见的需求。这通常用于在测试计划中处理和修改请求体,或者在响应后进行验证。以下是一些步骤和示例代码,帮助你使用BeanShell来获取HTTP请求体中的JSON数…...
为网页LOGO视频增加电影质感表现
为网页LOGO视频增加电影质感表现 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为网页LOGO视频增加电影质感表现前几天,一个朋友开了一家烤肉店,给我发来了烤肉店的宣传视频,我…...
精益数据分析(32/126):电商指标优化与搜索策略解析
精益数据分析(32/126):电商指标优化与搜索策略解析 在创业和数据分析的探索之旅中,每一次深入学习都能为我们带来新的启发和成长。今天,我们继续秉持共同进步的理念,深入研读《精益数据分析》,…...
【空间数据分析】缓冲区分析--泰森多边形(Voronoi Diagram)-arcgis操作
泰森多边形(Voronoi Diagram):根据一组输入点生成多边形,使得每个多边形内的任意位置到其关联点的距离最近。 多边形之间无重叠,全覆盖研究区域。 边界是相邻两点连线的垂直平分线。 实验操作: 使用 Cre…...
JavaScript高级进阶(五)
操作节点属性 设置属性(先找属性再操作) setAttribute()方法添加指定的属性,并为其赋指定的值 语法: element.setAttribute(attributename/属性名,attributevalue/属性值) 例: <style> .box{ width: 200px; height: 200p…...
WPF之TextBlock控件详解
文章目录 1. TextBlock控件介绍2. TextBlock的基本用法2.1 基本语法2.2 在代码中创建TextBlock 3. TextBlock的常用属性3.1 文本内容相关属性3.2 字体相关属性3.3 外观相关属性3.4 布局相关属性 4. TextBlock文本格式化4.1 使用Run元素进行内联格式化4.2 其他内联元素 5. 处理长…...
串口通信协议
什么是串口通信? 串口通信是将数据在一条数据线上传输。 串口通信的特点是传输线少(相对于并行通信),长距离传输的成本低,但数据的传送控制比并行通信复杂。 常见的串行通信接口包括:USB,RS-…...