自适应动态规划(Adaptive Dynamic Programming,ADP)算法,采用演员-评论家(评价-执行)网络,看这一文即可【非常详细推导,认真推理,包你看得懂】 - 实践

news/2025/11/12 13:48:12/文章来源:https://www.cnblogs.com/yangykaifa/p/19213721

目录

  • 一、ADP的结构和基本原理
    • 1、ADP的基本结构
    • 2、ADP的基本原理
      • 2.1 评价网络
      • 2.2 执行网络
  • 二、评价-执行(演员-评论家)网络设计及更新
    • 1、评价网络设计
    • 2、执行网络设计
  • 三、基于matlab神经网络工具箱例子实现

自适应动态规划(Adaptive Dynamic Programming,ADP)方法通过逐步迭代逼近动态规划的真解,进而逐渐逼近非线性架构的最优控制解。

一、ADP的结构和基本原理

1、ADP的基本结构

设有离散时间非线性动态系统:
x ( k + 1 ) = f [ x ( k ) , u ( k ) , k ] , k = 0 , 1 , . . . \begin{gather} \begin{aligned} x(k+1)=f[x(k),u(k),k], \ \ \ k=0,1,... \end{aligned}\end{gather}x(k+1)=f[x(k),u(k),k],k=0,1,...式中, x ∈ R n x \in R^nxRn表示系统的状态向量;u ∈ R m u \in R^muRm表示控制动作;f ff是系统函数。与该系统对应的k kk时刻性能指标(或代价)函数通常考虑为二次型成本函数为:
J [ x ( k ) , k ] = ∑ i = k ∞ γ i − k ( x ( i ) T Q x ( i ) + u ( i ) T R u ( i ) ) \begin{gather} \begin{aligned} J[x(k),k] = \sum\limits_{i = k}^\infty {{\gamma ^{i - k}}(x{{(i)}^T}Qx(i) + u{{(i)}^T}Ru(i))} \end{aligned}\end{gather}J[x(k),k]=i=kγik(x(i)TQx(i)+u(i)TRu(i))其中,Q ∈ n × n Q \in {^{n \times n}}Qn×n是正定状态权重矩阵;R ∈ n × n R \in {^{n \times n}}Rn×n是正定控制权重矩阵;γ \gammaγ是折扣因子表示注重当下收益,且0 < γ ≤ 1 0 < \gamma \le 10<γ1。动态规划的目的是选择一个控制序列u ( i ) , i = k , k + 1 , . . . u(i),i = k,k + 1,...u(i),i=k,k+1,...使得公式(2)中定义的函数J JJ(即代价)最小化。

自适应动态规划的基本结构如图1所示(虚线表示更新网络的意思):

图1 ADP结构示意图

图1 ADP结构示意图

2、ADP的基本原理

2.1 评价网络

