Actor Prioritized Experience Replay

论文宗旨:

由于PER 是以TD-error成正比的非均匀概率进行抽样的,但是在AC算法中即连续动作空间中,会表现出低效果。
分析结果是:Actor不能有效的从high TD-error的transition中学习,Q网络下近似的policy gradient会偏离最优Q下的真实梯度。
提出修正方法:

  • Actor从low TD-error的transition中学习;但是发现在q网络更新中与MSE损失相结合时,PER并不能完全消除偏差,采用huber loss
  • 对于low TD-error的采样;方法:其概率与TD误差成反比,适用于创建一个包含优先级全局逆的new tree,并且q网络更新也使用LAP优先级方法,and Huber loss不能应用于策略梯度的计算
  • 用完全不同的transition优化演员和评论家网络可能违反AC理论:使用相同的transitions set(作为采样mini-batch的一部分)进行优化,并且对共享transitions set进行均匀采样,q网络更新也使用LAP优先级方法的镜像loss函数--PAL

1 Introduction

PER非均匀采样,分析了PER在AC中为何不能有效:

对于critic:TD-error可以代表Q学习的loss和对未来回报的不确定性。
但是对于actor:actor不能有效训练,因为这些经验是critic未知未来回报的(就好比:一个经验很少的老师期待可以学习的很好)

本文会证明actor使用high TD-error训练的策略梯度会出现偏差

本文Discoveries:

  • 依赖与critic的策略梯度不能使用使得critic有高不确定性的transitions
  • critic和actor选择不用的transition违反AC算法。因为critic参数更新依赖actor
  • 损失函数要与优先级抽样一起考虑:因为在采样的时候离群偏差的transition可能会被泄露

2 Related Work

PER的改进算法:

Rainbow, distributed PER, distributional policy gradients、
prioritizing the sequences of transitions 、 optimization of the prioritization scheme、
determining which transitions to favor or forget、 the composition and size of the experience replay buffers

基于学习的采样策略:

train a multi-layer perceptron whose input is the concatenation of reward, time step, and TD
error.

与这些可学习的采样策略相反,本文以基于规则的方式引入了对优先体验重播的修正

最近的研究:PER、LAP和MaPER。
本文实验比较:我们的方法(LA3P)与均匀抽样、PER、LAP和MaPER进行了比较。

3 Technical Preliminaries

3.1 Deep Reinforcement Learning

在动作值函数(q函数或批评家)Qπ下评估策略的性能:

根据贝尔曼方程确定动作值函数:

TD-learning算法是一种基于Bellman方程的更新规则:

TD error:

3.2 Prioritized Experience Replay

PER两点改变:

  • 采用随机优先级方案:
    这样做的动机是,只有在重放transition时才更新TD error。最初的high TD error的transition会更频繁地更新,从而导致贪婪优先级。由于贪婪采样,噪声q值估计增加了方差;如果直接对与TD误差成比例的transition进行采样,过拟合是不可避免的:

    修正:给每个transition赋一个概率值,与其TD-error成正比,并设置为超参数α的幂次以平滑极值:

  • 偏好随机优先级的high TD error的transition会使下一个状态对于Q值的分布偏移

    修正:重要性采样

4 Prioritized Sampling in Actor-Critic Algorithms

用标准的非策略连续控制方法解释了PER的不良性能

Lemma 1

引理1:
如果δ是与评价网络Q相关的TD error,则存在一个δo(τt)≠0的过渡元组τt = (St, at, rt, St+1),使得τt上的绝对TD error与至少τt或τt+1上的绝对估计误差成正比

证明:
TD error的自举值估计公式:
在策略Π下的最优动作价值函数没有TD error:
两个式子相减:

x是时间步t的估计误差;y是后续时间步t + 1的估计误差
如果x = 0,则y≠0,反之亦然,因为γ≥0
因此,如果q网络对应的TD误差非零,则在τt或τt+1上存在Qθ的估计误差

