MOPSO算法总结,包括OMOPSO,SMPSO,dMOPSO,CMPSO,DDMOPSO,MMOPSO等

MOPSO学习小结:

一些基本的定义

1、 一般化的多目标优化问题即多目标优化问题的数学模型;(分最小化和最大化问题)决策空间和目标空间,不等和等式约束条件;

2、 Parto支配关系,非劣解;(决策向量的支配关系和目标向量的支配关系)一个决策向量X1支配另一个决策向量X2,当且仅当X1在所有的目标上都不差于X2,而且至少在一个目标上严格优于X2;

3、 Parto最优解;一个决策向量是Pareto最优解,条件就是不存在另外一个决策向量支配它(目标向量的最优类似)

4、 Parto最优解集;最优解组成的集合

5、 Parto前沿、端面;所有的Pareto最优目标向量组成的曲面

 

多目标优化问题考虑的基本因素:

收敛性:minimizing the distance to the Pareto front

多样性:maximizing the distribution over the Pareto front

分布性:其实等同于多样性

 

MOPSO简单描述:多目标粒子群(MOPSO)算法是在2004年提出来的,目的是将原来只能用在单目标上的粒子群算法(PSO)应用于多目标上。

 

MOPSO算法主要是针对以下一些问题进行研究:

1、如何选择pbest。对于多目标来说两个粒子的对比,并不能对比出哪个好一些。如果粒子的每个目标都要好的话,则该粒子更优。若有些更好,有些更差的话,就无法严格的说哪个好些,哪个差一些。(例如采用支配关系来选择)

2、 如何选择gbest。对于多目标来说,最优的个体有很多个。该如何选择,涉及到最优个体的存档、存档的管理等问题(多样性)

3、 速度更新公式优化;

4、 位置更新处理;

5、 增加扰乱算子即变异算子的选择问题,主要是为了解决PSO快速收敛到局部最优的问题,增加扰乱可以使得收敛到全局最优

6、 增加一些其他的操作来改善收敛性和多样性

 

MOPSO算法的一般流程:

->初始化需要设定的参数,如种群大小、存档大小、迭代次数等

->根据目标函数的评估在决策空间中随机初始化得到一个粒子群

->初始化每个粒子的速度为0.0;

->初始化粒子位置(一般都是随机生成)

->根据选定的方法初始化存档(存储最优解,也可以说是pareto临时最优断面)gbest就是在其中根据一定的方法选取

->初始化历史最优pbest为其本身;

进入主循环:

->根据速度和位置公式进行位置和速度的计算更新

->对每个粒子增加的一些操作(如变异算子)

->根据目标函数对每一个粒子做评估操作得到新的粒子群

->更新存档,更新gbest(存档若是超出最大存储粒子数做相应的裁剪操作如根据拥挤度距离裁剪、根据自适应网格法裁剪等)

->根据采用的方法更新历史最优pbest(支配法,无法判别优劣的情况下随机选则的方法)

->收敛或者达到最大迭代次数则退出循环

->返回存档中的最优解集

 

一般速度的更新公式如下:

vi(t)= w ·vi(t−1)+C1 ·r1·(xpbesti −xi)+C2 ·r2 ·(xgbesti −xi)

等式右边由三部分组成,第一部分是惯性量,是延续粒子上一次运动的矢量,如果w大于1会使得速度增加到无限大,所以w一般限制一个小于1的随机数;第二部分是个体认知量,是向个体历史最优位置运动的量r1是一个[0,1]的随机数C1是一个控制因子;

第三部分是社会认知量,是粒子向全局最优位置运动的量r2是一个[0,1]的随机数C2是一个控制因子;

 

一般的位置更新公式

xi(t)= xi(t− 1) + vi(t)

其中当Xi的某一维上的量,超出限定范围时一般会做一下处理:

当超出最大值或最小值时,令Vi的值等于最大值或最小值然后乘以-1,或者乘以一个很小的数如0.001;

 

如何选择领导者?

 

如何进行存档?

在种群更新完成之后,是如何进行存档的呢?

MOPSO一般进行了三轮筛选。首先,根据支配关系进行第一轮筛选,将劣解去除,剩下的加入到存档中。其次,在存档中根据支配关系进行第二轮筛选,将劣解去除,并计算存档粒子在网格中的位置。最后,若存档数量超过了存档阀值,则根据自适应网格进行筛选,直到阀值限额为止。重新进行网格划分。

 