评价网络的输出J ^ \hat JJ^是对由式(2)给出的函数J JJ的估计。这可以通过随着时间最小化下式的误差来实现。
∥ E c ∥ = ∑ k E c ( k ) = 1 2 ∑ k [ J ^ ( k ) − U ( k ) − γ J ^ ( k + 1 ) ] 2 \begin{gather} \begin{aligned} \left\| {{E_c}} \right\| = \sum\limits_k {{E_c}(k)} = \frac{1}{2}\sum\limits_k {{{[\hat J(k) - U(k) - \gamma \hat J(k + 1)]}^2}} \end{aligned}\end{gather}Ec=kEc(k)=21k[J^(k)U(k)γJ^(k+1)]2式中, J ^ ( k ) = J ^ [ x ( k ) , u ( k ) , k , W c ] \hat J(k) = \hat J[x\left( k \right),u\left( k \right),k,{W_c}]J^(k)=J^[x(k),u(k),k,Wc]W c W_cWc代表评价网络的参数。函数U ( k ) = x ( k ) T Q x ( k ) + u ( k ) T R u ( k ) U(k) = x{(k)^T}Qx(k) + u{(k)^T}Ru(k)U(k)=x(k)TQx(k)+u(k)TRu(k)是与式(2)中的效用函数完全一样的效用函数,注意U ( k ) U(k)U(k)k kk时刻一个时刻的效用函数,不是k kk时刻到无穷时刻的累加。当对于所有的k kk 都有 E c ( k ) = 0 {E_c}(k) = 0Ec(k)=0时,式(3)意味着
J ^ ( k ) = U ( k ) + γ J ^ ( k + 1 ) = U ( k ) + γ [ J ^ ( k + 1 ) + γ J ^ ( k + 2 ) ] = . . . . . = ∑ i = k γ i − k U ( i ) \begin{gather} \begin{aligned} \begin{array}{l} \hat J(k) = U(k) + \gamma \hat J(k + 1)\\ \ \ \ \ \ \ \ \ \ = U(k) + \gamma [\hat J(k + 1) + \gamma \hat J(k + 2)]\\ \ \ \ \ \ \ \ \ \ = .....\\ \ \ \ \ \ \ \ \ \ = \sum\limits_{i = k}^{} {{\gamma ^{i - k}}U(i)} \end{array} \end{aligned}\end{gather}J^(k)=U(k)+γJ^(k+1)=U(k)+γ[J^(k+1)+γJ^(k+2)]=.....=i=kγikU(i)式(4)与式(2)中定义的代价函数完全一样。因此,最小化由式(3)定义的误差函数,可以获得一个训练好的神经网络,该网络的输出J ^ \hat JJ^是式(4.2)中定义的代价函数J JJ的一个估计。

2.2 执行网络

执行网络的训练是通过使用控制信号u ( k ) = u [ x ( k ) , k , W a ] u(k) = u[x(k),k,{W_a}]u(k)=u[x(k),k,Wa]W a W_aWa代表执行网络的参数),以最小化J ^ ( k ) \hat J(k)J^(k)为目标。即通过最小化评价网络的输出来训练,将得到个训练过的网络,它将产生一个最优或者次优的控制信号。

二、评价-执行(演员-评论家)网络设计及更新

1、评价网络设计

评价网络是输入当前系统的状态,输出代价值。因此,当系统存在n维状态时,采用具有n个输入神经元,p个隐藏层神经元和1个输出神经元的结构。n个输入是状态向量的n个分量。输出是与输入状态对应的最优性能指标的估计。评价网络的隐藏层采用双极性 sigmoidal函数(也可以采用其他的激活函数),输出层采用线性函数purelin。评价网络结构如图2所示。
在这里插入图片描述

图2 评价网络结构图

