当前位置:   article > 正文

2022,Q1(Applied Soft Computing),Semantic schema based genetic programming for symbolic regression_基于语义的遗传规划

基于语义的遗传规划

在这里插入图片描述


ABSTRACT

尽管遗传规划 (Genetic Programming,GP)在各种符号回归应用中取得了经验上的成功,但在该领域中,GP 并不被认为是一种可靠的问题求解技术。GP 表示和算子的非局部性导致其搜索过程失效。本研究采用语义图式理论来控制和指导 GP 搜索,提出了一种基于语义图式理论的局部 GP 遗传规划 (SBGP)。SBGP 将语义搜索空间划分为语义模式,并将搜索偏向于种群的显著模式,逐渐向最优解方向发展。为了在显著模式周围执行局部搜索,提出了几种语义局部算子。结合模式演化作为全局搜索,局部模式内搜索为 SBGP 提供了一种高效的探索-利用控制机制。为了评估所提出的方法,我们使用了六个基准,包括合成问题和实际问题。所得误差一方面与最佳语义遗传规划算法进行比较,另一方面与数据驱动的分层学习方法进行比较。实验结果表明,SBGP 在 6 个基准测试中的 4 个测试中优于所有的方法,在第一组实验中达到 87%,在第二组实验中达到 76%。

1. Introduction

作为进化算法的一种,遗传编程受到自然进化的启发。尽管其创新的动机是实现自然进化在问题求解中的成功,并已被应用于解决许多现实世界的问题[1-4],但该算法的一些特征与自然进化相矛盾,并使遗传编程无法在搜索空间中进行有效的搜索。非局部性和非渐进性优化是此类特征的重要样本。

自然演化的特征之一是其渐进性。根据达尔文进化论,进化是一个缓慢但渐进的过程,在这个过程中,环境相容性通过对个体的逐步修正而发生。自然选择被认为是最重要的进化机制[5]。达尔文说,自然选择只有在结果发生时才会发生,只是发生了细微的变化。进化永远不可能有显著的、突然的突变或突变。它应该以小的、稳定的、确实是缓慢的步骤进行[6]。他还考虑到了表现型变化的渐进性。虽然渐进主义是达尔文进化论的主要原则之一[7],但它并没有被纳入标准的遗传程序设计中。

局部性既是表示的特征,也是算子的特征。先前的研究[8-14]表明,表示的局部性和遗传算子对进化算法有显著的影响。表征的局部性是指基因型的微小变化引起表型的微小变化。这意味着邻域在基因型-表型作图过程中被保留下来,称为基因型-表型图谱的连续性。当个体的数据结构与其等价函数之间存在因果关系时,该映射是连续的。另一方面,当一个遗传算子所产生的后代在语义上接近父代时,就被称为局部遗传算子。在进化算法领域内的非局部性是在各种标题下陈述的,例如缺乏因果关系和探索与利用之间的不平衡。

标准遗传程序设计的表示不是局部的[15],因为程序的微小变化会引起其行为的剧烈变化[16]。例如,在图1中,一个个体的树视图 ( ∗ x ( ∗ x , x ) ) (^*x(^*x,x)) (x(x,x))表示 F 1 ( x ) = x 3 . F_1(x)=x_3. F1(x)=x3. 如果把这个个体的根中的*符号(乘法)换成+符号(加法),得到的个体就是 ( ( + x ( ∗ x ) ) ) . ((+x(*x))). ((+x(x))).。虽然基因型发生了微小的变化,但个体的等值函数由 F 1 ( x ) = x 3 F_1(x)=x_3 F1(x)=x3变为 F 1 ( x ) = x 3 F_1(x)=x_3 F1(x)=x3,在语义上与 F 1 F_{1} F1有显著差异。

在标准遗传规划中,算子也具有弱局部性(因果性) [15]。在遗传程序设计中,通常情况下,通过重组而产生的后代在句法和语义方面都与他们的父母有显著差异。这些算子非局部性的一个本质原因是遗传规划中的语义单元不明确。在遗传算法中,基因扮演着语义单元的角色。相反,在遗传编程中,一个节点本身没有独立的意义,而是根据上下文变得有意义。因此,必须在子树和构建块中寻求几乎独立的含义,考虑最终解决方案的下解。然而,语义构建块仍然没有具体的定义,基因编程的主要算子重组也没有子树的语义边界信息。因此,它随机地选择交叉点,并且通常会破坏构建块。因此,子代与父代存在显著的语义差异。这种差异是不利的,因为亲本的适合部分往往被破坏,而不是结合在一起产生更好的后代。换句话说,进化算法的主要机制是逐步发现部分解及其自动组合(使用运算符),以获得更完整的解。然而,当应用于遗传编程的树表示时,这种方法变得非常具有挑战性,因为重组改变了基因组或语义单元,并在很大程度上减少了该算子有用的机会[17]。局部性(因果性)是一个关键的特征,对进化算法的探索和开发是有效的[18]。一个算子的局部性越强,它的开采性越大,局部性越弱,它的勘探性越高[15] .反过来,更高的探索导致了种群中更大的多样性;并且较高的开发导致较低的多样性[19]。

在本文中,我们提出了基于语义模式的遗传规划(SBGP)算法。为了解决遗传规划的非渐进进化问题,它将语义搜索空间划分为若干子空间,并将搜索偏向其中一个子空间,逐步向最优解迈进。该算法利用图式理论定义划分,将语义搜索空间划分为更小的子空间。为了使搜索偏向于模式,它引入了新的局部算子。

虽然许多研究人员使用遗传规划进行分类[20-22],但本文主要关注符号回归问题。符号回归的主要思想是寻找描述变量关系的方程。这些公式可以提供有科学意义的模型,特别是当结合领域知识. 尽管符号回归的思想由来已久,但在过去的十年中,它已经开始对医学、物理学、化学、生物学和工程学等真实世界研究领域产生不可忽视的影响。因此,开发有效的符号回归算法可以在成功解决广泛的现实问题方面取得重大进展。在本文中,除了合成的基准,我们将所提出的方法应用于四个来自生物学、工程学和药代动力学领域的真实世界问题,以显示SBGP在真实世界应用中的部署能力。

本文的其余部分组织如下。第一节是对研究问题的介绍。第二节解释了必要的背景概念。第三节介绍了相关的研究工作。所提出的方法见第4节。第五部分报告了实验结果,并对实验结果进行了分析。最后,第6节是本文的结论。