假设δθ(τt)<0, x≥0,y <0。在这种情况下,如果x保持不变,则TD误差的增加会增加y的绝对估计误差。
推断在时间步长t的绝对时间差误差|δθ(τt)|与τt或τt+1的绝对估计误差之间可能存在正比关系。

RL函数估计误差通常是由使用函数逼近器和自举引起的;由于估计误差通常不能区分为函数逼近和bootstrapping,因此不能推导出估计误差和TD误差之间总存在正比关系。此外,在某些条件下,TD-learning可能是一个糟糕的估计,例如当奖励有噪声时。TD误差衡量的是过渡的意外程度,而不是估计精度。因此,引理1必须证明这种相关性对于某些状态-动作对是存在的

Theorem 1

利用上述结果来解释为什么使用具有较大TD误差的转换不能有效地执行策略优化

定理1:
设τi是一个满足引理1的transition。那么,如果δθ(τi) ≠ 0,则δθ(τi)正比于估计梯度的误差

证明:
用策略参数φ的函数近似形式化地表示标准策略迭代:

用函数逼近法给出了策略迭代中策略梯度的一般公式:

我们可以忽略dπ(si)由于策略参数φ对d没有影响:

如果策略是随机的,则上式转化为:

梯度正比于Q的估计值

用真q值和估计误差来表示策略梯度:

真实Q与真实梯度的关系:

上述两个式子可见:随着Q估计值偏移真实Q值,增长的估计误差会增加了与实际政策梯度的差异:

根据Lemma 1:

我们推断,当前步t中增加的绝对TD error会增加当前t或后续步t+1中与实际策略梯度的差异:

Corollary 1.

定理1:如果actor网络使用与large TD error相对应的transition进行优化,则当前或后续步的策略梯度可能与实际梯度偏离

推论1:
如果transition的 TD error增加,则关于Q-network的任何策略梯度算法计算的近似策略梯度都可能偏离当前或后续transition在最优q函数下计算的实际梯度。

当采用actor网络时,这是优先采样性能下降的一个重要因素

Remark 1

最近的一项发现:解释了连续控制中优先抽样的较差性能的补充

通过随机采样的具有较大TD误差的转换进行优先级排序,将s0的分布移动到Es 0 [Q(s 0, a0)]。因此,这种诱导的偏差可通过重要性采样进行修正;
在发现中:在q网络更新中,当与MSE损失相结合时,PER并不能完全消除偏差,可能会偏向离群点

修正:L1 loss可以满足这样的性质
在实践中,L1损失可能不是理想的,因为每次更新都需要一个恒定大小的步长,如果学习率太大,可能会导致目标overstepped
修正结果:采用常用的Huber损耗,κ = 1:

误差小于1的样本应均匀采样,以防止由MSE和优先级引起的偏差;LAP算法将低优先级的样本限定为至少一个样本来实现这一目标。
LAP算法将式(25)中表示的Huber损失与以下改进的随机优先级方案相结合,克服了Remark 1中提到的问题:

Remark 2


为了进一步消除优先体验重放算法中有利于离群值转换的偏差,应将κ = 1的Huber损失与上述优先级方案结合使用

Fujimoto等人提出的结果对我们在remark 2中强调的PER性能较差的理论结论进行了补充。
我们的重点是连续控制算法,相比之下,Remark 2包括离散和连续的非策略深度强化学习。
Corollary 1和Remark 2为连续控制中PER算法的缺陷奠定了基础

5 Adaptation of Prioritized Experience Replay to Actor-Critic Algorithms

5.1 Inverse Sampling for the Actor Network

Observation 1

如果没有使用sampled transitions之后的transitions来优化参与者网络,那么在PER算法下,AC方法的性能可能不会下降。然而,在连续控制的标准脱策略算法中,这种可能性仍然很小。【因为replay buffer在初始优化步骤中包含很少的转换,其数量小于批量大小】