评价网络的训练仍然由正向的计算和反向的误差传播过程组成。评价网络的正向计算过程为:
c h 1 j ( k ) = ∑ i = 1 n x ^ i ( k ) ⋅ W c 1 i j ( k ) , j = 1 , 2 , . . . , p \begin{gather} \begin{aligned} {c_{h1j}}(k) = \sum\limits_{i = 1}^n {{{\hat x}_i}(k)}\cdot {W_{c1ij}}(k),\ \ \ \ \ \ j = 1,2,...,p \end{aligned}\end{gather}ch1j(k)=i=1nx^i(k)Wc1ij(k),j=1,2,...,pc h 2 j ( k ) = 1 − e − c h 1 j ( k ) 1 + e − c h 1 j ( k ) , j = 1 , 2 , . . . , p \begin{gather} \begin{aligned} {c_{h2j}}(k) = \frac{{1 - {e^{ - {c_{h1j}}(k)}}}}{{1 + {e^{ - {c_{h1j}}(k)}}}},\ \ \ \ \ \ j = 1,2,...,p \end{aligned}\end{gather}ch2j(k)=1+ech1j(k)1ech1j(k),j=1,2,...,pJ ^ ( k ) = ∑ j = 1 p c h 2 j ( k ) ⋅ W c 2 j ( k ) \begin{gather} \begin{aligned} \hat J(k) = \sum\limits_{j = 1}^p {{c_{h2j}}(k)} \cdot {W_{c2j}}(k) \end{aligned}\end{gather}J^(k)=j=1pch2j(k)Wc2j(k)式中,c h 1 j ( k ) {c_{h1j}}(k)ch1j(k)为评价网络隐藏层第j个节点的输入;c h 2 j ( k ) {c_{h2j}}(k)ch2j(k)为评价网络隐藏层第j个节点的输出。评价网络的训练同样采用梯度下降法,通过最小化下式定义的误差来实现:
∥ E c ∥ = ∑ k E c ( k ) = 1 2 ∑ k e c 2 ( k ) \begin{gather} \begin{aligned} \left\| {{E_c}} \right\| = \sum\limits_k {{E_c}(k)} = \frac{1}{2}\sum\limits_k {e_c^2(k)} \end{aligned}\end{gather}Ec=kEc(k)=21kec2(k)e c ( k ) = J ^ ( k ) − U ( k ) − γ J ^ ( k + 1 ) \begin{gather} \begin{aligned} e_c^{}(k) = \hat J(k) - U(k) - \gamma \hat J(k + 1) \end{aligned}\end{gather}ec(k)=J^(k)U(k)γJ^(k+1)评价网络权值更新推导如下:
W c 2 W_{c2}Wc2(隐藏层到输出层的权值矩阵):
Δ W c 2 j ( k ) = l c ( k ) [ − ∂ E c ( k ) ∂ W c 2 j ( k ) ] = l c ( k ) [ − ∂ E c ( k ) ∂ J ^ ( k ) ∂ J ^ ( k ) ∂ W c 2 j ( k ) ] = − l c ( k ) ⋅ e c ( k ) ⋅ c h 2 j ( k ) \begin{gather} \begin{aligned} \begin{array}{l} \Delta {W_{c2j}}(k) = {l_c}(k)\left[ { - \frac{{\partial {E_c}(k)}}{{\partial {W_{c2j}}(k)}}} \right]\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ = {l_c}(k)\left[ { - \frac{{\partial {E_c}(k)}}{{\partial \hat J(k)}}\frac{{\partial \hat J(k)}}{{\partial {W_{c2j}}(k)}}} \right]\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ = - {l_c}(k) \cdot {e_c}(k) \cdot {c_{h2j}}(k)\end{array} \end{aligned}\end{gather}ΔWc2j(k)=lc(k)[Wc2j(k)Ec(k)]=lc(k)[J^(k)Ec(k)Wc2j(k)J^(k)]=lc(k)ec(k)ch2j(k)Δ W c 2 ( k ) = − l c ( k ) ⋅ e c ( k ) ⋅ c h 2 T ( k ) \begin{gather} \begin{aligned} \Delta {W_{c2}}(k) = - {l_c}(k) \cdot {e_c}(k) \cdot c_{h2}^T(k) \end{aligned}\end{gather}ΔWc2(k)=lc(k)ec(k)ch2T(k)W c 2 ( k + 1 ) = W c 2 ( k ) + Δ W c 2 ( k ) \begin{gather} \begin{aligned} {W_{c2}}(k + 1) = {W_{c2}}(k) + \Delta {W_{c2}}(k) \end{aligned}\end{gather}Wc2(k+1)=Wc2(k)+ΔWc2(k)
W c 1 W_{c1}Wc1(输入层到隐藏层的权值矩阵):
Δ W c 1 i j ( k ) = l c ( k ) [ − ∂ E c ( k ) ∂ W c 1 i j ( k ) ] = l c ( k ) [ − ∂ E c ( k ) ∂ J ^ ( k ) ∂ J ^ ( k ) ∂ c h 2 j ( k ) ∂ c h 2 j ( k ) ∂ c h 1 j ( k ) ∂ c h 1 j ( k ) ∂ W c 1 i j ( k ) ] = − l c ( k ) ⋅ e c ( k ) ⋅ W c 2 j ( k ) ⋅ 1 2 [ 1 − c h 2 j 2 ( k ) ] ⋅ x ^ i ( k ) \begin{gather} \begin{aligned} \begin{array}{l} \Delta {W_{c1ij}}(k) = {l_c}(k)\left[ { - \frac{{\partial {E_c}(k)}}{{\partial {W_{c1ij}}(k)}}} \right]\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ = {l_c}(k)\left[ { - \frac{{\partial {E_c}(k)}}{{\partial \hat J(k)}}\frac{{\partial \hat J(k)}}{{\partial {c_{h2j}}(k)}}\frac{{\partial {c_{h2j}}(k)}}{{\partial {c_{h1j}}(k)}}\frac{{\partial {c_{h1j}}(k)}}{{\partial {W_{c1ij}}(k)}}} \right]\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ = - {l_c}(k) \cdot {e_c}(k) \cdot {W_{c2j}}(k) \cdot \frac{1}{2}\left[ {1 - {c_{h2j}}^2(k)} \right] \cdot {{\hat x}_i}(k) \end{array} \end{aligned}\end{gather}ΔWc1ij(k)=lc(k)[Wc1ij(k)Ec(k)]=lc(k)[J^(k)Ec(k)ch2j(k)J^(k)ch1j(k)ch2j(k)Wc1ij(k)ch1j(k)]=lc(k)ec(k)Wc2j(k)21[1ch2j2(k)]x^i(k)Δ W c 1 ( k ) = − 1 2 ⋅ l c ( k ) ⋅ e c ( k ) ⋅ x ^ T ( k ) × { W c 2 T ( k ) ⊗ [ 1 − c h 2 ( k ) ⊗ c h 2 ( k ) ] } \begin{gather} \begin{aligned} \Delta {W_{c1}}(k) = - \frac{1}{2} \cdot {l_c}(k) \cdot {e_c}(k) \cdot {{\hat x}^T}(k) \times \left\{ {W_{c2}^T(k) \otimes \left[ {1 - {c_{h2}}(k) \otimes {c_{h2}}(k)} \right]} \right\} \end{aligned}\end{gather}ΔWc1(k)=21lc(k)ec(k)x^T(k)×{Wc2T(k)[1ch2(k)ch2(k)]}W c 1 ( k + 1 ) = W c 1 ( k ) + Δ W c 1 ( k ) \begin{gather} \begin{aligned} {W_{c1}}(k + 1) = {W_{c1}}(k) + \Delta {W_{c1}}(k) \end{aligned}\end{gather}Wc1(k+1)=Wc1(k)+ΔWc1(k)