2. Background

在这一部分中,首先描述了图式理论,然后阐明了语义的概念,最后介绍了语义图式。

2.1. Schema theory

模式是一种相似性模式,匹配一组搜索空间点。模式定理描述了模式实例的数量是如何通过演化而变化的。基于遗传算法的图式理论[ 23 ],Koza于1992年提出了第一个遗传规划的图式理论[ 24 ]。他定义了一组完整的子树作为模式,例如 H = ( + x y ) , ( + x ( × x y ) ) H=(+xy), (+x(×xy)) H=(+xy),(+x(×xy))。一个个体匹配 H,如果它包含两个子树。在(1)中给出了模式定理的一般形式。

其中 E[m(H, t + 1)] 是模式 H 在 (t + 1) 代的期望实例数,M表示种群规模,新产生的个体实例化H (转移概率)的概率记为 α α α [24]. 文献[24]中的图式理论可以用来计算属于某个特定模式的个体的期望数量的下界。

The building block hypothesis 最早由 Goldberg [25]提出;根据这一假设,GA通过组合 building blocks 起作用, low order, short, and highly fit schemas [24].。该概念在多个著作中被扩展以 semantic building blocks.。在[26]中,这些 building blocks 被认为是语义空间中具有高价值的点,在群体中频繁出现。

[26] Z. Zojaji, M.M. Ebadzadeh, Semantic schema theory for genetic programming, Appl. Intell. 44 (2016) 67–87.

2.2. Semantics

Semantics 是一种确定句法符号概念的知识[27],证明了树到底做了什么[28]。树的语义是指它的行为。布尔域中树的语义由Mc Phee等人在2008年定义[29]。它们将语义表示为树对所有可能的输入值组合的输出值。然而,在实数域中,由于存在无穷多个可能的输入情况,无法计算所有可能输入的树输出。 尽管对于实值域,语义并没有一个被广泛接受的定义,但在包括[27、29 ~ 33]在内的多个研究中,对于各种输入适应度情况,都将树的语义作为其输出向量。这个定义被称为采样语义[30]。根据这个定义,一个 N N N维向量表示语义空间中的每棵树,其中 N N N表示适应值的个数。一些研究者[34-36]不关注程序的输出,而是利用其执行的行为特征来定义实值域的语义。在[26]中,个体的语义是通过其输出和目标之间的归一化互信息来描述的。

2.3. Semantic schema

如前所述,一个传统的模式定义是指搜索空间中共享一些句法特征的点的子集[24],我们称之为句法模式。虽然句法图式的实例在句法上是相似的,但它们的行为并不类似于[26、37]。由于有几个主要问题依赖于句法图式理论来模拟人群的行为,语义图式理论最初在[26]中被提出。语义图式可以可靠地描述语义相似的个体,这些个体也表现出相似的行为。在进一步的研究[ 37、38 ]中,作者在泛化性和计算复杂度方面对他们提出的模式进行了改进。在[38]中对这些模式进行了全面的比较。正如文献[38]所讨论的,基于信息聚类的语义模式(ICSS)在泛化性和计算复杂度方面是最好的语义模式。在这项工作中,树的语义概念被认为是其输出和目标之间的互信息。为了对模式实例进行建模,提取并使用了语义构建块。语义构建块是指当这些个体的子树被映射到语义空间时,在群体中的有前途的个体中频繁出现的语义值。积木依赖种群中的有前途的个体进行传播,并组合产生目标解。然后,一种名为基于信息的聚类的新方法被用于聚类发现的种群的构建块。

[38] Z. Zojaji, M.M. Ebadzadeh, Semantic schema modeling for genetic programming using clustering of building blocks, Appl. Intell. 48 (2018) 1442–1460.

一个语义模式由两个模块组成:(1)一个语义构建块的聚类集合(2)一个描述构建块在模式实例中分布模式的模式实例化函数。

为了提取任意总体的主要模式,称为显著模式,需要采取一些步骤,如图2所示。首先,需要指定初始模式实例,这些实例被认为是具有超过群体平均语义的个体。接下来,语义积木从初始样本集合中提取,并对一些模式相关的参数进行了估计。之后,基于信息的聚类被应用于提取的积木块。然后根据学习到的模式参数指定实例化函数。该函数考虑了一个构建块对其簇的影响。相应地,一个语义图式是一个集合,包括所有个体,这些个体都有足够多的来自不同聚类的有效构建块。关于基于信息聚类的语义模式的更多细节,参见文献[38]。

3. Related works

在遗传程序设计中集成语义已有大量的研究。他们主要表明,语义的使用可以提高这个算法的能力。正如第2.2节所讨论的那样,研究者们提出了各种各样的语义定义。以前的大多数遗传编程版本都忽略了树的语义,并且只在语法空间中操作。然而,近年来语义方法在遗传程序设计中的应用得到了广泛的关注和研究。大量的工作集中在将语义融入计算多样性、初始化种群、选择策略和膨胀控制机制等方面,如3.1节所述。在语义遗传编程中进行的许多研究都致力于语义算子的开发。这些研究分为两个主要组[28]:分别在3.2和3.3节中描述的间接和直接方法。前者以试错为基础,利用操作符,在句法层面操纵树木产生新的后代。如果生成的树满足特定的语义约束,则进入下一代种群,这些语义约束通常定义在语义空间中的多样性、局部性和几何关系。后者表示在语义空间中直接产生子代的算子。

[28] L. Vanneschi, M. Castelli, S. Silva, A survey of semantic methods in genetic programming, Genet. Program. Evol. Mach. 15 (2014) 195–214.

3.1. Semantic methods

一些研究人员对语义多样性进行了研究,他们根据适应度值的分布[39]或运行时的树行为[40]来定义这个概念。在[41]中,基于模型的转换语义,提出了一种新的语义多样性度量。许多研究者[42]得出结论,具有语义多样性的初始种群可以提高遗传编程的性能。Pawlak and Krawiec [43]提出了一种初始化种群的语义方法,适用于具有几何语义重组的遗传规划[31]。Galvan-Lopezet al. [44]介绍了一种在选择过程中考虑 trees’ semantics 的简单方法,旨在增强语义多样性。 Ruberto et al. [45]提出了一种新的基于动态目标的语义遗传规划算法 SGPDT。Nguyen和Chu [46]提出了两种基于语义近似的方法来控制遗传编程中的膨胀。Miranda等人[47]提出了一种降低几何语义遗传规划空间维数的实例选择方法。

