对比 GA 、PSO 、DE三种算法 求解连续优化问题的性能

摘要:
演化计算又称为进化算法、进化计算,是一种元启发式方法。搜索过程是从一个初始解的集合(称为初始种群)开始的,种群中的每一个解都沿着一定的轨迹搜索,每前进一步称为种群的进化,得到的解集称为种群的一代。这样便增加了在庞大解空间中找到最优解的概率。在种群进化时,种群中的解会发生变异、杂交和选择等操作从而生成新的解,构成新一代种群。这个过程与自然界生物的进化很类似,生物总群的每一代都会有或多或少的变异发生,而不用个体之间的杂交也是很普遍的现象。变异和杂交所产生的新个体不一定会适应生存环境,这就是自然选择的过程:适应的个体存活下来,不适应的个体遭到淘汰,最后存活下来的个体组成新一代的种群。进化计算是一种成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织、自适应、自学习的特性,能够不受问题性质的限制,有效地处理传统优化算法难以解决的复杂问题。这篇报告着重分析遗传算法[1],粒子群优化算法[2, 3],差分进化算法[4]三种经典进化算法求解连续优化问题的表现,并分析不同参数对性能的影响。
关键字:
进化算法,遗传算法,粒子群优化算法,差分进化算法,连续优化问题。