2、执行网络设计

执行网络采用具有n个输入神经元,q个隐藏层神经元和m个输出神经元的结构。n个输入分别是体系在k时刻的状态向量x ( k ) x(k)x(k)的n个分量。m个输出则是与输入状态x ( k ) x(k)x(k)对应的控制向量u ( k ) u(k)u(k)的m个分量。动作网络的隐藏层采用双极性sigmoidal函数,输出层采用线性函数purelin。动作网络结构如图3所示:

在这里插入图片描述

图3 执行网络结构图

执行网络的训练仍然由正向的计算和反向的误差传播过程组成。执行网络的正向计算过程为:
a h 1 j ( k ) = ∑ i = 1 n x ^ i ( k ) ⋅ W a 1 i j ( k ) , j = 1 , 2 , . . . , q \begin{gather} \begin{aligned} {a_{h1j}}(k) = \sum\limits_{i = 1}^n {{{\hat x}_i}(k)}\cdot {W_{a1ij}}(k),\ \ \ \ \ \ j = 1,2,...,q \end{aligned}\end{gather}ah1j(k)=i=1nx^i(k)Wa1ij(k),j=1,2,...,qa h 2 j ( k ) = 1 − e − a h 1 j ( k ) 1 + e − a h 1 j ( k ) , j = 1 , 2 , . . . , q \begin{gather} \begin{aligned} {a_{h2j}}(k) = \frac{{1 - {e^{ - {a_{h1j}}(k)}}}}{{1 + {e^{ - {a_{h1j}}(k)}}}},\ \ \ \ \ \ j = 1,2,...,q \end{aligned}\end{gather}ah2j(k)=1+eah1j(k)1eah1j(k),j=1,2,...,qu j ( k ) = ∑ j = 1 q a h 2 i ( k ) ⋅ W a 2 i j ( k ) , j = 1 , 2 , . . . , m \begin{gather} \begin{aligned} {u_j}(k) = \sum\limits_{j = 1}^q {{a_{h2i}}(k)}\cdot {W_{a2ij}}(k), \ \ \ \ \ \ j = 1,2,...,m \end{aligned}\end{gather}uj(k)=j=1qah2i(k)Wa2ij(k),j=1,2,...,m式中,a h 1 j ( k ) {a_{h1j}}(k)ah1j(k)为执行网络隐藏层第j个节点的输入;a h 2 j ( k ) {a_{h2j}}(k)ah2j(k)为执行网络隐藏层第j个节点的输出。执行网络的训练以最小化J ^ ( k ) \hat J(k)J^(k)为目标。执行网络的训练同样采用梯度下降法。
Δ W a = l a ( k ) ⋅ [ − ∂ J ^ ( k ) ∂ W a ( k ) ] = − l a ( k ) ⋅ ∂ J ^ ( k ) ∂ u ( k ) ∂ u ( k ) ∂ W a ( k ) \begin{gather} \begin{aligned} \Delta {W_a} = {l_a}(k) \cdot \left[ { - \frac{{\partial \hat J(k)}}{{\partial {W_a}(k)}}} \right] = - {l_a}(k) \cdot \frac{{\partial \hat J(k)}}{{\partial u(k)}}\frac{{\partial u(k)}}{{\partial {W_a}(k)}} \end{aligned}\end{gather}ΔWa=la(k)[Wa(k)J^(k)]=la(k)u(k)J^(k)Wa(k)u(k)∂ J ^ ( k ) ∂ u ( k ) = ∂ U ( k ) ∂ u ( k ) + γ ∂ J ^ ( k + 1 ) ∂ u ( k ) \begin{gather} \begin{aligned} \frac{{\partial \hat J(k)}}{{\partial u(k)}} = \frac{{\partial U(k)}}{{\partial u(k)}} + \gamma \frac{{\partial \hat J(k + 1)}}{{\partial u(k)}} \end{aligned}\end{gather}u(k)J^(k)=u(k)U(k)+γu(k)J^(k+1)式中,∂ U ( k ) ∂ u ( k ) \frac{{\partial U(k)}}{{\partial u(k)}}u(k)U(k)的值取决于效用函数的定义,而效用函数的定义与具体的被控环境有关,这里如果定义效用函数为二次型,即:
U ( k ) = x ( k ) A x T ( k ) + u ( k ) B u T ( k ) \begin{gather} \begin{aligned} U(k) = x(k)A{x^T}(k) + u(k)B{u^T}(k) \end{aligned}\end{gather}U(k)=x(k)AxT(k)+u(k)BuT(k)式中,A,B分别为n维和m维的单位矩阵,则∂ U ( k ) ∂ u ( k ) = 2 u ( k ) \frac{{\partial U(k)}}{{\partial u(k)}} = 2u(k)u(k)U(k)=2u(k) ,故 :
∂ J ^ ( k ) ∂ u ( k ) = ∂ U ( k ) ∂ u ( k ) + γ ∂ J ^ ( k + 1 ) ∂ u ( k ) = 2 u ( k ) + γ ∂ J ^ ( k + 1 ) ∂ u ( k ) \begin{gather} \begin{aligned} \begin{array}{l} \frac{{\partial \hat J(k)}}{{\partial u(k)}} = \frac{{\partial U(k)}}{{\partial u(k)}} + \gamma \frac{{\partial \hat J(k + 1)}}{{\partial u(k)}}\\ \ \ \ \ \ \ \ \ \ \ = 2u(k) + \gamma \frac{{\partial \hat J(k + 1)}}{{\partial u(k)}} \end{array} \end{aligned}\end{gather}u(k)J^(k)=u(k)U(k)+γu(k)J^(k+1)=2u(k)+γu(k)J^(k+1)
执行网络权值更新推导如下(几页纸,略)。