[42] L. Beadle, C.G. Johnson, Semantic analysis of program initialisation in genetic programming, Genet. Program. Evol. Mach. 10 (2009) 307–337.

3.2. Indirect methods

一些研究[29、32、48]是基于多样性约束的间接方法进行的。这样,子代就应该在语义上区别于他们的父母。一些研究中的语义约束是基于局部性考虑的。这类方法的目标是产生与父母没有显著语义差异的后代。Nguyen等人[49]针对布尔问题提出了各种语义感知交叉(SAC)。之后,他们对这些算子进行了扩展用于实数域[50]. 他们没有使用精确的语义,而是使用了一种近似的语义,其中语义包含了树对一组随机输入样本的输出。后来,作者又提出了基于语义相似度的交叉(Semantic Similarity-based Crossover,SSC) [30],它强调交叉的局部行为,交换父代中语义不同但不显著的一些子树。随后,提出了最语义相似度交叉(MSSC)的改进方法[51],并最终引入了语义变异[30]。文献[52]分析了SSC对种群多样性的影响。作为这项研究的结果,Nguyen等人[53]发现增加语义局部性会提高遗传编程的性能。

已有的一些研究集中于几何语义算子[27]。在这些方法中,运算符被设计为允许产生的后代出现在父代之间的语义空间中。Krawiec and Lichocki [33]认为完全几何交叉产生的后代会优于至少一个父代。由于基因型-表型映射的复杂性,他们提出了近似几何交叉(AGC)。在这种交叉中,与父代语义相似度最大的子代将被接受,即使它们并不完全被置于父代和子代之间。此外,一个局部几何语义交叉[27]被提出,它产生了一个所有可能的子树的集合,直到特定的深度。在选择父代子树进行交换后,从 the bank 选择与其语义平均值最接近的子树,并在子代中进行替换。后来,Krawiec [54]提 出了产生中间子代的交叉算子。然后,引入两个近似的几何交叉算子AGX和RDO [55、56],使用语义反向传播来选择合适的子树进行交换。在AGX算子中,首先计算父代的输出平均向量,记为M。然后选择交叉点,利用反向传播,在父代中计算交换子树的语义,使子代尽可能地与M相似。然后在预建库中搜索与计算语义最相似的子树,并将其替换为父代子树。RDO算子应用在一个父节点上。首先,它在父节点中随机选择一棵子树。然后,利用反向传播,确定该子树的语义,在父树中替换后,该树的输出将与问题的目标具有最高的相似性。

3.3. Direct methods

直接语义方法属于在语义层面直接产生后代的方法。直接方法的思想最早由Moraglio等人在2012年提出[31]。他们提供了精确的几何算子,称为语义几何杂交(SGX),直接搜索语义空间。在符号回归中,语义空间中重组的结果是父代语义的加权平均。子代在句法空间中的语义可以通过生成一棵树来实现,该树计算父代词根上方的加权平均值,导致子代在每一代的规模都面临极度的增长。一些研究人员[33、55]提出了近似几何语义重组来克服这个问题,它具有精确几何算子的良好性能。在文献[31]中,控制程序指数增长的一个策略是减少重组过程中产生的子代的大小,这在文献[57]中已经被研究过。另一种提出的策略是直接搜索语义空间,同时保存初始种群,并在进化过程中对其进行修改[58]。在该方法中,经过进化,种群的最佳个体是通过对其前辈从第一代到最后一代施加一些变化而产生的。这种遗传规划后来在一些真实世界的问题上进行了测试,如[59、60]。此外,在语义空间[61]中设计并引入了几何变异,产生了比父代更小或大小相等的后代。后来,Angwin等人[62]提出了一种子树语义几何交叉(Semantic Geometric Crossover,SSGX ),用它的一个较小的子树来近似父代的语义,然后应用SGX。此外,在该方法中,标准交叉具有发生的概率,从而可以保持较高的多样性。文献[63]研究了种群规模对几何语义遗传规划的影响,文献[64]提出的算法对算子概率进行了调整。

3.4. Layered learning genetic programming

下面将介绍一些最好的遗传规划版本,它们试图通过数据分层逐步进化,具有较高的泛化性,并用于与所提方法的比较。

随机抽样技术(Random Sampling Technique,RST)由 Gonçalves et al. 提出,用于控制遗传规划中的过拟合[65]。RST在每一代中使用一个随机的训练样本子集。因此,在不同的训练样本子集上具有较高性能的成员在种群中生存的机会更高。卡斯泰利等人[66]设计了一个关于遗传编程学习和泛化的定量测试,从而提出了一个函数复杂性的标准,称为"基于图的复杂性" (GBC)。这个准则是基于这样一个思想,即更复杂的函数应该具有比更光滑的函数更小的曲率。他们在这个准则的基础上引入了一个适应度函数来增加GP的泛化能力。Hein等人[67]研究了增量采样对基于阶段的分层学习的影响。随后他们对这种方法进行了改进,使用渐进采样(Progressive Sampling,PS)来确定初始集和层数。PS提供了一种处理大数据的方法。他们的结果表明,分层学习和增量采样可以在不损害泛化能力的前提下提高学习速度。一种改进的遗传编程提高泛化性的版本是VBLL-GP [68],通过对初始数据取根生成一些更简单的数据集。在进化初期,使用最简单的数据集,在进化过程中,逐渐向算法提供更复杂的数据。SGP [69]是GP的一个渐进变体,它利用树的统计信息来提高泛化能力。引入一棵制作良好的树作为树,当树从叶子移动到根时,其输出与目标的相关性增加。SGP搜索在某种程度上是有限的,以找到尽可能好的树。因此,它限制了树的复杂性。最近,Hosseini Amini et al. 提出的 RCGP [70] 是基于 the imperialist competitive algorithm 开发的GP的变体。RCGP还得益于一组预定义的规则,以产生更好的后代。在该算法中,首先对 countries 进行局部搜索,然后通过 assimilation and revolution. 等操作组合成全局搜索。

4. Proposed method