OMOPSO(Optimal):

位置更新公式:xi(t) = xi(t − 1) + vi(t)

速度更新公式:vi(t) = w ·vi(t−1)+C1 ·r1 ·(xpbesti −xi)+C2 ·r2 ·(xgbesti −xi)

其中0.1< w<0.5, 1.5< C1<2.0,1.5< C2<2.0,r1、r2是0到1上的随机数

1、如果第i个粒子的位置X[i][j]的值低于目标函数限定的最小值或者大于目标函数限定的最大值,则该粒子的V[i][j]要变方向及V[i][j]= V[i][j]*-1

2、  变异算子:第i个粒子采取何种变异操作分为三种情况,另j=i%3,若j==0则该粒子进行非均匀变异,若j==1则该粒子进行均匀变异操作,若j==2则该粒子不进行变异操作;

3、  存档操作,gbest的获取

leaders_=newCrowdingArchive(archiveSize_,problem_.getNumberOfObjectives());

eArchive_= newNonDominatedSolutionList(newEpsilonDominanceComparator(eta_));

采用的支配方式:EpsilonDominanceComparator,比较大小中引入1+eta因子

leaders_用来存储最优解,并采用拥挤度距离的方法来裁剪存档;

gbest是根据在leaders_中随机选择两个最优解,然后按拥挤的度选择其中一个;

算法流程与一般的MOPSO算法流程没太大区别;

SMOPSO(Speed-constrained):

在OMOPSO的基础上对速度进行了限制加入了压缩因子,变异算子采用的是polynomialMutation,外部存档也与OMOPSO不同采用一般的支配方式选择存储;

1、引进的收缩因子:其中

论文中是这样分开写的,但是在代码中是直接


2、在用以上公式求得速度V后,SMPOS另外还用以下公式对速度进一步进行了压缩限制:其中

, =-;

3、位置更新:OMOPSO中当位置超出范围时速度变向乘以-1,而在SMPSO论文中是说乘以一个可以调节的参数因子:chvel1和chvel2,但是在实际代码中chvel1= chvel2=-1,而在论文中提到chvel1=chvel2=0.001时效果更好

4、 SMPSO中惯性量 w =0.1,  1.5< C1<2.5,1.5< C2<2.5

 

CMPSO(Co-evolutionary):Multiple Populations for Multiple Objectives

CMPSO简单描述:一个基于MPMO框架的多目标优化的新的PSO算法,每一个目标函数对应一个种群,对于每个目标函数的优化分别在对应的种群上进行类似于单目标优化的PSO进化过程,然后引进一个外部的存档S,这个存档不仅存储每个粒子的pbest,而且存储前后两个指定大小的非劣解的集合A,因此这个外部存档的大小为N*M+2*A,这个存档也用来不同目标、种群之间的粒子进行信息交流;最后S中粒子基于所有的目标进行一次非劣解选择,选择其中基于所有目标的非劣解加入到另外一个存档R,如果R中的非劣解超出了指定的数量,则按照基于拥挤度排序再次选择;

1、新的速度计算公式:分为四个部分

在以前的速度公式基础上增加了第四部分,及基于存档的信息加入引导速度的更新(粒子的进化方向),其中是第i个粒子在共享存档A里随机选择的(收敛快、多样性好、计算复杂度低),如果存档A为空,则在另外m-1个目标对应的gbest中随机选一个;

2、精英学习策略:对于存档A中的每一个粒子,先复制成一个新粒子,然后对的随机选择的第d维上的变量做一个高斯变异,论文中的公式如下:

Eid= Eid+ (Xmax,d−Xmin,d)Gaussian(0, 1);

然后把新的粒子加入到存档S中;
3、非劣解的选取:

对于上述已经存有每个粒子的Pbest n*m个,以及未进行精英学习策略的A个非劣解,和对这A个非劣解进行复制然后进行高斯随机扰动后的A个解,总共M*N+2A个解进行非劣解的选取(基于全部目标),将非劣解存储于外部存档R,然后再跟进基于密度的排序对超出数量的非劣解进行处理(在代码中S、A、R都是用的同一个解集);

 