1 背景介绍
生物系统中,进化被认为是一种成功的自适应方法,具有很好的健壮性。达尔文进化论是一种稳健的搜索和优化机制。大多数生物体是通过自然选择和有性生殖进行进化。自然选择决定了群体中哪些个体能够生存和繁殖,有性生殖保证了后代基因中的混合和重组。自然选择的原则是适者生存,优胜劣汰。演化计算是一类借鉴生物界自然选择和自然遗传机制而发展起来的通用问题求解方法。演化计算采用简单的编码技术来表示各种复杂的结构,进而进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索方向。
进化计算是基于自然选择和自然遗传等生物进化机制的一种搜索算法。与普通的搜索方法一样,进化计算也是一种迭代算法,不同的是进化计算在最优解的搜索过程中,一般是从原问题的一组解出发改进到另一组较好的解,再从这组改进的解出发进一步改进。而且在进化问题中,要求当原问题的优化模型建立后,还必须对原问题的解进行编码。进化计算在搜索过程中利用结构化和随机性的信息,使最满足目标的决策获得最大的生存可能,是一种概率型的算法。
演化计算采用种群的方式组织搜索,使得它可以同时搜索解空间的多个区域,从而特别适合大规模并行。由于演化算法的进化机制,使得算法具有自组织、自适应、自学习和“复杂无关性”的特征,能在搜索过程中自动获取和积累有关搜索空间的知识,并利用问题固有的知识来缩小搜索空间,自适应地控制搜索过程,动态有效地降低问题的复杂度,从而求得原问题的真正最优解或满意解。演化计算不仅能获得较高的效率而且具有简单、易于操作和通用性[3, 5]。目前,演化算法已经广泛在计算机科学[6]、工程技术[7, 8]等众多领域得到了越来越广泛的应用。现如今,科学技术和工程应用领域具有挑战性的实践问题大都具有高度的计算复杂性的特点,这些是使传统方法失效的致命障碍,而演化算法正好可以克服这些困难。
由于具有鲜明的生物背景和适用于任意函数类等特点,进化计算自上世纪60年代中期以来引起众多领域的普遍关注,并被广泛应用于机器学习[9, 10]、人工神经网络训练[11]等一系列超大规模、高度非线性、不连续、多峰函数的优化。
进化作为从生命现象中抽取的重要的自适应机制已经为人们所普遍认识和广泛应用,然而现有的进化模型存在一个共同的不足是未能很好地反映这样一个普遍存在的事实:大多数情况下,整个系统复杂的自适应进化过程,事实上是一个系统应多个子系统局部相互作用的协同进化过程,也就是说它是大规模协同动力学系统,而以前的工作大都注意从算法的角度认识问题;因此对进化计算的认识机理了解还不多;如何反映进化的多样性、多层次性、系统性、自适应性、自组织过程、相变与混沌机理等则是有待解决的问题,这也是真正了解进化机理的困难和关键所在。
2 算法介绍
请详细介绍算法的起源,工作机理,列出公式和流程图或者伪代码,详细介绍算法中的每一个部分;
2.1 遗传算法
2.1.1 算法起源
遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。相关生物学术语:
基因型:性状染色体的内部表现;
进化:种群逐渐适应生存环境,品质不断得到改良。生物的进化是以种群的形式进行的。
适应度:度量某个物种对于生存环境的适应程度。
选择:以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。
交叉:两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;
变异:复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状。
编码:DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射。
解码:基因型到表现型的映射。
个体:指染色体带有特征的实体;
种群:个体的集合,该集合内个体数称为种群
2.1.2 基本流程
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。遗传算法的实现过程实际上就像自然界的进化过程那样。
遗传算法求解时首先寻找一种对问题潜在解进行“数字化”编码的方案,即建立表现型和基因型的映射关系;然后随机初始化一个种群,种群里面的个体就是这些数字化的编码。接下来,通过适当的解码过程之后。用适应性函数对每一个基因个体作一次适应度评估。用选择函数按照某种规定择优选择。让个体基因变异。
遗传算法并不保证你能获得问题的最优解,但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最优解。而只要简单的“否定”一些表现不好的个体。
由此得出遗传算法的一般步骤,流程图见图2.1:
1、随机产生种群。
2、根据策略判断个体的适应度,是否符合优化准则,若符合,输出最佳个体及其最优解,结束。否则,进行下一步。
3、依据适应度选择父母,适应度高的个体被选中的概率高,适应度低的个体被淘汰。
4、用父母的染色体按照一定的方法进行交叉,生成子代。
5、对子代染色体进行变异。
6、由交叉和变异产生新一代种群,返回步骤2,直到最优解产生。
2.1.3 染色体编码
二进制编码法:
就像人类的基因有AGCT 4种碱基序列一样。不过在二进制编码只用了0和1两种碱基,然后将他们串成一条链形成染色体。一个位能表示出2种状态的信息量,因此足够长的二进制染色体便能表示所有的特征。这便是二进制编码。
(1)
如下:1110001010111,它由二进制符号0和1所组成的二值符号集。它有以下一些优点:(1)编码、解码操作简单易行;(2)交叉、变异等遗传操作便于实现;(3)合最小字符集编码原则;(4)利用模式定理对算法进行理论分析。二进制编码的缺点是:对于一些连续函数的优化问题,由于其随机性使得其局部搜索能力较差,如对于一些高精度的问题,当解迫近于最优解后,由于其变异后表现型变化很大,不连续,所以会远离最优解,达不到稳定。
浮点编码法:
浮点法,是指个体的每个基因值用某一范围内的一个浮点数来表示。在浮点数编码方法中,必须保证基因值在给定的区间限制范围内,遗传算法中所使用的交叉、变异等遗传算子也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。如下所示:1.2-3.2-5.3-7.2-1.4-9.7。浮点数编码方法优点:(1)适用于在遗传算法中表示范围较大的数;(2)适用于精度要求较高的遗传算法;(3)便于较大空间的遗传搜索;(4)改善了遗传算法的计算复杂性,提高了运算交率;(5)便于遗传算法与经典优化方法的混合使用;(6)便于设计针对问题的专门知识的知识型遗传算子;(7)处理复杂的决策变量约束条件。
2.1.4 适应值评估
适应度函数也称评价函数,是根据目标函数确定的用于区分群体中个体好坏的标准。适应度函数总是非负的,而目标函数可能有正有负,故需要在目标函数与适应度函数之间进行变换。
评价个体适应度的一般过程为:
对个体编码串进行解码处理后,可得到个体的表现型。
由个体的表现型可计算出对应个体的目标函数值。
根据最优化问题的类型,由目标函数值按一定的转换规则求出个体的适应度。
2.1.5 选择算子
遗传算法中的选择操作就是用来确定如何从父代群体中按某种方法选取那些个体,以便遗传到下一代群体。选择操作用来确定重组或交叉个体,以及被选个体将产生多少个子代个体。常用的选择算子介绍:
轮盘赌选择:是一种回放式随机采样方法。每个个体进入下一代的概率等于它的适应度值与整个种群中个体适应度值和的比例。每个个体被选中的概率为:
(2)
随机竞争选择:每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。
均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
最佳保存策略:当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。
随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。
排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。
2.1.6 交叉算子
遗传算法的交叉操作,是指对两个相互配对的染色体按某种方式相互交换其部分基因,从而形成两个新的个体。
适用于二进制编码个体或浮点数编码个体的交叉算子:
单点交叉:指在个体编码串中只随机设置一个交叉点,然后再该点相互交换两个配对个体的部分染色体。
两点交叉与多点交叉:
(1) 两点交叉:在个体编码串中随机设置了两个交叉点,然后再进行部分基因交换。如图2.2所示。