为了解决遗传规划的非渐进进化问题,我们提出了SBGP,它将语义搜索空间划分为若干个子空间,并将搜索偏向于其中一个在进化过程中不断变化的子空间,逐步向最优解前进。这种方法符合所提出的自然进化理论。我们引入的子空间暗示了自然界中的"物种"。在本文中,我们利用模式在GP进化中扮演物种概念的角色,使得繁殖在一个物种中发生,物种逐渐进化。在Thompson [71]给出的定义中,一个物种是利用一系列恒定的和可诱导的性质检测出来的,并通过遗传和亲缘关系相连接的一群个体。在自然界中,重组大多发生在一个物种内部以及属于父本物种的后代中。事实上,随着相当长的时间的推移,从一个物种到另一个物种的进化在某些特定的情况下很少发生,因为所有的动植物都是从原始的单细胞生物中出现的。该方法考虑了物种的更替和进化,符合自然进化过程。

我们利用图式理论将语义搜索空间划分为子空间。本文将地方性视为图式的一员。它不考虑在父母之间或靠近父母的地方产生后代,而是将父母和他们的后代都作为图式的成员,以便他们产生有意义的局部关系。简而言之,由于以下原因,选择了图式理论作为遗传规划逐步搜索的工具:(1)从搜索空间中提出子空间;(2)具有很强的理论背景;(3)以数学方程的形式对算子的作用进行建模。

在将语义搜索空间划分为子空间后,下一步将通过引入局部算子来实现偏向模式的搜索。为了使遗传规划的搜索具有局部性,我们引入了若干个局部算子,每个算子都有一个发生的概率。事实上,合适的算法的前提条件是存在 schema-biasing 的局部算子。

4.1. SBGP algorithm

在这一部分,介绍并评价了基于模式的遗传程序设计(SBGP)。SBGP算法利用图式理论将空间划分为若干子空间。此外,所提出的语义模式是基于构建模块,即个体中产生适当语义特征的一些基因。产生与图式相匹配的个体,意味着促使操作者产生主动将图式的构建块纳入自身的子代。图3给出了SBGP算法的流程图。该算法的各个步骤如下所述:

  • Generating the initial population 初始种群的生成初始种群的生成是在第一步中使用有限深度的半斜坡法生成的。模式的初始样本应该在这个种群中被识别。
  • 语义图式抽取(Semantic schema Extraction):一旦初始群体产生,语义高于群体平均值的个体被作为图式的初步样本,ICSS图式从上述群体中抽取,如图2所示。更准确地说,首先,从种群中提取构建块并进行聚类。然后,将得到的聚类用于形成隶属度函数和识别模式样本。
  • 生成具有模式偏见的下一代(Generating the next generation with schema bias):在这一步中,通过考虑相应的发生概率,使用下一节中引入的局部算子。此外,标准的重组和突变也有机会发生,以保持种群的多样性。引入的局部算子有的需要模式实例作为父代,有的对任意父代进行操作,有的生成的样本没有父代。实际上,在这一步中,搜索机制应该利用搜索空间;然而,在种群多样性较低的情况下,更多的开发会导致早熟收敛。因此,我们调整了使用标准重组和变异的概率与种群多样性成反比。由(2)式可知,这种多样性是一种语义多样性,计算为群体个体语义的标准差。此外,(3)给出了使用标准算子的概率。该概率在进化过程中自适应计算。在进化初期,当种群多样性较高时,使用标准算子的概率较低。随着世代的推移,这种概率会增加。更多具有标准算子的子代被产生,以为下一个模式建立必要的潜力,并在探索和利用之间提供适当的平衡。
  • 模式转变的条件(Conditions for schemas transition): 在自然进化中,从一个物种到另一个物种的转变是由于基因频率的变化、生态环境的变化和强烈的突变等事件的影响而发生的。各种遗传学理论认为,这种转变可能是平滑的(系统渐变论),也可能是突然的(间断平衡论) [72]。前者相当于对新图式的隐性偏见,后者相当于对图式的显性变异。考虑到图3中的流程图,在每一代中都应该评估过渡到下一个模式的条件。这些条件应该以一种方式来定义,以表明模式内的演化是否充分发生。模式内的局部进化越大,被利用的越多,种群多样性越少。因此,我们将迁移标准定义为群体的语义多样性,如式(2)所示。之后,diversityRatio 表示第 g 代当前种群多样性占最近世代平均多样性的比例,如式(4)所示。多样性在滑动窗口上取平均,长度为w。如果 diversityRatio 小于阈值 diversityThr,则从种群中提取新模式。考虑到种群的平均适应度随着世代的增加而增加,新模式的适应度高于以前的模式。事实上,图式本身也在进化。图式的转变推动搜索转向探索,以考虑搜索空间的新部分。
  • Fitness: 在SBGP中,进化是在语义空间中进行的,这导致发现的个体在语义上等于最优解,并且高语义值并不一定意味着低误差。由于SBGP是针对符号回归域提出的,因此在适应度计算之前对个体的输出进行线性修正。这种修正在分类等其他领域是无效的,但可以在进一步的研究中定制。

为了评估种群中个体的适应度,计算每个个体的线性回归系数,并将其纳入个体的函数中。然后将修正后个体的均方根误差(RMSE)作为性能度量。使用回归变换对具有高语义值的个体进行线性校正,也可以获得以RMSE计算的高适应度。然而,这种转换并不涉及树的基因型空间,而只考虑个体的适合度计算。

对于输入样本,树 t t t 的输出用 Y Y Y 表示,目标输出用 Z Z Z 表示,转换后的树的输出用 Y ′ Y' Y 表示,用 (5) 式计算:

其中,cov和var符号分别表示协方差和方差运算,α和β是最初应用于树的输出的回归系数。然后利用 Y ′ Y' Y 计算误差,作为树的变换输出。

SBGP算法的伪代码如图4所示。在该伪代码中,遗传规划的参数、训练数据和验证数据作为输入,并返回最佳个体作为输出。

4.2. Local operators

本文引入了几种局部算子来对遗传规划的搜索进行局部化。在SBGP算法中,每个都有一个发生的概率。这些操作者鼓励积木发生并防止其破坏。提出的算子有:1.间接局部重组算子,2.间接局部变异算子,3.直接局部变异算子,4.无亲子产生算子,下面分别阐述。局部重组和变异算子的目标是使子代偏向于模式。无父子产生算子的目的是生成作为模式实例的个体。

4.2.1. Indirect local recombination operator (ILRO)

这种重组是一个单子重组,它将两个图式实例的父母作为输入,并产生一个后代,它本身就是图式的一个实例。该算子采用试错法,在父代中寻找重组点,其中至少有一个子代通过这些点的重组成为模式的样本。如果两个子代都是模式的样本,则选择该模式中成员值较高的一个。图5给出了这种重组的伪代码。