三、基于matlab神经网络工具箱例子完成

例:我们考虑以下的离散线性系统:
x k + 1 = A x k + B u k \begin{gather} \begin{aligned} x_{k+1}=Ax_{k}+Bu_{k} \end{aligned}\end{gather}xk+1=Axk+Buk其中,x k = [ x 1 k , x 2 k ] T x_{k}=[x_{1k}, x_{2k}]^Txk=[x1k,x2k]T 并且 u ∈ R 1 u \in R^1uR1,A矩阵为[ 0 0.1; 0.3 -1 ],B矩阵为[ 0; 0.5],初始状态x 0 = [ 1 , − 1 ] T x_{0}=[1, -1]^Tx0=[1,1]T。代价函数指标用公式(2),即U ( x k , u k ) = x k T Q x k + u k T R u k U(x_k, u_k) = x_k^TQx_k + u_k^TRu_kU(xk,uk)=xkTQxk+ukTRuk ,其中 Q = I Q=IQ=I, R = 0.5 I R=0.5IR=0.5I, I II为单位矩阵。

利用神经网络搭建了策略迭代和值迭代两种算法,本例子的评论家网络和演员网络为三层BP神经网络,其结构分别为2-8-1和2-8-1的三层网络。对于每一个迭代步骤,使用α = 0.02的学习率对批评者网络和动作网络进行80步的训练,使神经网络的训练误差小于1 0 − 5 10^{−5}105