(2) 多点交叉
均匀交叉(也称一致交叉):两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。
算术交叉:由两个个体的线性组合而产生出两个新的个体。该操作对象一般是由浮点数编码表示的个体。
二进制编码的染色体交叉过程非常类似高中生物中所讲的同源染色体的联会过程――随机把其中几个位于同一位置的编码进行交换,产生新的个体。
2.1.6 变异算子
遗传算法中的变异运算,是指将个体染色体编码串中的某些基因座上的基因值用该基因座上的其它等位基因来替换,从而形成新的个体。
例如下面这串二进制编码:
101101001011001
经过基因突变后,可能变成以下这串新的编码:
001101011011001
以下变异算子适用于二进制编码和浮点数编码的个体:
基本位变异:对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
均匀变异:分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)
边界变异:随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P**2的正态分布的一个随机数来替换原有的基因值。
2.2 粒子群优化算法
2.2.1 算法起源
粒子群优化算法是一种进化计算技术。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解。
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。
粒子群算法的目标是使所有粒子在多维超体中找到最优解。首先给空间中的所有粒子分配初始随机位置和初始随机速度。然后根据每个粒子的速度、问题空间中已知的最优全局位置和粒子已知的最优位置依次推进每个粒子的位置。随着计算的推移,通过探索和利用搜索空间中已知的有利位置,粒子围绕一个或多个最优点聚集或聚合。
该算法设计玄妙之处在于它保留了最优全局位置和粒子已知的最优位置两个信息。后续的实验发现,保留这两个信息对于较快收敛速度以及避免过早陷入局部最优解都具有较好的效果,这也奠定了后续粒子群算法改进方向的基础。
粒子群算法的参数包含个体的历史最优pbest,群体中最优的个体gbest。
2.2.2 基本流程
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
2.2.3 更新公式
在公式(3)(4)中,N是种群中粒子的总数;v_i是粒子的速度,PSO采用Vmax来限制速度的范围。位置更新必须是合法的,每次进行更新之后都要检查更新后的位置是否在问题空间之中,否则必须进行修正,一般的修正方法可以是重新随机设或者限定在边界,最大速度Vmax决定当前位置与最好位置之间的区域的 分辨率(或精度)。如果太快,则粒子有可能越过极小 点;如果太慢,则粒子不能在局部极小点之外进行足 够的探索,会陷入到局部极值区域内。这种限制可以 达到防止计算溢出、决定问题空间搜索的粒度的目的。r_1,r_2是0到1之间的随机数;c_1,c_2是学习因子。公式(3)的第一部分称为记忆项,表示上次速度大小和方向的影响;公式(3)的第二部分称为自身认知项,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(3)的第三部分称为群体认知项,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享[12]。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
(3)
(4)
(5)
公式(5)中,w叫做惯性权重,其值非负,其值较大,全局寻优能力强,局部寻优能力弱;其值较小,全局寻优能力弱,局部寻优能力强;动态惯性权重[13]能获得比固定值更好的寻优效果,动态w可以在PSO搜索过程中线性变化[14],也可以根据PSO性能的某个测度函数动态改变。目前采用较多的是线性递减权值策略[15],如公式(6)所示。
(6)
权重因子包括惯性因子和学习因子c_1和c_2。使粒子保持着运动惯性,使其具有扩展搜索空间的趋势,有能力探索新的区域。c_1和c_2代表将每个粒子推向pbest 和gbest位置的统计加速项的权值。较低的值允许粒子在被拉回之前可以在目标区域外徘徊,较高的值导致粒子突然地冲向或越过目标区域。
2.2.4 研究方向
第一,算法理论研究,此类研究的核心时探究PSO算法在具备不可解析性的问题的收敛性,证明算法可以收敛到局部最优或者全局最优,Trelea指出PSO最终会收敛到解空间的某一点,但不能保证为全局最优[16],Kadirkamanathan等人在动态环境中对PSO 行为进行研究,由静态分析深入到了动态分析[17],F. van den Bergh等人对PSO的飞行轨迹进行了跟踪,深入到了动态的系统分析和收敛性研究[18]。
第二,算法参数研究,在经典PSO中最终的三个参数惯性权重w,加权系数c1,c2以及种群大小NP,种群规模对算法的搜索多样性和收敛速度影响较大,小种群使得算法快速收敛但多样性较低,而大种群则与之相反,在大部分的PSO变种算法中,NP一般作为超参的形式存在,通过实验获取最优的取值。
。第三,拓扑结构研究,T Blackwell and J Kennedy[19]通过在经典算法及其常用变种上开展了大规模测试,证明了全局拓扑PSO由于很高的连接度,往往比局部拓扑具备更快的收敛速度,但也造成了多样性快速丢失,所以更适合简单单峰问题,而局部拓扑结构更适合复杂的多峰问题。
第四,混合算法研究,通过引用其他进化算子,如选择算子,交叉算子,变异算子[20]来改进算法性能,或者结合其他搜索算法进行改进以及混合其他技术,例如小生境技术,混沌技术等。最后,算法应用的研究,在真实场景下的优化问题往往都是复杂的多峰问题,并且无法解析的得到问题的形式,因而PSO及其变种在求解此类问题得到广泛的应用。
2.3 差分进化算法
2.3.1 算法起源
差分进化算法由Storn和Price于1995年首次提出。主要用于求解实数优化问题。该算法是一类基于群体的自适应全局优化算法,属于演化算法的一种,由于其具有结构简单、容易实现、收敛快速、鲁棒性强等特点,因而被广泛应用在数据挖掘、模式识别、数字滤波器设计、人工神经网络、电磁学等各个领域。1996年在日本名古屋举行的第一届国际演化计算(ICEO)竞赛中,差分进化算法被证明是速度最快的进化算法。
和遗传算法一样,差分进化算法也是一种基于现代智能理论的优化算法,通过群体内个体之间的相互合作与竞争产生的群体智能来指导优化搜索的方向。该算法的基本思想是:算法的基本思想是从某一随机产生的初始群体开始,利用从种群中随机选取的两个个体的差向量作为第三个个体的随机变化源,将差向量加权后按照一定的规则与第三个个体求和而产生变异个体,该操作称为变异。然后,变异个体与某个预先决定的目标个体进行参数混合,生成试验个体,这一过程称之为交叉。如果试验个体的适应度值优于目标个体的适应度值,则在下一代中试验个体取代目标个体,否则目标个体仍保存下来,该操作称为选择。在每一代的进化过程中,每一个体矢量作为目标个体一次,算法通过不断地迭代计算,保留优良个体,淘汰劣质个体,引导搜索过程向全局最优解逼近。
差分进化算法是一种基于群体的进化算法,它模拟了群体中的个体的合作与竞争的过程。算法原理简单,控制参数少,只有交叉概率和缩放比例因子,鲁棒性强,易于实现。
差分进化算法中,每一个个体的基因表示待求问题的一个候选解。每次迭代将先进行变异操作,选择一个或多个个体的基因作为基,然后选择不同的个体的差分来构成差分基因,最后将作为基的基因与差分基因相加来得出新的个体。交叉操作将新的个体将于父代的对应个体交叉,然后进行选择操作,比较交叉后的个体与父代的对应个体,选择较优的个体保留至下一代。在迭代完成之后将选择种群中最优个体的基因作为解。
2.3.2 基本流程
其具体进化流程如下:
(1)确定差分进化算法控制参数,确定适应度函数。差分进化算法控制参数包括:种群大小NP、缩放因子F与杂交概率CR。
(2)随机产生初始种群。
(3)对初始种群进行评价,即计算初始种群中每个个体的适应度值。
(4)判断是否达到终止条件或进化代数达到最大。若是,则终止进化,将得到最佳个体作为最优解输出;若否,继续。
(5)进行变异和交叉操作,得到中间种群。
(6)在原种群和中间种群中选择个体,得到新一代种群。
(7)进化代数g=g+1,转步骤(4)。
2.3.3 变异算子
种群初始化后,执行差分变异操作产生变异向量,常见的差分变异操作有DE/rand/1、DE/best/1、DE/rand-to-best/1、DE/best/2、DE/rand/2、DE/current-to-best/1、DE/current-to-rand/1等,其中,经典的DE/rand/1变异策略如公式(7)所示。
(7)
其中,r_1,r_2,r_3为互不相同的整数,且与当前的目标向量索引i不同。因此要求种群数量大于4。缩放因子F是(0,1)之间的常数。用于控制差分变量大小,F过小会降低收敛速度,但F过大会造成种群不收敛。
对于有边界约束的优化问题,差分进化算法的变异操作可能产生超出边界的向量,这时需要添加新的操作确保产生的个体向量的每一维都在边界内。一种方法是将超出边界的新个体用在边界约束范围内随机生成的新向量代替;另一种方法是继续进行下一次变异操作,直到产生符合边界约束条件的向量为止,但这种方法效率很低。下面列出其他几种变异生成策略。
1)DE/best/1:
(8)
2)DE/rand-to-best/1:
(9)
3)DE/best/2:
(10)
4)DE/rand/2:
(11)
5)DE/current-to-best/1:
(12)
6)DE/current-to-rand/1:
(13)
2.3.4 交叉算子
为进一步增加种群多样性,DE算法将目标矢量个体X_i (t)与其对应的变异个体V_i (t+1)进行交叉操作,产生试验个体,即目标个体的候选个体U_i (t+1)。为保证目标个体X_i (t)的进化,必须保证试验个体U_i (t+1)中至少有一维分量由变异个体V_i (t+1)贡献,而其他维分量则由交叉概率因子CR决定。由此试验个体中每一维分量U_ij (t+1)按下式生成。
(14)
其中,X_ij (t)表示父代种群中目标个体矢量Xi(t)中的第j维分量,U_ij (t+1)为变异个体V_i (t+1)中的第j维分量,其中i=1,⋯,NP,j=1,⋯,D。rand(j)∈[0,1]为第j维分量对应的随机数。交叉概率因子CR∈[0,1]是DE算法的另一个主要控制参数,它决定了变异个体V_i (t+1)在生的试验个体Ui(t+1)中所占的比例。k为第i个个体对应的系数,一般是从序列中随机选择的一个整数,用来确保候选个体U_i (t+1)中至少有一维分量来自变异个体V_i (t+1)。当第j维分量对应的随机数小于等于交叉概率因子CR或者当前维数j等于预定系数k时,试验个体U_i (t+1)中相应维分量均来自于变异个体V_i (t+1),否则相应维分量仍于父代种群中目标个体矢量X_i (t)相同。交叉操作实质上是变异操作的进一步延续和调控,通过混合变异个体和目标个体相应维分量实现种群个体的进化。此外,交叉操作通过参数CR控制试验个体中来自变异个体的更新成分,若更新成分在试验个体中占比较大,则个体进化程度较高,反之则进化程度较低,由此控制种群个体进化的程度。由上述分析可知,交叉操作对DE算法收敛速度、求解精度等性能的影响应与变异操作遵循同一趋势。
2.3.5 选择算子
和其他进化算法一样,DE算法采用“优胜劣汰”的选择操作来保证算法不断向全局最优解进化。选择操作中首先对试验个体Ui(t+1)和目标个体Xi(t)进行适应度评价,评估个体对应于待求最优化问题的优劣的相对值大小,再将二者的适应度值进行比较,选择适应度值较优的个体进入下一代。
(15)
对于每个个体, X_i (t+1)要好于或持平于 X_i (t),通过变异,交叉,选择达到全部最优。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是雨玮a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值