如图所示,子代应该有一个最大的允许大小。对重组选择的子树进行语义等价性检查,保证重组产生与父代语义不同的个体。因此,该算子增加了语义的多样性,导致了新的语义空间点的探索。

4.2.2. Indirect local mutation operator (ILMO)

该算子得到一个模式实例作为父代,并应用子树变异生成模式的另一个实例作为子代(图 6)。为了做到这一点,父节点的一个随机节点被选择,然后被一个新的随机生成的子树代替。这个过程重复进行,直到生成的后代也是一个模式实例。如果在maxCount尝试后,没有生成图式-例示子树,而是生成偏向于构建块的子树,而不是随机子树。重复突变生成,直到最终的子代成为模式样本。为了生成随机树,生成 RandomSubTreeWithBBInTerminals 函数将构建块视为终端。这样就造成了树的产生工艺要包含更多的积木块,增加模式成员的概率。该算子试图将模式实例生成为没有任何偏向的后代,保持种群的高多样性。在这一目标无法实现的情况下,操作者就变得有失偏颇。通过深度( mp )函数计算根与变异选点之间的深度( mp )。通过从最大深度中减去这个值,确定最大允许深度( offDepth )。在生成随机子树时,考虑了这个深度。下面的例子演示了应用间接局部算子的示意图。

Example

以函数 x 4 + x 3 + x 2 + x x^4 + x^3 + x^2 + x x4+x3+x2+x为目标,考虑一个基于两个语义构建块簇定义的语义模式H,以及一个实例化函数,用于检查这些簇在树(语义图式的详细定义见2.3节)中的活动发生情况。每个聚类中心是一个语义构建块,它与一棵被称为代表树的最小树相关联。令 c 1 = x 3 c_1 = x_3 c1=x3 c 2 = x 2 + x c_2 = x_2 + x c2=x2+x 为聚类中心 C 1 C_1 C1 C 2 C_2 C2的代表树, 分别。如图7所示, P 1 P_1 P1 P 2 P_2 P2 作为模式H的两个实例,其中簇1和簇2的构建块是主动发生的。从图中可以看出, P 1 P_1 P1 中同时包含 c 1 c_1 c1 c 2 c_2 c2 P 2 P_2 P2 包括 x 3 + 1 x^3 + 1 x3+1 2 x 2 + 2 x 2x^2 + 2x 2x2+2x,在语义上分别等于 c 1 c_1 c1 c 2 c_2 c2。根据图5中提供的ILRO算法,交叉点是随机选择的,直到找到一对点,应用交叉产生至少一个后代,即H的一个实例。例如, P 1 P_1 P1 P 2 P_2 P2中的第一个被选中的点是 X O P 1 XOP_1 XOP1 X O P 2 XOP_2 XOP2。由此产生的后代 O 1 O_1 O1 O 2 O_2 O2都不是图式实例。因为交叉点的选择使得每个父代的一个构建块被破坏,并且生成的树不包含H的一个所需的簇中的任何子树。

同时,如果选择交叉点 X O P 1 ′ XOP^′_1 XOP1 X O P 2 ′ XOP^′_2 XOP2,则会产生 O 3 O_3 O3 O 4 O_4 O4 O 3 O_3 O3不包含聚类 C 1 C_1 C1的任何子树,但 O 4 O_4 O4 x 3 x_3 x3 x 2 + 2 x x^2 + 2x x2+2x两个子树组成。语义上分别等于 c 1 c_1 c1 c 2 c_2 c2。因此, O 4 O_4 O4是H的一个实例。ILRO的作用是找到随机的交叉点,如 X O P 1 ′ XOP^′_1 XOP1 X O P 2 ′ XOP^′_2 XOP2,导致至少一个模式实例。对于如图6所示的算符ILMO,类似的论点也成立. 如果将选择的变异子树替换为随机子树,使得构建块被破坏,则子代不再是模式瞬间,而应生成其他子树。如果子树的交替生成和替换没有导致模式实例的产生,则子树的生成偏向于父节点上下文中不存在的构建块簇。例如,如果在 P 1 P_1 P1中选择 X O P 1 ′ XOP^′_1 XOP1作为突变点,则需要将其替换为包含簇 C 1 C_1 C1的构建块的子树。

4.2.3. Direct local mutation operator (DLMO)

直接局部变异是一个产生子代的算子,它是模式的一个实例,来自任意父代。图8给出了该算子的伪代码。初始时,该算子在父代中选择一个节点进行变异。然后,它识别出树的上下文中的构建块。由" ‘语境’ ",我们指的是删除选择的子树进行变异后保留下来的树的一部分。此时,将父节点中没有活跃成员的聚类中心添加到必要的BBs集合中,并生成偏向该集合的随机子树。在生成随机子树时,给定树的剩余深度,决定是否可以选择构建块。在可以选择构建块的深度处,考虑构建块、功能和终端的概率,以保持较高的种群多样性。

4.2.4. Parentless child production operator (PCPO)

这个操作符直接生成一棵树,它是指定模式的一个实例,而不需要任何父节点(图9 )。运算符实例化模式生成子代。为了达到这个目的,从终端和积木块的并构造的集合中生成一棵随机树。 Building blocks 有机会以ε的概率被选为终端。当插入一个积木时,首先,随机选择一个积木簇。然后,从该簇中随机插入一个块到树中。然后,将该簇从剩余簇的集合中移除。该算法有助于生成一些子代,这些子代包括来自不同簇的构建块。所提到的随机树是在一个名为GenerateRandomTreeWithRemainingClusters的递归函数中生成的;然而,考虑到树中所有簇的存在并不是必须的,PCPO函数检查模式的成员关系,以重建不是模式样本的树,这种做法受到了基因工程在生产无亲本人工生物方面的进展的启发。

4.3. Generalization

为了保持SBGP的泛化能力,除了训练集和测试集外,我们还使用了一个验证集来避免过拟合。更准确地说,验证集的使用有两种方式:(1)停止准则在算法的每一代中,在验证集上计算种群最佳个体的误差。如果这个误差大于上一代的误差,则算法终止,因为更多的训练导致过拟合,随后增加了测试误差。(2)精英化:在每一代中,验证集种群中的最优个体进入下一代而不发生任何变化,从而其在种群中的传播可以使种群朝着更好的泛化方向转变。除了使用验证集之外,子代对图式的偏见导致个体的生产在语义空间和基因型空间都受到约束。这反过来又防止了树木的无节制生长和对训练集的过拟合。