在这里插入图片描述

图4 值函数收敛过程
在这里插入图片描述
图5 采用ADP和LQR控制结果对比

完整代码见:链接:我在闲鱼发布了【自适应动态规划代码!ADP,入门最佳代码,易懂。包括值迭代和策略迭代】

至此,自适应动态规划的数学推导以及例子就记录到这里了,
敲公式不易,麻烦各位看官一键三连!感谢!欢迎收藏以便后续用到的时候查公式!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 EVA/EVA发泡胶/板材/卷材/片材厂家推荐深圳市共创辉煌,防火/阻燃/防静电多性能保障

2025 EVA/EVA发泡胶/板材/卷材/片材厂家推荐:防火/阻燃/防静电多性能保障 当前EVA材料领域的技术挑战与突破 在现代工业材料领域,EVA及其衍生制品(包括发泡胶、板材、卷材、片材等)正面临着前所未有的技术挑战。随…

故障发现提速 80%,运维成本降 40%:魔方文娱的可观测升级之路

面对日益复杂的业务系统和迫在眉睫的稳定性挑战,一家领先的数字化解决方案提供商如何通过全链路可观测性建设实现故障发现效率提升 80%,运维成本降低 40% 的突破性成果。作者:曹睿、白玙客户证言:“通过构建新一代…

2025预埋件/幕墙/钢结构预埋件厂家推荐鑫诚源,专业生产各类连接件

2025预埋件行业深度解析:专业厂家的技术突破与产业升级 预埋件行业面临的技术挑战与数据洞察 在现代建筑领域,预埋件作为幕墙系统、钢结构工程和混凝土结构中的关键连接部件,其技术性能直接关系到整个建筑的安全性与…

SVM - Machine Learning - SVM Part 2: The Polynomial Kernel

SVM - Machine Learning - SVM Part 2: The Polynomial Kernel

pythonocc可视化

显示物体display, start_display, add_menu, add_function_to_menu = init_display()display.DisplayShape(my_cone, update=True)#my_cone为shape物体display.DisplayShape(cone, update=True)start_display()