4、  算法的流程:目标数m,每个目标对应的种群大小m,限定的存档大小a=archive_size,存档A的大小为m*n+2*a

->根据目标函数估计随机初始化得到m*n粒子

->初始化每个粒子的速度;(代码中不是初始化为0.0)而是一个随机向量

->对每个粒子初始化pbest为其自身,然后将pbest加入存档A中

->初始化每个粒子的gbest

->对A中的m*n个粒子进行非劣选取操作,得到a个新粒子覆盖存储在A中

进入主循环

->根据新的速度计算公式更新每个粒子的速度

->更新每个粒子的位置

->根据目标函数的估计重新得到下一代新的m*n个粒子

->更新每一个粒子的pbest、和gbest,这里与单目标优化的pbest和gbest更新类似(代码中是比较对应的目标函数值的大小来选取)

->对A中的a个粒子进行精英学习策略得到新的a个粒子并加入到A中

->将每个粒子的新的Pbest也加入到存档A中(此时A中的粒子数为m*n+2*a)

->对A中的m*n+2*a个粒子进行非劣选取操作,选取其中的非劣解覆盖加入到A中

->如果A中的非劣粒子数大于a,则还需进行拥挤度排序,删除那些拥挤的粒子直到A的粒子数为a

->达到最大迭代次数则退出循环,否则继续主循环

->返回最后A中的a个非劣解

 

 

MOPSO/D:PSO技术与MOEA/D框架的结合

MOEA/D基于分解的多目标进化算法,通过预先产生一组均匀的权重向量将多目标优化问题分解为一组单目标子问题,并为每一个子问题分配一个个体,权重向量直接决定种群的性能,权重向量的均匀程度与具体优化问题有关;

1、如何根据优化问题调整权重向量和子问题?

Pareto最优解与权重向量的关系?如何根据这个关系来确定子问题的权重向量,并运用该权重向量指引子问题的进化?种群进化的过程即是共同基因聚集的过程,适合某一子问题的基因会不断向该子问题或邻域聚集,相邻的子问题最终会拥有更多的共同基因。个体在种群中存在最适合的子问题(权重向量),其取决于该个体的基因成分,可以将每个个体的基因成分分为沿权重向量向最优Pareto 面逼近的因素(即收敛性信息)和与权重向量的距离因素(即分布性信息)。聚合方法将权重向量方向转化为为一定方向的选择压力。聚合方法对子问题的进化方向起决定性作用,且子问题的最优解的位置与权重向量有关联。

2、权重向量的产生方法?MOEA/D中通常是在平面f1 +f2 +....+fm=1或曲面上均匀取点的方式生成均匀权重向量,MOEA/D 使用一组预先指定数目的均匀分布的权重向量,这些权重向量满足如下条件:

,H是用户定义的正整数,m为目标数,所以权重向量的个数为:,因此在MOEA/D中种群大小是不能随意设定的;

3、权重向量的进化过程?

5、相邻子问题:对的应权重向量的欧式距离最近的子问题;

6、得到均匀的权重向量后,权重向量的聚合方法?

   MOEA/D论文中给出了三种不同的聚合方法:

1>  传统的加权方法(权重和):

数学表示为:,其中

是一组权重向量,对于所有的i=1,2,….m,有,且

,这种方法的缺点就是在最优pareto面的形状为非凸面的情况下,这种方法并不能获得每一个pareto最优向量

 

2>  Tchebycheff(切比雪夫)聚合方法:

数学公式:,其中=(,…..),且=

对于每一个pareto最优点x总存在一个权重向量使得上式的解为一个pareto最优解,该解对应着原多目标问题的pareto最优解

 

对于任意一个权重向量,Tchebycheff聚合方法将多目标问题转换为单目标子问题P,并将个体向最优Pareto 面的逼近转换为沿一定方向的选择压力,随着进化,个体将沿着向z靠近,直至与最优Pareto 面相交,那么交点A即为单目标子问题P的最优解。

与Weighted Sum 聚合方法不同,Tchebycheff聚合方法是沿着一条由参考点

出发的直线Az进化,即随着进化,个体逐渐向直线Az靠近,并沿直线Az逼

近最优Pareto 面。由于直线Az与最优Pareto 面的交点是唯一的,不管最优Pareto