5. Experimental results

为了评估所提出的方法,我们将SBGP的性能从训练误差,测试误差和树的大小方面与许多版本的遗传编程进行了比较。这些版本的遗传编程分为两类,一类是标准遗传编程,另一类是标准遗传编程。第一类包括语义遗传编程的最佳版本。第二个算法涉及那些通过数据驱动的分层学习在某种程度上执行渐进主义的算法,并专注于算法的泛化性。

主要的性能衡量指标是最优个体的RMSE误差。此外,在进化过程中,研究最佳树的大小和语义的变化。每一代中占主导地位的模式样本的数量,以及模式抽取的速率也是一些需要研究的项目。此外,将所提方法的局部性与标准遗传规划进行了比较。

5.1. Benchmark functions

在选择基准函数时,我们尝试选择了6个著名的问题进行符号回归,这些问题被用来评估大多数类似的工作。其中四个是真实世界的应用,其余的是合成的复杂基准。基准的复杂性在数据集套件准备中也受到了极大的关注,例如维度数量,实例数量和适应度景观等各个方面。表1展示了所使用的基准函数。它揭示了维度的数量,训练、测试和验证数据集的大小,以及在合成函数情况下的采样方法。此外,表中还报告了使用每个基准的一些重要的相关工作。

花粉数据集是来自StatLib,1的真实世界数据集,其中包括观察到的花粉粒在3维中的几何特征及其作为目标的重量。混凝土抗压强度数据集选自UCI机器学习数据库( 2 ),该数据库根据混凝土的组成成分预测混凝土抗压强度的量化值。生物利用度数据集也是药代动力学领域的另一个真实世界数据集。该数据集的每条记录的特征都是识别一种药物的分子描述符,输出是能够有效进入全身血液循环的药物的百分比。该数据集在一些参考文献中也被称为%F。毒性数据集也是药代动力学领域的真实世界数据集。该数据集中的每个特征都是针对特定药物的分子描述符,其输出为药物的半数致死量。那就是杀死半数受试生物所需的化合物量。这个数据集也被称为LD50。上述所有数据集分别以50 %、20 %和30 %的比例进行采样,用于训练、验证和测试数据集。UBall5D和RaTPol2D基准函数依次在( 6 )和( 7 )中给出:

前四个基准对应于来自不同领域的真实世界问题。混凝土基准是混凝土龄期和组成材料的高度非线性函数。生物利用度和毒性来自于药代动力学领域。除了这些基准在药物发现领域的应用重要性之外,问题的难度激发他们的选择。在两个数据集中,维度数都很高,但维度数占可用实例数的比例极高。这使得相关函数的构造和推广具有很大的挑战性。从这些基准中,UBall5D和Rat Pol2D是合成函数。UBall5D是一个需要外推的函数,而不仅仅是插值[ 79 ]。此外,文献( e.g. [ 79 , 80 ])指出,该问题在发现和谐的投入产出关系方面存在诸多困难。从泛化的角度来看,RatPol2D是一个困难的问题,因为在这个基准中,测试数据比训练数据分布范围更广。

5.2. Settings

表2给出了遗传规划的配置和SBGP的参数设置。参数’‘分箱数’'用于估计连续互信息的自适应地设置为[81-83]中建议的训练样本数的平方根。一些参数(如种群大小、适应度度量、父代选择方法、树的最大深度、常数随机数的个数等)被设置为与所比较的方法相等,以提供一个公平的评估框架。然而,其他参数(像变异概率和多样性阈值)都是通过反复试错设置到最佳值。

种群模型是一个世代模型,其中产生的后代直接形成下一代。上一代的三棵最好的树取代最差的后代成为精英。其中两个是基于训练数据的最优个体,一个是基于验证数据的最优个体。在所有测试中,结果平均为20次独立运行。

对于每个基准,终端变量的数量等于问题维度。此外,在每次游程开始时,在0和1之间生成100个瞬时随机常数( ERC ),将其添加到终端集合中。由于提供了公平的比较条件,与比较方法类似,没有考虑生物利用度和毒性问题的常数;取而代之的是将数据集特征作为终端。

5.3. Accuracy

由于个体的准确性与其输出与目标之间的误差成反比,为了评估SBGP的准确性,我们根据RMSE标准来衡量个体的训练误差。误差越小,表明精度越高。图10给出了SBGP在不同基准下的误差收敛过程。对于每个基准,种群的平均误差与进化过程中种群最优个体的误差进行了比较。由于使用了精英主义,最优个体的误差在所有基准中都服从非上升趋势。从图中还可以推断,SBGP的多样性保持机制可以防止算法在所有基准测试集中过早收敛。此外,由于使用了验证集来停止进化,在一些基准测试集( e.g. UBall5D在第50代, RatPol2D在第70代)中,进化在100代之前就已经终止,并在收敛之前防止过拟合。

5.4. Evolution in semantic space

最优个体的语义随群体语义均值的变化如图11所示。从图中可以推断,随着进化的进行,种群个体的语义增加。语义值的上升趋势是随着个体的进化,种群的显著模式向最优解演化的结果。提取一个新的模式可能会引起群体语义图的跳跃,这表明显性的模式进化导致了与模式相对应的生成后代的显性变化。

5.5. Controlling tree growth

图12说明了在进化过程中种群中tree的平均大小。由于SBGP使用局部重组,使后代偏向于模式,因此受标准重组的破坏作用影响较小。此外,树中内含子的数量减少,因为树中存在活跃的构建块。最终,这种算法实质上控制了膨胀,这一点可以在大多数的图表中看到。

5.6. Semantic diversity

图13说明了群体在进化过程中的语义多样性。在文献[38]中,ICSS模式虽然产生了高语义平均数的个体,但仍然保持了较高的语义多样性。此外,引入了语义多样性的定义,作为群体语义的标准差。由于在多样性的基础上考虑局部和标准算子的概率有助于保持种群的多样性,因此这些概率根据 Eqs. (2) and (3) 进行了相应的设置。此外,考虑基于多样性的显著模式转变的条件是增加种群多样性的另一个步骤。