推论1中的需求可以通过从优先重放缓冲区中进行反向采样来实现,即通过PER方法对执行器网络的低TD误差转换进行采样

一种本能的对转换进行采样的方法,其概率与TD误差成反比,适用于创建一个包含优先级全局逆的new tree。

尽管通过之前定义的和树数据结构,vanilla中的优先级在每个训练步骤中都会更新,但对actor更新的反向采样需要在训练之前创建一个新的和树。在每个更新步骤中,优先级的计算如下:

Remark 2所述,使用MSE和PER仍然会导致不同的偏差,这些偏差可能有利于异常值转移。因此,我们采用LAP的优先级方案:

在每个优化步骤t, Q-network和优先级分别更新为

Huber损失不能应用于策略梯度的计算

首先,根据q网络的损失即TD误差确定优先级,而MSE损失结合基于TD误差的优先采样是上述离群点偏差的主要原因;
此外,通过一类不可替代的策略梯度技术来计算策略损失和梯度。
因此,离群点偏差不会影响策略梯度,策略网络不需要使用Huber损失

5.2 Optimizing the Actor and Critic with a Shared Set of Transitions

用完全不同的transition优化演员和评论家网络可能违反AC理论

如果critic更新被一组位于actor从未优化过的状态-动作空间中的特征,可能存在很大的不稳定性:critic使用的transition是通过actor处理的,actor从未看到这些转换;因此critic的行为评价的可靠性可能会受到质疑

TD和估计误差之间并不总是直接相关的。

因此,一些过渡最初可能具有较低的TD误差。如果actor在整个学习过程中针对这些低TD误差转换进行优化,并且Q-network只关注剩余的大TD误差转换,则actor和critic训练中使用的样本可能不相同。尽管这仍然有一点可能性

但我们通过一组共享transition来更新actor和critic网络,作为采样mini-batch的一部分,从而克服了这一问题

Observation 2

如果分别通过逆优先级和优先级采样对actor和critic的转换进行采样,它们可能永远不会观察到相同的转换,这违反了actor-critic理论,并导致学习中的不稳定。因此,actor和critic应该使用相同的transitions set进行优化,至少在每个更新步骤中为采样的小批量transitions的一部分进行优化

如何选择 the set of shared transitions

均匀采样转换:
Transitions with large TD error和Transitions with small TD error两种选择意味着对共享转换集进行均匀采样仍然是唯一的选择

虽然均匀采样的小批量中可能包含较大的TD误差转移,但由于在小批量学习中进行平均,它们的影响被降低了。

如Remark 2所述,Huber损失(κ = 1)与优先采样相结合可以消除LAP算法中的离群点偏差。Fujimoto等人[2020]还介绍了LAP的镜像损失函数,具有等效的期望梯度,用于从经验回放缓冲区中均匀采样。

为了在均匀采样中观察LAP的相同好处,应该使用它的镜像损失函数,优先近似损失(PAL)而不是MSE。与LAP函数的情况类似,在策略网络的更新中也不使用PAL损失。PAL函数表示为:

为了消除均匀采样对应物中的离群值偏差,应该使用优先化近似损失(priority Approximate Loss, PAL)函数,该函数与PER结合后的Huber损失具有相同的期望梯度

LA3P

PER correction算法,即损失调整的近似Actor优先体验重放(LA3P)

总结一下方法:

  • 在每个更新步骤中,均匀采样大小为λ·N的小批次转换,其中λ∈[0,1]表示均匀采样transition的分数,这是引入的唯一超参数。
  • 在均匀采样的批处理下,分别对critic和actor网络进行优化。critic根据PAL函数进行更新,之后更新优先级。
  • 然后,分别通过优先级采样和逆优先级采样对critic和actor网络采样(1−λ)·N个transitions。
  • 然后,通过Huber损失(κ = 1)优化critic,并使用策略梯度技术优化actor。
  • 最后,再次更新优先级。