面是什么形状,算法总能搜索到每一个子问题唯一的确定解,因此Tchebycheff

聚合方法可以很好的处理非凸问题。

3>  PBI聚合方法,Penalty-based Boundary Intersection带惩罚因子的边界交叉法:

边界交叉法的目标是把F(x)推尽可能的远,这样算法能够搜索到可行目标空间的边界,

而一般的边界交叉法必须处理等式约束,所以通常采用惩罚的方法来处理约束;

 

数学表示为:=,>0是一个预设的参数

理论上PBI聚合方法将个体向最优Pareto面的逼近分为与权重向量间的距离沿着权重向量与最优Pareto面的距离,PBI 被设计为两个部分:沿权重向量向最优Pareto 面逼近的因素(即收敛性信息)和与权重向量的距离因素(即分布性信息)。惩罚系数定义了适应度中分布性和收敛性比例。一般情况下,取值较小。使用PBI聚合函数得到的最优解在由参考点出发方向为权重向量的向量与最优Pareto 面的交点附近。反过来,根据最优解在目标空间的位置可以近似找到求该解所对应子问题的权重向量。

上述三种聚合方法可以用来将多目标进化算法对Pareto 最优边界的逼近转化为一组标量优化问题。足够大的均匀分布的权重向量通常会引导一组Pareto最优向量,这些解可能不是均匀分布的,但可以很好的逼近Pareto 最优边界。MOEA/D 的性能在很大程度上是由聚合方法决定的,个体的进化方向也取决于聚合方法。数学意义上,三种不同的聚合方法将权重向量转换为沿一定方向的选择压力,即通过加权得到的子问题的进化方向是由聚合方法决定的。在MOEA/D 实现中的一个重要的问题是如何选择一个合适的聚合方法。众

所周知,Weighted sum 不能适当地处理最优Pareto 前沿非凸的多目标问题而Tchebycheff可以处理它们。此外,Tchebycheff具有良好的理论特性。因此,在MOEA/D 中与Weighted sum 相比Tchebycheff似乎是一个更好的选择。然而,应用MOEA/D 处理多目标背包问题时清楚地表明Weightedsum 可以获得比Weighted Tchebycheff更好的效果。这种现象表明,在凸问题中使用Weightedsum,而Tchebycheff适合在其他最优Pareto 前沿是非凸的问题。

7、  MOEA/D使用若干个临近子问题的信息优化每个子问题

8、  MOEA/D算法框架:

输入:

MOP:需要解决的多目标问题,及多目标的目标个数m

N:子问题的个数,即种群的大小

权重向量:一组均匀分布的权重向量,分别对应每一个子问题

T:预先定义的每个权重向量的邻居范围

输出:EP(external population)外部存档 外部种群

算法流程:

第一步:初始化EP为空集,计算每组权重向量之间的欧几里得距离,并对于每一个权重向量,每一个子问题,计算出它的最邻近的T个邻居,并用一个B(i)存储这T个邻居(存储的是个体的索引,包括自己本身,自己是最近的邻居),然后根据目标问题随机初始化一个大小为N的种群,并为每一个子问题分配一个个体,计算每个目标函数相对应的值为f(xi),这样就初始化得到参考点向量Z;

第二步:更新种群,对于每一个子问题(个体)首先在它的邻居(大小T)B(i)中随机选择两个子问题对应的个体进行遗传算子的操作(交叉)得到一个新个体y,然后对这个新个体y进行进一步的修补改善操作(变异)得到另一新个体y’; 对于新的个体求出它相对应的每个目标的值更新参考向量Z(m维) ,Zj =f(y’);然后更新邻居B(i),根据你选用的聚合方法来更新,如果选择切比雪夫的方法就根据这个方法的公式来比较邻居中的个体使得对应子问题的值最优情况来更新,如果选择的是带惩罚因子的边界交叉法也相应的根据它的公式来更新;最后更新外部存档(EP),根据计算每个子问题的值来更新

 

9、  MOPSO/D算法的流程:

->计算任意两个权重向量的欧式距离,并为每一个粒子求得最近的T个邻居;

->初始化产生一个种群,并初始化每个粒子的速度为0.0

->初始化参考点z

->初始化每个粒子的pbest和gbest都为其本身