结果表明,直到进化结束,多样性一直保持较高的水平。从图表中可以看出,随着图式的演化,多样性增加,因为语义多样性是图式转换的标准。事实上,这种多样性是在每一代中计算的,如果与前几代相比有所下降,则提取下一个模式。产生新的模式会生成具有新构建块的树,从而在语义空间中探索新的点。因此,多样性增加,并且这个过程一直持续到进化终止。在RatPol2D和UBall5D基准函数中,最后一代的多样性保持不变,种群已经收敛,但在更复杂的基准函数如Concrete和Toxicity中,多样性直到最后一代才发生变化,甚至在进化结束时增加。

5.7. Number of schema samples

图14展示了不同世代群体显著模式的样本数。在模式提取之后,种群中的模式实例数量立即减少。随着进化的进行,局部算子在种群内产生和分配模式样本。因此,样本数量逐渐增加。这个过程一直持续,直到群体的语义多样性降低,图式的过渡条件得到满足。在这里,提取下一个模式,再次,新提取的显著模式的样本数量减少,这个过程重复进行,直到演化结束。

5.8. Schema extraction rate

图15的图表显示了每一代的模式提取率。事实上,在不同的游程中,模式抽取发生在不同的世代中。一代人中的模式抽取率是指模式在该代中被抽取出来的游程所占的比例。这个比率与图式样本数的变化和先前实验中研究的语义多样性成正比。

5.9. Comparison with standard genetic programming

图16比较了SBGP和标准遗传规划中最优个体的进化收敛情况训练误差用RMSE来衡量, 正如图中所示,在上一代SBGP中发现的进化的最佳个体在所有基准测试中都远远优于标准GP。花粉、混凝土、生物利用度、UBall5D、毒性和Rat Pol2D的改善率分别为65%、39%、24%、65%、14%和26%。从图中还可以看出,SBGP的收敛速度远远大于标准GP。与标准GP相比,SBGP的渐进搜索策略和局部算子似乎可以提高所提出算法的性能。

5.10. Locality

为了评估SBGP的局部性,我们根据(8)式定义了语义距离(Semantic Distance,SD),它衡量了连续两代之间的距离。图17给出了本次评价的结果。

距离越短,算法的局部性越高。图17所示为SBGP的这一测度,将其与标准遗传规划进行比较。从图中可以推断,SBGP的语义局部性在大多数世代都超过了标准GP。

5.11. Comparing SBGP performance with other methods

在本节中,我们将SBGP与其他版本的遗传规划在训练集和测试集的均方根误差( RMSE )方面进行比较。此外,最后一代种群中tree的平均大小在表中报告。我们与SBGP比较的遗传程序设计版本包括两个一般的类别。第一种由最佳语义遗传规划算法组成,第二个包含了算法,这些算法在某种程度上通过数据驱动的分层学习执行渐进主义。此外,标准遗传规划,简写为GP,可以在表中进行比较。在这些实验中,遗传规划的一般设置对所有方法都是相同的。对于SBGP以外的方法,重组和突变的概率分别设置为0.9和0.1。

为了评估方法的优越性是否具有统计学意义,在所有比较中,采用具有显著性水平的双尾 Welch’s t-test 检验来评估所提出的方法与其他方法之间的训练和测试误差。Welch’s t-test 检验是一种非参数的单变量统计检验,当两个样本的方差不相等时,这种检验是有用的。表3-5的最后两列显示了双尾Welch’s t-test检验的p值。在大多数情况下零假设是被明确拒绝的基础以95%的置信水平( P值< 0.05)进行检验,结果具有统计学意义。

5.12. Comparison with geometric semantic genetic programming methods

语义遗传编程方法近年来得到了广泛的关注和研究。这些方法有意识地建立在语义空间的局部化和几何性质的使用上。在这些方法中,SGX [ 31 ]和SSGX [ 62 ]首次提出了直接几何语义重组算子。其改进版于2016年推出,备受关注。此外,AGX和RDO操作符[ 55、56 ]作为最新和最可靠的语义重组操作符被用于比较。为了实现这些方法,我们使用github上提供的SSGX论文源代码。3根据作者的建议,将AGX和RDO的库大小设置为1000,树的深度设置为4。对于SSGX,使用标准重组的概率被设置为0.3。所选择的用于树估计的子树的大小被认为在2到80之间,这符合作者在[ 62 ]中的建议。

表3比较了语义遗传规划方法的准确性,包括每个算法和每个问题的最佳个体的误差以及平均树的大小。在每个基准的训练和测试数据集上分别测量最佳发现个体的误差,并在训练和测试误差列下报告。关于每个算法的重复运行,规定了在不同运行中得到的结果的平均值和标准偏差。

从训练误差的角度来看,SBGP在除RatPol2D外的所有测试集上都优于其他方法。花粉、混凝土、生物有效性、毒性和UBall5D相对于其他算法的平均改进率分别为34 %、40 %、22 %、27 %和32 %。在Rat Pol2D基准中,SPGP在RDO后获得了最低的训练误差。

由于逐步进化使SBGP算法有机会在语义空间进行局部搜索,并管理超出语义模式的进化,因此它能够比大多数语义GP更好地最小化训练误差。在测试误差方面,同样地,SBGP在6个基准中的4个中取得了最好的性能。更准确地说,本文算法对花粉、生物可利用性、毒性和Rat Pol2D的平均改进率分别为33 %、15 %、7 %和70 %。在Concrete和UBall5D中,SPGP都是第二个前者仅次于RDO,后者仅次于SSGX。由于在SBGP中,进化偏向于特定模式的样本,遗传编程不能自由地将模型拟合到训练数据中。该约束减少了过拟合,提高了泛化性。例如,虽然RDO在RatPol2D数据集的训练误差上表现最好,但它不能很好地泛化。因为从泛化的角度来看,RatPol2D是一个非常具有挑战性的基准。然而,尽管存在较高的训练误差,SPGP在该基准的泛化性方面仍具有优越的性能。综上,从表中可以看出,SBGP在30个对比案例中有29个案例的训练误差较小,在30个对比案例中有28个案例的测试误差较小,泛化性较好。

在平均树大小方面,所提方法的性能与其他方法相当。SSGX在大多数基准测试中树的大小是最小的,因为该方法首先用它的一个子树来估计每棵树,然后再进行重组。

5.13. Comparison with data-driven layered learning genetic programming methods