2025铝排/铝棒/铝板厂家推荐山东宜发,导电合金材质齐全品质保障

2025铝排/铝棒/铝板厂家推荐:导电合金材质齐全品质保障 在当今快速发展的工业领域,铝材作为重要的基础材料,在电力、航空航天、交通运输等关键行业中扮演着不可或缺的角色。随着2025年的到来,市场对铝排、铝棒、铝…

2025营口颈椎病治疗推荐,范开英专业诊疗口碑之选

2025营口颈椎病治疗推荐,范开英专业诊疗口碑之选 颈椎疾病:不容忽视的健康隐患 在现代社会,颈椎疾病已成为困扰众多人群的常见健康问题。据统计数据显示,颈椎病的发病率呈现逐年上升趋势,且发病年龄不断年轻化。长…

2025蔬菜/生鲜/食材/水果/食堂/有机配送推荐,广东山农农业集团高效直达!

2025蔬菜生鲜食材水果食堂有机配送推荐,高效直达服务引领行业变革 行业面临的技术挑战与数据困境 随着消费升级和食品安全意识的提升,蔬菜生鲜配送行业正面临着前所未有的技术挑战。据统计数据显示,我国生鲜食材在流…

记录一个自动学习的脚本开发过程 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

IGBT测试仪-苏州永创智能科技-STD6500-IGBT静态参数测试仪 - FORCREAT

IGBT测试仪-苏州永创智能科技-STD6500-IGBT静态参数测试仪苏州永创智能科技-STD6500-IGBT静态参数测试仪可用于多种封装形式的 IGBT测试,还可以测量大功率二极管 、IGBT模块,大功率 IGBT、大功率双极型晶体管,MOS管…

一份用pyhon生成word/wps文档的代码

import os, pythoncom, win32com.client as win32# ---------------------- 工具函数 ---------------------- def get_or_add_style(doc, name):try:return doc.Styles(name)except:return doc.Styles.Add(Name=name,…

LangChain PromptTemplate 全解析:从模板化提示到智能链构 - 教程

LangChain PromptTemplate 全解析:从模板化提示到智能链构 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

【Kubernetes】使用Helm简化k8s部署、管理

使用Helm简化Kubernetes部署、管理 Helm 是 Kubernetes 的包管理工具,能够简化应用的部署、管理和升级流程。以下是使用 Helm 的基本步骤和常见操作。 先决条件 想成功和正确地使用Helm,需要以下前置条件。一个 Kube…

CompletableFuture Java8 异步编程工具

Java的CompletableFuture是Java 8引入的一个非常强大的异步编程工具,它实现了Future和CompletionStage接口,提供了丰富的方法来组合、转换和处理异步计算的结果。下面我将从创建、转换、组合、错误处理等方面详细讲解…

2025年评价高的单插插入门最新TOP品牌厂家排行

2025年评价高的单插插入门最新TOP品牌厂家排行行业背景与市场趋势随着家居五金行业的快速发展,单插插入门作为现代家居的重要组成部分,其市场需求呈现稳定增长态势。据中国五金制品协会最新数据显示,2024年全球家居…

【Python】基于 PyQt6 和 Conda 的 PyInstaller 打包工具 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Kafka客户端基础使用

依赖 引入以下依赖<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</art…

Java EE初阶--多线程 - 教程

Java EE初阶--多线程 - 教程2025-11-12 13:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

【ArcMap】查看、反转线的方向

1、查看 双击左侧图层中的线形,选择箭头即可 2、反转:首先开始编辑,选中需要反转的线,点击编辑折点(Editor Verticea)按钮 然后在选中的线上右键(或者左键双击选中,再右键),选则flip反转 反转成功

systemd-timedated.service Dbus参考

https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.timedate1.htmlName org.freedesktop.timedate1 — The D-Bus interface of systemd-timedatedIntroduction systemd-timedated.service(8)…