->根据速度和位置更新公式更新每个粒子的速度和位置

->更新z

->根据所选的聚合方法更新每个粒子的pbest和gbest

->更新存档

 

dMOPSO,另外一种基于分解的多目标粒子群算法

1、avoidsthe use of an external archive

2、基本框架:与MOEA/D类似 W的获取也是采取MOEA/D中的方法,采用的是PBI聚合方法

3、算法流程

Step 1.1Initialize parameters (iteration_ = 0)

Step 1.2 Generate a swarm of N random particles

Step 1.3 Initialize the speed_ and age_ of each particle to 0

接下来的流程就与MOPSO/D类似了

Step 1.4 Generate a well-distributed set of N weightedvectors

Step 1.5 and 1.6 Define the personal best and the globalbest

Step 2 Shuffle the global best

如果一个粒子在飞行过程中它未能提供自己的位置信息,则它的age+1

if (age_[i] < maxAge_) { Step 3.1 Update particle

        }else{ Step 3.2 Reset particle}

  在选择pbest和gbest时采用一个带参数的概率密度函数来重新初始化粒子的记忆(高斯分布的概率密度函数)

   Step 3.3 Repair bounds

  Step 3.4 Evaluate the particle and update Z*

  Step 3.5 Update the personal best

  Step 4 Update the global best

  Gbest 加入存档ss 并返回 ss

缺点:1、因为它是达到一定的年龄就重新初始化每个粒子的记忆,这样就有可能会导致在进化过程中丢失一些有利的经验,而且会增加算法的复杂度

      2、因为用分解的策略代替支配的方法,该算法没有用支配关系来处理pbest和gbest,这样会限制种群的大小,而且无法达到收敛到全局的PF

 

 

DDMOPSO(MOPSO Based on Decomposition andDominance with Archiving Using

Crowding Distance in Objectiveand Solution Spaces)

Decomposition assiststhe optimization process to find potential solutions that are evenlydistributed along the PF (Zhang and Li, 2007). By associating each particlewith a distinct aggregation problem (i.e., λ value), the direction of exploration activity of each particleis focused on a specific region in the objective space and is aimed at reducingthe distance to the reference point.

Substituting entirelythe dominance approach with decomposition in MOPSO (i.e.,using the aggregationvalue instead of dominance as the leaders’ selection criterion)might lead topremature convergence as each particle is strictly directed to one destination.Atsome point during the optimization process, the particles would be unable to updatetheir positions and personal best memory as the local best and neighborhood informationbecome static.

In addition, solvingan MOP with complicated PF raises a serious challenge, as some λ vectors direct the corresponding particlesto unattainable areas. In such cases, part of the swarm would be exploringundesirable regions in the objective space for a considerable number ofevaluations. Figure 2 demonstrates this problem, where only eight out of 20particles are directed toward the true PF.

 

Another limitation ofdecomposition relates to how it operates in high-dimensional objective spaces.It struggles to produce a sufficient number of non-dominated solutions thatcover the entire PF as the space to be covered by the swarm/population using λ vectors grows exponentially with thenumber of dimensions. This requires decomposition-based approaches to use alarge swarm/population in order to offer a good PF coverage, thereforeincreasing the number of necessary function evaluations, which can be adisadvantage for real-life problems with expensive or difficult-to-obtain evaluations.

   To overcome all these drawbacks within theMOPSO framework, D2MOPSO integrates

both dominance and decomposition.

   D2MOPSO uses PBI to transform the optimizationobjective defined by Equation(1) into N scalar optimization problems, where N is the swarm size.

Decomposition is used to select the leaders from adominance-based archive

 

 

MMOPSO(A Novel Multi-objective ParticleSwarm Optimization with Multiple

SearchStrategies)

   Decomposition approach is adoptedin MMOPSO to decompose MOPs into a set of SOPs and then each particle isassigned to optimize each SOP. Two search strategies for updating theparticle’s velocity are presented to accelerate the convergence speed andmaintain the population diversity respectively. Their cooperation is controlledby a pre-defined threshold.

  All the non-dominated solutionsvisited by the particles are stored in a finite-size external archive. Once theexternal archive is full, only the non-dominated solutions with biggercrowding-distance values will be remained, which are considered to be theelitist solutions and a good representative of the entire PF

  New definitions of personal-bestand global-best particles are given in MMOPSO