数据驱动的分层学习遗传编程包括一组遗传编程方法,试图通过数据分层使进化渐变,并提供高泛化性。在这里,我们对所提出的算法进行了比较用第3.4节中提到的算法训练和测试误差和树的大小。在这些方法中,GPC [66],RST [65]和Stage - Based Method [67]被选为该领域的著名方法,VBLL-GP [68]和SGP [69、78]被选为GP的统计变体,以及最近提出的RCGP [70]。

表4比较了基于数据驱动分层学习的GP方法在每个算法和每个问题的最佳个体误差和平均树大小方面的准确性。

在每个基准的训练和测试数据集上测量进化最佳个体的误差,并在相应的列下报告。由于执行重复,指定了不同运行中获得结果的平均值和标准偏差。

结果表明,在48个比较中,有45个比较中SBGP的训练误差小于其他方法。实际上,它在花粉、混凝土和毒性数据集上的表现优于其他方法,在UBall5D和生物有效性数据集上的表现仅次于RCGP。与其他算法相比,花粉、具体和毒性的平均改进率分别为59%、23%和10%。由于SBGP具有基于验证误差提前终止进化的功能,以防止个体函数对训练数据的过拟合,我们并不期待它会有从训练误差角度来看表现最好。 相反,SBGP的设计是为了在基准上很好地推广。在存在测试误差的情况下,SBGP在6个基准中的4个获得了最好的性能。更准确地说,花粉、混凝土、生物有效性和UBall5D相对于其他算法的平均改进率分别为65%、36%、10%和61%。在Toxicity和RatPol2D测试集上,SPGP是仅次于RCGP的第二优秀算法。虽然所选方法往往采用增加泛化性的策略来提高其效率,但在表中的48条记录中,SBGP有46条获得了较好的泛化性。除了提前终止进化外,使种群偏向于显著模式的实例,防止SBGP对训练数据集的过拟合,提高泛化性。

SBGP中树木的平均大小也远小于除RCGP外的其他方法。由于局部算子中积木块的最小形式用于产生子代,因此在一定程度上控制了树的大小。此外,使用验证集会导致算法在过拟合之前终止,从而导致更简单和更短的解决方案。RCGP的主要目标是减少树的大小;因此,在这种方法中,这种度量是极低的。SBGP中的平均树大小在几乎所有的基准程序中都小于除RCGP外的所有方法。

5.14. Comparison with other function approximation methods

在这里,我们将所提方法的训练和测试误差与一些最流行的机器学习方法进行比较,以确定非进化方法之间的SBGP位置。这些方法包括线性和二项式回归,在表中称为线性模型和二次模型,以及最小二乘支持向量机(LS-SVM) [84]。函数和RBF (径向基函数)神经网络的最佳逼近方法之一,以及应用广泛且著名的决策树算法Random Forrest。对于后三种方法,使用了与SBGP类似的训练集、测试集和验证集。使用验证集来寻找每种方法的主要参数。此外,还开发了一个随机模型作为基准,该模型从训练样本范围内的均匀随机分布中生成目标。所获得的结果见表5,其中所提出的方法的标准偏差已被报道,考虑到除随机森林和随机模型外的其他方法的确定性,在它们的不同运行中标准偏差为零。从结果来看,SBGP的性能和泛化性明显优于线性回归和二次模型。此外,该方法在4个数据集上的泛化性优于RBF和Random Forrest方法,在6个数据集中的3个数据集上的泛化性优于LS-SVM。此外,从表中可以推断,所提出的方法在五个数据集上的泛化性能优于全部或全部除一个方法。

5.15. Comparison summary

为了比较SBGP与其他方法的整体性能,选取Standard GP的结果作为基准,计算每种方法的相对改进百分比。每种方法得到的结果在六个基准函数上进行了平均。图18显示了14种方法的平均相对改进百分比。可以看出,本文提出的方法获得了最高的平均(即47.11%),其次是随机森林和RCGP,分别获得了45.94%和39.09%的提升。

5.16. Computational cost comparison

为了进一步评估SBGP的性能,比较了一些重要的基于GP的方法的计算成本。表6给出了每个基准函数中每种方法的平均运行时间和标准差。可以看出,SBGP的运行时间接近于AGX和RDO的结果。由于使用了一些控制树的大小的机制,GP的时间效率较好,而RCGP的时间效率远远优于语义方法。综上所述,SBGP的计算成本与语义GP方法相当。由于语义计算和语义空间操作(单独或与句法空间一起),这些方法与传统的GP方法相比具有更高的计算成本,然而在大多数符号回归应用中,误差最小化比计算成本更重要。

6. Conclusion and future work

本文介绍了基于模式 (Schema-Based) 的遗传规划 (SBGP) 算法。它使得遗传规划的搜索过程是渐进的,在某种程度上结合了局部和全局搜索从而改善算法的性能。利用局部算子使子代偏向于模式,提高了遗传编程的搜索能力。在引入局部算子和 SBGP 算法后,我们分析了该方法在包括真实世界和合成基准在内的六个数据集上的性能。一方面将 SBGB 与最流行的语义遗传编程版本进行比较,另一方面将 SBGB 与数据驱动的分层方法进行比较。结果表明,在以 RMSE 衡量的泛化能力方面,所提出的方法在 6 个基准测试中的 4 个中优于两个遗传规划算法,在其他测试中获得了接近最佳的结果。SBGP 在语义遗传规划对比中泛化性提升可达 87%,在分层学习对比实验中泛化性提升可达 76%。作为未来的工作,我们打算扩展语义的概念和面向分类领域的 SBGP 算法。修改算法也是有益的,以便进化出更小的树,并像以前的一些工作那样用它们的语义相等的子树替换树。

References

Zojaji Z, Ebadzadeh M M, Nasiri H. Semantic schema based genetic programming for symbolic regression[J]. Applied Soft Computing, 2022, 122: 108825.

@article{zojaji2022semantic,
  title={Semantic schema based genetic programming for symbolic regression},
  author={Zojaji, Zahra and Ebadzadeh, Mohammad Mehdi and Nasiri, Hamid},
  journal={Applied Soft Computing},
  volume={122},
  pages={108825},
  year={2022},
  publisher={Elsevier}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

补充

《Applied Soft Computing》是国际计算机科学领域排名前5%的著名期刊,位列2020年中科院SCI分区1区,5年平均影响因子Impact Factor(国际通行的期刊评价指标)为 5.472,具有很高的学术价值和国际影响力。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/602165
推荐阅读
相关标签
  

闽ICP备14008679号