总的来说,actor和critic网络在每个更新步骤中通过N次转换进行优化,就像标准的非策略actor-critic算法一样。

异议:LA3P引入了额外的tree,增加了计算复杂度
解决:最新推出的CPU支持单指令多数据结构(SIMD)可以克服该缺点

本文转载于网络 如有侵权请联系删除

相关文章

  • Lecture 3- Iterative Deletion and the Median-Voter Theorem

    IntroductionWeapplythemainideafromlasttime,iterativedeletionofdominatedstrategies,toanalyzeanelectionwherecandidatescanchoosetheirpolicypositions.Wethenconsiderhowgoodisthisclassicmodelasadescriptionoftherealpoliticalprocess,andhowwemightbuildonittoimproveit.Towardtheendoftheclass,weintroduceanewideatogetusbeyonditerativedeletion.Wethinkaboutourbeliefsaboutwhattheotherplayerisgoingtodo,andthenaskwhatisthebeststrategyforustochoosegiventhosebeliefs? Median-VoterTheoremThemedianvotertheoremisapropo

  • 倒计时12天 - 2022 Thoughtworks 技术雷达峰会

    2022 技术雷达峰会TECHNOLOGYRADARSUMMIT2022FromFragileToAgile无论是始料未及的疫情,还是开源生态中的不安定因素,都对软件的构造和协作产生了不可估量的影响,也让我们前所未有地认识到,所处的行业是如此脆弱。脆弱可以催生一种应激性反应,也可以是一种成长。这为我们提供了契机,重新审视那些能够敏捷应对不确定性的各种技术。我们既目睹了区块链、机器学习这样的技术在一次次不可思议的惊叹声中,成长为当代软件工程不可或缺的重要组件,也看到元宇宙这样满足新场景需求的概念以及相应技术应运而生。它们帮助我们摆脱流程上的脆弱,踏上更加敏捷的成长历程。【关于技术雷达】Thoughtworker酷爱技术。我们的使命是支持卓越软件并掀起IT革命。我们创建并分享Thoughtworks技术雷达就是为了支持这一使命。由Thoughtworks中一群资深技术领导组成的Thoughtworks技术顾问委员会创建了该雷达。他们定期开会讨论Thoughtworks的全球技术战略以及对行业有重大影响的技术趋势。技术雷达以独特的形式记录技术顾问委员会的讨论结果,从首席技术官到开发人员,雷达

  • 折半查找 解题报告

    折半查找解题报告 折半查找是查找方法中的一种,常用的查找方法还有遍历查找。 折半查找运用了二分的思想,也可称为二分查找。其思想是在有序数组a(必须是有序的,从小到大或从大到小都可以)查找指定元素k,则将数组的中间元素啊a[mid]与k进行比较,如果a[mid]与k相等则已查找到;如果a[mid]与k不等,则需根据a[mid]与k的大小关系,在相应的数组前半段或是后半段中进行查找,不断缩小查找范围(第i次的查找范围是第i-1次的一半),此时需要递归调用二分查找函数。 二分查找函数可表示为:intbinaryfind(inta[],intk,intlow,inthigh); 其中,a[]代表待查找的数组,k代表查找元素,low和high限定了在数组a中的查找范围,从low-1位置开始查找到high-1位置(因为数组下标从零开始),并且mid=(low+high)。 注意 由于数组a中可能会存在相等的元素,若要求输出k在数组a中第一次出现的位置,可以在第一次查找到与元素k相等的元素位置后,仍然调用二分查找函数,直到查找的范围是1,则此时便找到了元素k在数组a中第一次出现的位置。 例题题目描

  • Kafka线上集群部署方案怎么做?

    Kafka集群方案该怎么做。既然是集群,那必然就要有多个Kafka节点机器,因为只有单台机器构成的Kafka伪集群只能用于日常测试之用,根本无法满足实际的线上生产需求。而真正的线上环境需要仔细地考量各种因素,结合自身的业务需求而制定。下面我就分别从操作系统、磁盘、磁盘容量和带宽等方面来讨论一下。操作系统首先我们先看看要把Kafka安装到什么操作系统上。说起操作系统,可能你会问Kafka不是JVM系的大数据框架吗?Java又是跨平台的语言,把Kafka安装到不同的操作系统上会有什么区别吗?其实区别相当大!的确,如你所知,Kafka由Scala语言和Java语言编写而成,编译之后的源代码就是普通的“.class”文件。本来部署到哪个操作系统应该都是一样的,但是不同操作系统的差异还是给Kafka集群带来了相当大的影响。目前常见的操作系统有3种:Linux、Windows和macOS。应该说部署在Linux上的生产环境是最多的,也有一些Kafka集群部署在Windows服务器上。Mac虽然也有macOSServer,但是我怀疑是否有人(特别是国内用户)真的把生产环境部署在Mac服务器上。如果考

  • SPARK框架下实现CPM(派系协同过滤算法)

    社群发现算法实现:CPM,基于SPARK+SCALA+MAVEN+Hadoop选择此框架实现原因:(1)SPARK的Graphx对于图操作较为便捷。(2)SPARK下的并行处理,便于对以后大型数据集进行扩充。详情见我的Github:传送门代码和数据集都在里面,需要的自己clone。ps:对我的算法或结果有什么疑问,或者搬代码。请评论留言。以下是我的Readme陈述算法思路,还没写完,先发上来,增加浏览量,之后部分我近几天补充。?Thelatestandfinalversionofthisalgorithm,itsrouteisBK\src\main\scala\BBB\Final.scala ✂️I'msosorrythatIdonn'thavesufficienttimetosortupmycode. I'llgraduallyupdateitinthenextfewdaysaftermyfirstCommit.?Community-detectionuse[spark+scala]toimplementCPM(ClusterPercolationMet

  • RESTful API 设计指南

    网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现"APIFirst"的设计思想。RESTfulAPI是目前比较成熟的一套互联网应用程序的API设计理论。我以前写过一篇《理解RESTful架构》,探讨如何理解这个概念。今天,我将介绍RESTfulAPI的设计细节,探讨如何设计一套合理、好用的API。我的主要参考了两篇文章(1,2)。一、协议API与用户的通信协议,总是使用HTTPs协议。二、域名应该尽量将API部署在专用域名之下。https://api.example.com如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。https://example.org/api/三、版本(Versioning)应该将API的版本号放入URL。https://api.example.com/v1/另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。四、

  • IJCAI杰出论文 | 在终身学习中使用任务特征做 Zero-Shot 知识迁移

    导读:2016国际人工智能联合会议(IJCAI2016)于7月9日至7月15日举行,今年会议聚焦于人类意识的人工智能,本文是IJCAI2016杰出学生论文(DistinguishedStudentPaper)。除了论文详解之外,我们另外邀请到哈尔滨工业大学李衍杰副教授进行点评。摘要任务间的知识迁移可以提升学习模型的表现,但是需要对任务间关系进行准确评估,从而识别迁移的相关知识。这些任务间的关系一般是基于每个任务的训练数据而进行评估的,对于从少量数据中快速学习每个连续任务为目标的终身学习来说,这个设定是效率低下的。为了减轻负担,我们基于耦合词典学习开发了一个终身强化学习方法,该耦合词典学习将高阶任务描述符合并到了任务间关系建模中。我们的结果表明,使用任务描述符能改善学习到的任务策略性能,既提供了我们方法有效的理论证明,又证明展示了在一系列动态控制问题上的进步。在只给描述符一个新任务的情况下,这一终身学习器也能够通过zero-shot学习使用耦合词典准确预测任务策略,不再需要在解决任务之前暂停收集训练数据了。1.引言通过重新使用其他相关任务的知识,转移和多任务学习(MTL)方法减少了独立任

  • 前端JS计算精度损失的问题

    前言JS的计算是会损失精度的,比如0.1+0.2//0.30000000000000004 1.2-1//0.19999999999999996 1.15*100//114.99999999999999 1.2/0.2//5.999999999999999复制方式1//两个浮点数求和 functionnum_add(num1,num2){ varr1,r2,m; try{ r1=num1.toString().split('.')[1].length; }catch(e){ r1=0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); returnMath.round(num1*m+num2*m)/m; } //两个浮点数相减 functionnum_subtract(num1,num2){ varr1,r2,m; try{ r1=num1.toString().split('.'

  • 『数据结构总结2:线段树』

    Preface 由于内容较多,这篇博客可能会龟速更新,以总结各类线段树为主. 原理 线段树是一种用于维护序列区间信息的数据结构,针对序列\(a_{1\simn}\),建立满足如下性质的满二叉树: 每个树上节点表示一个区间\([l,r]\),具有唯一根节点表示区间\([1,n]\) 对于每一个非叶子节点\([l,r]\),有且仅有两个儿子\([l,\mathrm{mid}]\)和\([\mathrm{mid}+1,r]\) 对于叶子节点\(p\),其表示的区间为单位区间\([x,x]\) 一般情况下,线段树的区间中点\(\mathrm{mid}\)取\(\lfloor\frac{l+r}{2}\rfloor\)以保证时间复杂度,特殊情况另外考虑. \(n=10\)情况下某一序列的线段树结构如图所示. 线段树用于解决广义的区间求和问题,定义如下: 给定序列\(a_{1\simn}\)和元素集合\(\mathrm{S}\),满足\(\foralli\in[1,n]\a_i\in\mathrm{S}\),定义加法运算符\(+:\mathrm{S}\times\mathrm{S}\rig

  • 浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

    主要内容: 1、IHT的算法流程 2、IHT的MATLAB实现 3、二维信号的实验与结果 4、加速的IHT算法实验与结果 一、IHT的算法流程 文献:T.BlumensathandM.Davies,"IterativeHardThresholdingforCompressedSensing,"2008. 基本思想:给定一个初始的X0,然后通过以下的阈值公式不断地迭代。 二、IHT的MATLAB实现 functionhat_x=cs_iht(y,T_Mat,s_ratio,m) %y=T_Mat*x,T_Matisn-by-m %y-measurements %T_Mat-combinationofrandommatrixandsparserepresentationbasis %s_ratio-sparsitypercentageoforiginalsignal %m-sizeoftheoriginalsignal %thesparsityislength(y)/4 hat_x_tp=zeros(m,1);%initializationwiththesizeoforiginal

  • 面试官问我TCP三次握手和四次挥手,我真的是

    候选者:面试官你好,请问面试可以开始了吗 面试官:嗯,开始吧 面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗? 候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手的流程吧 候选者:说完这两个流程,就能把TCP的状态给涵盖上了 面试官:可以吧 候选者:在说TCP的三次握手和四次挥手之前,我先给你画下TCP的头部格式呗(: 候选者:对于TCP三次握手和四次挥手,我们最主要的就是关注TCP头部的序列号、确认号以及几个标记位(SYN/FIN/ACK/RST) 候选者:序列号:在初次建立连接的时候,客户端和服务端都会为「本次的连接」随机初始化一个序列号。(纵观整个TCP流程中,序列号可以用来解决网络包乱序的问题) 候选者:确认号:该字段表示「接收端」告诉「发送端」对上一个数据包已经成功接收(确认号可以⽤来解决网络包丢失的问题) 候选者:而标记位就很好理解啦。SYN为1时,表示希望创建连接。ACK为1时,确认号字段有效。FIN为1时,表示希望断开连接。RST为1时,表示TCP连接出现异常,需要断开。 候选者:下面就先从三次握手开始吧,期间我也会在三次握手中涉及到的TC

  • Nginx 安装部署

    1.下载nginx及相关组件 wgethttp://nginx.org/download/nginx-1.10.2.tar.gz wgethttp://www.openssl.org/source/openssl-fips-2.0.10.tar.gz wgethttp://zlib.net/zlib-1.2.11.tar.gz wgethttps://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz 复制 安装c++环境 yuminstallgcc-c++ 复制 2.安装nginx #openssl安装 tar-zxvfopenssl-fips-2.0.10.tar.gz-C/opt/module/nginx/ cd/opt/module/nginx/ ./config&&make&&makeinstall #pcre安装 tar-zxvfpcre-8.40.tar.gz-C/opt/module/nginx/ cd/opt/module/nginx/ ./configu

  • Acorn,用于 Kubernetes 的轻量级、可移植的 PaaS

    Acorn是Rancher创始人推出的一个新的应用程序部署框架,它非常接近我对运行在Kubernetes上的开发环境的期望。 长期以来,我一直主张用一种简化的方法来开发和部署以Kubernetes为目标的应用程序。我之前强调需要一个可移植的、透明的、开源的应用程序层,该应用程序层将始终部署在开发人员笔记本电脑中的Minikube集群或在公共云中配置的大型多节点集群内运行。 作为高人气的Kubernetes发行版K3s的缔造者DarrenShepherd及其团队的开发成果,Acorn从Rancher身上继承了不少颇受云原生社区好评的设计原则。这是一套开源、简单、轻量化且可移植的框架,用于在Kubernetes上部署和扩展微服务。 使用Acorn的开发人员和运维人员无需了解Kubernetes的具体细节。如果他们了解Volumes、Secrets、ConfigMaps和Ingress等内部结构,那将非常棒。Acorn用自己的类JSON领域特定语言(DSL)抽象了Kubernetes的复杂性,以描述基于微服务设计模式的现代应用程序。 像CloudFoundry这样的PaaS的目标是将代码推

  • vue 导出数据到excel

    实现功能:后台返回JSON,将JSON数据倒出到excel 1.安装依赖   npminstall-Sfile-saverxlsx   npminstall-Dscript-loader 2.引入插件      我的文件目录:    3.调用方法 先封装: 1toolObj.export2Excel=((header,val,tableData)=>{   2require.ensure([],()=>{     3const{ 4export_json_to_excel 5}=require('../../vendor/Export2Excel'); //根据目录结构决定    6consttHeader=header;     7constfilterVal=val;     8constlist=tableData;     9constdata=toolObj.formatJson(filterVal,list);     10export_json_to_excel(tHeader,data,'列表excel');   11}) 12}), 13toolObj.

  • Load Average学习

    今天网上冲浪,偶然看到阮一峰老师的文章,解答了平时的一个疑惑。 其实挺佩服阮一峰老师的,可以把晦涩的东西梳理的很清楚。下面简单记录下里面的核心内容。 核心 查看负载命令 w uptime top LoadAverage含义 1分钟、5分钟、15分钟内系统的平均负荷。 CPU完全空闲的时候,平均负荷为0; 单个CPU核心工作量饱和的时候,平均负荷为1。 2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。** 查看电脑核心 grep-c'modelname'/proc/cpuinfo lscpu 参考文献 理解Linux系统负荷来自为知笔记(Wiz) 网络知识搬运/梳理小工

  • hdu 1839 Delay Constrained Maximum Capacity Path(spfa+二分)

    DelayConstrainedMaximumCapacityPath TimeLimit:10000/10000MS(Java/Others)    MemoryLimit:65535/65535K(Java/Others)TotalSubmission(s):1790    AcceptedSubmission(s): 577 ProblemDescription ConsideranundirectedgraphwithNvertices,numbered from1toN,andMedges.Thevertexnumberedwith1correspondstoaminefrom wheresomepreciousmineralsareextracted.ThevertexnumberedwithN correspondstoamineralsprocessingfactory.Eachedgehasanassociatedtravel time(intimeunits)andcapacity(in

  • js中元素操作的有关内容与对比

    以下A:代表原生jsB:代表jQuery 1创建元素/节点 A: 元素节点-createElement() 文本节点-createTextNode() 例如: vara=document.createElement("a"); a.href=http://baidu.com; a.innerHTML="gotobaidu"; 复制 B: $(HTML代码) 例如: $li=$("<ahref="http://baidu.com">gotobaidu</a>); 复制 2追加新元素节点 A: parentelement.appendChild(elem); 例如: varpara=document.createElement("p"); varnode=document.createTextNode("这是新段落。"); para.appendChild(node); 复制 B: append(content) appendTo() 复制 3删除节点 A: parentelement.removeChild(子节点) 复制 B: remove()【删除自身以

  • 给新建的Cocos2d-x 3.X的Win32工程添加CocoStudio库

    1、我们在VS中找到"解决方案资源管理器",在解决方案"HelloCocos"上点击右键,选择添加现有项目.在弹出的对话框中选择*************\cocos2d\cocos\editor-support\cocostudio\proj.win32\libCocosStudio.vcxproj然后继续添加*************\cocos2d\extensions\proj.win32\libExtensions.vcxproj然后继续添加*************\cocos2d\cocos\ui\proj.win32\libGUI.vcxproj 2、然后我们在HelloCocos项目上点击右键选择添加引用点击游戏项目右键引用 添加新的引用将刚添加的项目都引用上 3、然后项目属性(点击右键选择属性)中选择"配置属性"=>"C/C++"=>"附加包含目录"并编辑.添加下面几行 $(EngineRoot)cocos$(EngineRoot)extensions$(EngineRoot)cocos\editor-support\$(EngineRoot)cocos

  • 流程控制语句

    条件语句 if语句 age=int(input()) ifage>=18: print('adult') else: print('teen') 复制 注意代码块对齐 if..elif语句 age=int(input()) ifage>=18andage<70: print('adult') elifage>=70: print('older') else: print("teen") 复制 循环语句 for循环 r=range(1,10)#左闭右开 print(r) print(type(r)) print(list(r)) sum=0 n=10 foriinrange(1,n+1): sum+=i print(sum) 复制 输出结果: range(1,10) <class'range'> [1,2,3,4,5,6,7,8,9] 55 复制 while语句 sum=0 n=10 i=1 whilei<=n: sum+=i i+=1 print(sum) #输出结果:55 复制 拓展 for..else执行完for循环体之后就执行el

  • Spring定时器——时间设置规则

    平时经常有一些写Spring定时器的需求,但是每次要设置定时器的时间的时候,老是既不住,到处找别人的博客又各种不爽,所以就自己记录一份吧,顺便整理一下。 org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpression属性。 cronExpression规则 一个cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下: 秒 分钟 小时 月份中的日期 月份 星期中的日期 年份 0-59 0-59 0-23 1-31 1-12或JAN-DEC 1-7或SUN-SAT 1970-2099(可以没有) 几个示例 表达式 释义 0010,14,16**? 每天10点、14点/16点执行 00,15,30,45*1-10*? 每月前10天每隔15分钟 300011?2012 2012年1月1日0点30分执行 008-5?*MON-FRI 每个工作日的早8点到晚5点 各个时段

  • 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历

    二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科) 给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{24130}插入后,得到一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;而“4是2的左孩子”、“1和3是兄弟结点”都是不正确的。 输入格式: 输入在第一行给出一个正整数N(≤100),随后一行给出N个互不相同的整数,数字间以空格分隔,要求将之顺次插入一棵初始为空的二叉搜索树。之后给出一个正整数M(≤100),随后M行,每行给出一句待判断的陈述句。陈述句有以下6种: Aistheroot,即"A是树的根"; AandBaresiblings,即"A和B是兄弟结点"; Ai

相关推荐

推荐阅读