personal-best and global-best particles are considered to be the bestvalues of each aggregation problem and all of SOPs, respectively

 

MMOPSO算法流程:

->初始化外部存档A

->初始化N个权重向量,采用PBI边界交叉法把多目标问题转换为N个不同子问题

->随机的初始化每个粒子的位置,每个粒子的初始速度设置为0

->初始化外部存档A(一开始把非支配的粒子都加入外部存档),存档更新

->进入主循环:

->速度更新:设置一个门限d

for i = 1 to N

 if r <d

selection for xpbest (Algorithm1): for i =1 to N

                                  xpbesti= 1 A ;

for j = 2 to | A|

if ( |li , z*) >g xpbesti g (Aj |li , z*)

xpbesti = Aj ;

end if

end for

                            endfor;

 update the velocity using Eq. (1):vi(t) = w ·vi(t−1)+C1·r1 ·(xpbesti −xi)

else

 randomly select a solution from A as xgbest;

update the velocity using Eq.(2): vi(t) = w ·vi(t−1)+C2·r2 ·(xgbesti −xi)

end if

      updatethe position using Eq. (3): xi(t) = xi(t − 1) + vi(t)

      evaluatethe objectives of new particles;

      update the reference point z* in Eq. (4): Min g (x |l, z*) = d1 +q d2

end for

  存档更新,然后对存档进行进化算子操作,然后根据目标对粒子进行估计得到新的粒子群再更新z *

然后再进行存档更新,这里对存档进行进化算子操作的算法如下:它是先在存档A中选择一定数量e的具有较大拥挤度距离的非支配粒子加入一个新的解集E中,e小于存档A的大小N,然后执行以下算法:

for i =1 to | A| 对于外部存档A中的每一个非支配粒子

generate a randomnumber j in [1, | E| ]; 在E中随机的选择一个非支配粒子

  {C1 ,C2 } =SBX( Ai , Ej );    对以上选择的两个非支配粒子进行SBX交叉操作得到新的两个子代粒子

generate a randomnumber k in [0, 1];  在以上两个子代粒子中随机选择一个粒子

  Si =PM(Ck );  选择的子代粒子进行变异操作

end for  这样就会得到一个新的存档A的子代粒子群集S, S的大小也是N,然后将S与A进行存档更新操作,删除A中被S中解支配的粒子,将A和S中的非支配解都加入到A中,如果A的大小大于N,则进行裁剪操作

外部存档更新:仍然使用支配关系和拥挤度距离来更新存档


原文:https://blog.csdn.net/sbcypress/article/details/50727907 

  • 14
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MOPSO(Multi-Objective Particle Swarm Optimization)是一种基于粒子群算法(PSO)的多目标优化算法。与传统的单目标优化算法不同,MOPSO算法主要用于解决具有多个相互竞争的优化目标的问题。 MOPSO算法的核心思想是通过模拟粒子在搜索空间中的运动和信息交流,以寻找最优的解决方案。粒子代表了搜索空间中的一个解,每个粒子都有自己的位置和速度,通过与其他粒子和全局最优解之间的比较来更新自己的位置和速度。MOPSO算法引入了非劣解集(Pareto Set)和划分策略,以有效地维护和更新一组非劣解。 MOPSO算法在每一代中,通过计算每个粒子的适应度值来确定其在非劣解集中的位置。然后,根据该粒子的所在位置,更新其速度和位置。同时,通过交换信息,更新非劣解集中的解。这样循环迭代,直到达到预设的停止条件,得到最终的非劣解集。 MOPSO算法在解决多目标优化问题时具有一些优势。首先,该算法能够同时考虑多个竞争的目标,避免了单目标优化算法的问题。其次,MOPSO算法能够得到一组非劣解,提供了多个可行的解决方案供决策者选择。此外,MOPSO算法具有较好的收敛性能和搜索能力,能够快速找到全局的非劣解。 综上所述,MOPSO算法是一种适用于多目标优化问题的高效算法。通过模拟粒子在搜索空间的移动和信息交流,MOPSO算法能够找到一组优质的非劣解,为决策者提供多个可行的解决方案。在实际应用中,MOPSO算法在多目标优化领域具有广泛的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值