无约束优化方法之powell方法

无约束优化方法是优化技术中心极为重要也是最基本的内容之一。无约束优化问题的数学模型为:
min ⁡ x ∈ R n f ( x ) \min_{x \in R^n}f(x) xRnminf(x)
无约束优化方法不仅可解决设计中无约束优化问题,更重要的是通过对无约束优化方法的研究,给求解约束优化方法提供良好的概念和理论基础,而且约束优化问题通过数学处理可化为无约束优化问题,利用无约束优化方法来求解。所以无约束优化方法在优化设计中有十分重要的作用;
根据确定搜索方向所使用的信息和方法,无约束优化方法可以分为两大类:
(1)直接法:这列方法仅利用计算目标函数值的信息来构造搜索方向。如坐标轮换法、powell法和单纯形法等。由于只需要计算和比较目标函数值,对于那些无法求导数或求导数很困难的函数,这类方法就有适用性广和可靠性高的显著优越性,但是这类方法一般收敛速度比较慢。
(2)间接法:这类方法利用函数的一阶导数甚至二阶导数的信息来构造搜索方向。如梯度法、牛顿法、变尺度法等。由于需要计算函数的一阶导数甚至二阶导数,因此这类方法计算量较大,但收敛速度较快。

本篇重点讨论共轭方向及powell法。

一、共轭方向的定义
在优化方法中,共轭方向的概念有着重要的意义,一些有效的无约束方法大多都是以共轭方向为搜索方向而形成的。首先考察二维的二次函数
f ( x ) = 1 2 x T A x + b T x + c f(x)=\frac{1}{2}x^TAx+b^Tx+c f(x)=21xTAx+bTx+c
在这里插入图片描述

如上图,设由任一点 x 0 x_0 x0出发,沿下降方向 s 0 s_0 s0进行一维搜索得到 x 1 x_1 x1,且
x 1 = x 0 + α 0 s 0 x_1=x_0+\alpha_0 s_0 x1=x0+α0s0
再由点 x 1 x_1 x1出发,沿直指极值点 x ∗ x^* x的方向 s 1 s_1 s1进行一维搜索得极值点 x ∗ x^* x.
显然
x ∗ = x 1 + α 1 s 1 x^*=x_1+\alpha_1 s_1 x=x1+α1s1
下面分析直指极值点 x ∗ x^* x的方向 s 1 s_1 s1与方向 s 0 s_0 s0的关系。
对二次型求导可知
∇ f ( x ) = A x + b \nabla f(x)=Ax+b f(x)=Ax+b
由极值的必要条件可知 ∇ f ( x ∗ ) = A x ∗ + b = 0 \nabla f(x^*)=Ax^*+b=0 f(x)=Ax+b=0
于是有
∇ f ( x ∗ ) = A ( x 1 + α 1 s 1 ) + b = ( A x 1 + b ) + α 1 A s 1 = 0 \nabla f(x^*)=A(x_1+\alpha_1 s_1) + b=(Ax_1+b)+\alpha_1 As_1 = 0 f(x)=A(x1+α1s1)+b=(Ax1+b)+α1As1=0
改写上式有
∇ f ( x ∗ ) = ∇ f ( x 1 ) + α 1 A s 1 = 0 \nabla f(x^*)=\nabla f(x_1)+\alpha_1 A s_1 = 0 f(x)=f(x1)+α1As1=0
两边左乘 s 0 s_0 s0,有
s 0 T ∇ f ( x 1 ) + α s 0 T A s 1 = 0 s_0^T\nabla f(x_1) + \alpha s_0^TAs_1=0 s0Tf(x1)+αs0TAs1=0
由梯度的性质可知: ∇ f ( x 1 ) \nabla f(x_1) f(x1) s 0 s_0 s0正交,又由于最优步长因此不等于零,故有
s 0 T A s 1 = 0 s_0^TAs_1=0 s0TAs1=0
这就是两个向量共轭的数学表达式;
定义:设A是nxn阶实对称正定矩阵,如果有两个n为非零向量 s 1 s_1 s1 s 2 s_2 s2,若满足:
s 1 T A s 2 = 0 s_1^TAs_2=0 s1TAs2=0
则称 s 1 s_1 s1 s 2 s_2 s2关于对称正定矩阵A是共轭的,或简称向量 s 1 s_1 s1 s 2 s_2 s2关于A共轭;
若非零向量组 s 1 , s 2 , ⋯   , s k s_1,s_2,\cdots,s_k s1,s2,,sk满足
s i T A s j = 0 , ( i ≠ j ; i , j = 1 , 2 , ⋯   , k ) s_i^TAs_j=0,(i\ne j;i,j=1,2,\cdots,k) siTAsj=0,(i=j;i,j=1,2,,k)
则称向量组 s 1 , s 2 , ⋯   , s k s_1,s_2,\cdots,s_k s1,s2,,sk关于矩阵A是共轭的。A的一个特例是目标函数的海塞矩阵;若A是单位矩阵I,则向量组互相正交;若A不是单位矩阵,则可理解为向量 s 2 s_2 s2经过矩阵A线性变换后的向量 ( s 2 ) ′ = A s 2 (s_2)^{'}=As_2 (s2)=As2与向量 s 1 s_1 s1正交。这说明政教向量是共轭的一种特例,或者说向量共轭是正交的推广。

二、共轭方向的性质
这里不加证明的给出共轭方向的性质;
可以证明,对于一般函数,共轭方向具有以下重要性质,这里设A为nxn阶实对称正定矩阵:
(1)若 s 1 , s 2 , ⋯   , s n s_1,s_2,\cdots,s_n s1,s2,,sn为关于矩阵A共轭的n哥非零向量,则这一组向量线性无关。
由此可得推论:在n维空间中相互共轭的非零向量的个数不超过n个
(2)设向量 s i 1 ( i = 1 , 2 , ⋯   , n ) s_i^1 (i=1,2,\cdots,n) si1(i=1,2,,n)是一组线性无关的非零向量,则可构造出n个非零向量 s i 2 ( i = 1 , 2 , ⋯   , n ) s_i^2 (i=1,2,\cdots,n) si2(i=1,2,,n),使满足
( s i 2 ) T A S j 1 = 0 , ( i ≠ j ; i , j = 1 , 2 , ⋯   , n ) (s_i^{2})^TAS_j^1=0,(i\ne j;i,j=1,2,\cdots,n) (si2)TASj1=0,(i=j;i,j=1,2,,n)
这说明共轭向量由线性无关的向量构造。由于坐标轴方向是线性无关的,故可得推论:可有坐标轴方向来构造共轭向量。
(3)若 s 1 , s 2 , ⋯   , s n s_1,s_2,\cdots,s_n s1,s2,,sn为关于矩阵A共轭的n哥非零向量,则对于正定的n维二次函数
f ( x ) = 1 2 x T A x + b T x + c f(x)=\frac{1}{2}x^TAx+b^Tx+c f(x)=21xTAx+bTx+c
从任一点 x 0 x_0 x0出发,依次沿 s i , ( i = 1 , 2 , ⋯   , n ) s_i,(i=1,2,\cdots,n) si,(i=1,2,,n)方向进行一维搜索,之多n次变可收敛到极小值点 x ∗ x^* x。这说明沿共轭方向搜索具有二次收敛速度。而对于非二次函数上述的极小值点还不是该函数的极小值点,需要进一步搜索,得到新的共轭方向组,反复迭代,直至最后逼近最小值点。

n维函数共轭方向的形成:沿n个线性无关的方向进行一轮一维搜索,连接该轮迭代的起始点 x 0 k x_0^k x0k和终止点 x n k x_n^k xnk的向量,即为新产生的共轭方向。

三、共轭方向法
(1)基本思想
根据上面的共轭方向的概念和性质,共轭方向法的基本思想:首先采用坐标轴方向作为第一轮搜索方向进行一轮一维搜索迭代。然后将第一轮迭代的初始点与最末一个极小值点连接构成新的方向,以该新的方向作为最末一个方向,淘汰第一个方向,得下一轮迭代的n个搜索方向。依此下去,直至逼近极值点。
(2)共轭方向法的步骤


步1 给定初始点 x 0 x_0 x0,迭代轮数 k = 1 k=1 k=1,令 x 0 k = x 0 x_0^k=x_0 x0k=x0,收敛精度 ϵ \epsilon ϵ
步2 输入坐标轴方向作为第一轮的搜索方向,即
s i k = e i , e i = [ 0 , ⋯   , 1 , 0 , ⋯   , 0 ] T , ( i = 1 , 2 , ⋯   , n ) s_i^k=e_i, e_i=[0,\cdots,1,0,\cdots, 0]^T,(i=1,2,\cdots,n) sik=ei,ei=[0,,1,0,,0]T,(i=1,2,,n)
步3 从 x 0 k x_0^k x0k开始,以此沿方向 s i k s_i^k sik进行n次一维搜索得到n个一维极小值点 x i k , ( i = 1 , 2 , ⋯   , n ) x_i^k,(i=1,2,\cdots,n) xik,(i=1,2,,n),连接点 x 0 k x_0^k x0k x n k x_n^k xnk,构造第一个共轭方向:
s n + 1 k = x n k − x 0 k s_{n+1}^k=x_n^k-x_0^k sn+1k=xnkx0k
步4 从 x n k x_n^k xnk出发沿 s n + 1 k s_{n+1}^k sn+1k进行一维搜索,得极小值点 x n + 1 k x_{n+1}^k xn+1k(完成了一轮迭代)
步5 收敛精度判断,若 ∣ ∣ x n + 1 k − x 0 k ∣ ∣ < ϵ ||x_{n+1}^k-x_0^k||\lt \epsilon xn+1kx0k<ϵ,则输出 x ∗ = x n + 1 k x^*=x_{n+1}^k x=xn+1k,结束;否则,淘汰 s 1 k s_1^k s1k,增加 s n + 1 k s_{n+1}^k sn+1k,构成第k+1轮的搜索方向: s i k + 1 = s i + 1 k , ( i = 1 , 2 , ⋯   , n ) s_i^{k+1}=s_{i+1}^k,(i=1,2,\cdots,n) sik+1=si+1k,(i=1,2,,n)
步6 将 x k + 1 k → x 0 k + 1 x_{k+1}^k\rightarrow x_0^{k+1} xk+1kx0k+1,令k=k+1,返回步3


(3)共轭方向法存在的问题
在上述共轭方向基本算法中,方向组的替换采用了固定的格式,运算比较简便。但由此形成的方向组中,有可能出现几个方向线性相关或近似线性相关的现象。也就是说,在新的方向组中有可能存在两个方向平行的情况。显然,这将导致新的方向组共轭方向个数减小,从而使迭代运算退化到一个较低维空间中进行,即降维搜索,因此无法得到真正的极小值点。
以三维空间为例:从 x 0 1 x_0^1 x01出发分别沿三个方向作一维搜索,得到三个方向上的极小值点为:
x 1 1 = x 0 1 + α 1 1 s 1 1 x 2 1 = x 1 1 + α 2 1 s 2 1 = x 0 1 + α 1 1 s 1 1 + α 2 1 s 2 1 x 3 1 = x 2 1 + α 3 1 s 3 1 = x 0 1 + α 1 1 s 1 1 + α 2 1 s 2 1 + α 3 1 s 3 1 \begin{aligned} x_1^1 &=x_0^1+\alpha_1^1s_1^1 \\ x_2^1 &=x_1^1+\alpha_2^1s_2^1 =x_0^1+\alpha_1^1s_1^1 +\alpha_2^1s_2^1\\ x_3^1 &=x_2^1+\alpha_3^1s_3^1 =x_0^1+\alpha_1^1s_1^1 +\alpha_2^1s_2^1+\alpha_3^1s_3^1 \end{aligned} x11x21x31=x01+α11s11=x11+α21s21=x01+α11s11+α21s21=x21+α31s31=x01+α11s11+α21s21+α31s31
由首末两点构造的新方向为:
s 4 1 = x 3 1 − x 0 1 = α 1 1 s 1 1 + α 2 1 s 2 1 + α 3 1 s 3 1 s_4^1=x_3^1-x_0^1=\alpha_1^1s_1^1 +\alpha_2^1s_2^1+\alpha_3^1s_3^1 s41=x31x01=α11s11+α21s21+α31s31
若其中的 α 1 1 = 0 \alpha_1^1=0 α11=0或者 α 1 1 ≈ 0 \alpha_1^1\approx 0 α110,也就是说,在方向 s 1 1 s_1^1 s11上函数无下降或者下降得很小,则上式为
s 4 1 = α 2 1 s 2 1 + α 3 1 s 3 1 s_4^1=\alpha_2^1s_2^1+\alpha_3^1s_3^1 s41=α21s21+α31s31
若以 s 4 1 s_4^1 s41替换 s 1 1 s_1^1 s11,则由上式看出,由此形成的三个方向线性相关,因此,以后的迭代将始终局限在该平面内,使三维的问题退化到二维问题。显然在二维平面内无法搜索到三维空间中的真正极小值点。鉴于以上问题,M.J.D.Powell与1964年对共轭方向基本算法进行了改进,形成了Powell法

四、共轭方向阀的改进—Powell法
(1)基本思想
powell法与上述为改进的共轭方向法迭代过程基本相同,其不同的点是:
a)在(k+1)轮迭代中,是否选用新产生的方向 s n + 1 k s_{n+1}^k sn+1k要进行判断;
b)若选用,也不一定淘汰第k轮的第一个方向 s 1 k s_1^k s1k,淘汰哪一个方向也要进行判断,其目的是避免新一轮的搜索方向线性相关,出现退化现象,导致搜索降维。
(2)共轭方向 s k + 1 n s_{k+1}^n sk+1n的选取与淘汰方向的判断
在得到新的方向 s n + 1 k = x n k − x 0 k s_{n+1}^k=x_n^k-x_0^k sn+1k=xnkx0k之后,沿方向 s n + 1 k s_{n+1}^k sn+1k找到点 x 0 k x_0^k x0k关于点 x n k x_n^k xnk的反射点 x n + 2 k x_{n+2}^k xn+2k,如下图所示
在这里插入图片描述

x n + 1 k = x n k + ( x n k − x 0 k ) = 2 x n k − x 0 k x_{n+1}^k=x_n^k+(x_n^k-x_0^k)=2x_n^k-x_0^k xn+1k=xnk+(xnkx0k)=2xnkx0k
分别计算三个点的函数值
f 1 = f ( x 0 k ) , f 2 = f ( x n k ) , f 3 = f ( x n + 2 k ) f_1=f(x_0^k),f_2=f(x_n^k),f_3=f(x_{n+2}^k) f1=f(x0k),f2=f(xnk),f3=f(xn+2k)
然后找出前一轮一维搜索过程中函数值下降最大的方向 s m k s_m^k smk及其最大的下降量 Δ m \Delta_m Δm,即 Δ m k = max ⁡ i = 1 , 2 , ⋯   , n ∣ f ( x i − 1 k ) − f ( x i k ) ∣ \Delta_m^k=\max_{i=1,2,\cdots,n}|f(x_{i-1}^k)-f(x_i^k)| Δmk=maxi=1,2,,nf(xi1k)f(xik),Powell的研究结果,若以下关系
f 3 < f 1 ( f 1 + f 3 − 2 f 2 ) ( f 1 − f 3 − Δ m k ) 2 < 1 2 Δ m k ( f 1 − f 3 ) 2 \begin{aligned} & f_3 < f_1 \\ & (f_1 + f_3 - 2f_2)(f_1 - f_3 - \Delta_m^k)^2 < \frac{1}{2}\Delta_m^k(f_1-f_3)^2 \end{aligned} f3<f1(f1+f32f2)(f1f3Δmk)2<21Δmk(f1f3)2
同时满足,则表明方向 s n + 1 k s_{n+1}^k sn+1k与园方向线性无关,因此可以用来替换。替换的方向就是 Δ m \Delta_m Δm所对应的方向 s m k s_m^k smk,即淘汰原方向 s m k s_m^k smk,而把新的方向 s n + 1 k s_{n+1}^k sn+1k加到方向组的末尾。替换的通式为
s i k + 1 = s i k , i < m s i k + 1 = s i + 1 k , i > m \begin{aligned} s_i^{k+1}=s_i^k,i<m \\ s_i^{k+1}=s_{i+1}^k, i\gt m \end{aligned} sik+1=sik,i<msik+1=si+1k,i>m
若Powell判别式不满足,则表明 s n + 1 k s_{n+1}^k sn+1k与原方向组中的某些方向线性相关,因此不能选用新方向,扔用第k轮中的迭代方向作为第k+1轮的搜索方向,即令
s i k + 1 = s i k , ( i = 1 , 2 , ⋯   , n ) s_i^{k+1}=s_i^k, (i=1,2,\cdots,n) sik+1=sik,(i=1,2,,n)

Powell法的具体步骤


步1 给定初始点 x 0 x_0 x0,迭代论数k=1,令 x 0 k = x 0 x_0^k=x_0 x0k=x0,维数n,收敛精度 ϵ 1 , ϵ 2 \epsilon_1,\epsilon_2 ϵ1,ϵ2
步2 输入坐标轴方向作为第一轮的搜索方向,即
s i k = e i , e i = [ 0 , ⋯   , 1 , 0 , ⋯   , 0 ] T , ( i = 1 , 2 , ⋯   , n ) s_i^k=e_i, e_i=[0,\cdots,1,0,\cdots, 0]^T,(i=1,2,\cdots,n) sik=ei,ei=[0,,1,0,,0]T,(i=1,2,,n)
步3 从 x 0 k x_0^k x0k开始,依次沿方向 s i k s_i^k sik进行一轮(n次)一维搜索得到n个一维极小值点:
x i k = x i − 1 k + α i k s i k , ( i = 1 , 2 , ⋯   , n ) x_i^k=x_{i-1}^k+\alpha_i^ks_i^k, (i=1,2,\cdots,n) xik=xi1k+αiksik,(i=1,2,,n)
计算: Δ m k = max ⁡ i = 1 , 2 , ⋯   , n ∣ f ( x i − 1 k ) − f ( x i k ) ∣ \Delta_m^k=\max_{i=1,2,\cdots,n}|f(x_{i-1}^k)-f(x_i^k)| Δmk=maxi=1,2,,nf(xi1k)f(xik),得相应的方向 s m k s_m^k smk;
步4 收敛精度判断:若满足 ∣ ∣ x n k − x 0 k ∣ ∣ ≤ ϵ 1 ||x_n^k-x_0^k||\le \epsilon1 xnkx0kϵ1,并且 ∣ f ( x 0 k ) − f ( x n k ) f ( x 0 k ) ∣ ≤ ϵ 2 |\frac{f(x_0^k)-f(x_n^k)}{f(x_0^k)}|\le\epsilon_2 f(x0k)f(x0k)f(xnk)ϵ2,则令 x ∗ = x n k , f ( x ∗ ) = f ( x n k ) x^*=x_n^k,f(x^*)=f(x_n^k) x=xnk,f(x)=f(xnk),结束迭代;否则转下一步;
步5 构造共轭方向,连接点 x 0 k x_0^k x0k x n k x_n^k xnk构造共轭方向 s n + 1 k = x n k − x 0 k s_{n+1}^k=x_n^k-x_0^k sn+1k=xnkx0k
步6 求反射点 x n + 2 k = 2 x n k − x 0 k x_{n+2}^k=2x_n^k-x_0^k xn+2k=2xnkx0k,计算函数值 f 1 = f ( x 0 k ) , f 2 = f ( x n k ) , f 3 = f ( x n + 2 k ) f_1=f(x_0^k),f_2=f(x_n^k),f_3=f(x_{n+2}^k) f1=f(x0k),f2=f(xnk),f3=f(xn+2k);
步7 Powell条件判别:若满足判别式
f 3 < f 1 ( f 1 + f 3 − 2 f 2 ) ( f 1 − f 3 − Δ m k ) 2 < 1 2 Δ m k ( f 1 − f 3 ) 2 \begin{aligned} & f_3 < f_1 \\ & (f_1 + f_3 - 2f_2)(f_1 - f_3 - \Delta_m^k)^2 < \frac{1}{2}\Delta_m^k(f_1-f_3)^2 \end{aligned} f3<f1(f1+f32f2)(f1f3Δmk)2<21Δmk(f1f3)2
则取共轭方向 s n + 1 k s_{n+1}^k sn+1k,转下一步;步满足,则转步10
步8 从点 x n k x_n^k xnk出发,沿方向 s n + 1 k s_{n+1}^k sn+1k作一维搜索取得极小值点 x n + 1 k = x n k + α n k s n + 1 k x_{n+1}^k=x_n^k+\alpha_n^ks_{n+1}^k xn+1k=xnk+αnksn+1k
步9 进行方向替换,构成新的方向组 s i k + 1 , ( i = 1 , 2 , ⋯   , n ) s_i^{k+1},(i=1,2,\cdots,n) sik+1,(i=1,2,,n),令
s i k + 1 = s i k , i < m s i k + 1 = s i + 1 k , i > m \begin{aligned} s_i^{k+1}=s_i^k,i<m \\ s_i^{k+1}=s_{i+1}^k, i\gt m \end{aligned} sik+1=sik,i<msik+1=si+1k,i>m
x 0 k + 1 = x n + 1 k , k = k + 1 x_0^{k+1}=x_{n+1}^k,k=k+1 x0k+1=xn+1k,k=k+1,转步3;
步10 不进行方向替换,扔用第k轮的搜索方向组,令 s i k + 1 = s i k , ( i = 1 , 2 , ⋯   , n ) s_i^{k+1}=s_i^k,(i=1,2,\cdots,n) sik+1=sik,(i=1,2,,n),若 f 2 < f 2 f_2<f_2 f2<f2时,取 x 0 k + 1 = x n k x_0^{k+1}=x_n^k x0k+1=xnk;否则,取 x 0 k + 1 = x n + 2 k , k = k + 1 x_0^{k+1}=x_{n+2}^k,k=k+1 x0k+1=xn+2k,k=k+1,转步3;


五、powell法的代码实现

function [fmin, xmin] = powell_method(func, func1D, x0, eps1, eps2, N)

%k = 1;
%x0_old = x0;
s = diag(ones(1, N));
x = zeros(N, N+1);
x(:, 1) = x0;

iIter = 0;
iterMax = 5000;
epsilon = 1e-5;
deltaMax = zeros(N, 1);

while iIter < iterMax
    for i = 2:N+1
        h = 0.5;
        alpha0 = 0;
        func1DTemp = @(y)(func1D(y, s(:, i-1)));
        [alphaMin, alphaMax] = forward_backward_method(func1DTemp, alpha0, h);
        [alpha, ~] = golden_line_search(func, alphaMin, alphaMax, epsilon);
        x(:, i) = x(:, i-1) + alpha * s(:, i-1);
    end
    
    % find max
    for i = 2:N+1
        deltaMax(i-1, 1) = abs( feval(func, x(:, i-1)) - feval(func, x(:, i)) );
    end
    
    [deltaMaxK, kMax] = max(dletaMax);
    
    if norm(x(:,N+1) - x(:, 1), 2) <= eps1
        fxN = feval(func, x(:, N+1));
        fx0 = feval(func, x(:, 1));
        if abs((fxN - fx0) / fx0) <= eps2
            xmin = x(:, N+1);
            fmin = feval(func, xmin);
            break;
        end
    end
    
    sNP1 =  x(:, N+1) - x(:, 1);
    xNP2 =  2 * x(:, N+1) - x(:, 1);
    f1 = feval(func, x(:, 1));
    f2 = feval(func, x(:, N+1));
    f3 = feval(func, xNP2);
    y1 =  (f1 + f3 - 2 * f2) * (f1 - f2 - deltaMaxK)^2;
    y2 = 0.5 * deltaMaxK * (f1 - f3)^3;
    
    if (f3 < f1) && (y1 < y2)
        h = 0.5;
        alpha0 = 0;
        func1DTemp = @(y)(func1D(y, sNP1));
        [alphaMin, alphaMax] = forward_backward_method(func1DTemp, alpha0, h);
        [alpha, ~] = golden_line_search(func, alphaMin, alphaMax, epsilon);
        xNP1 = x(:, N+1) + alpha * sNP1;
        
        for i = kMax:N-1
            s(:, i) = s(:, i+1);
        end
        
        s(:, N) = sNP1;
        x(:, 1) = xNP1; 
    else
        if f2 < f3
            x(:, 1) = x(:, N+1);
        else
            x(:, 1) = xNP2;
        end
    end
    
    iIter = iIter + 1;
    %k = k + 1;
end

if iIter == iterMax
    fprintf('reach maximum iteration, and not found suitable xmin.\n');
    xmin = zeros(N, 1);
    fmin = feval(func, xmin);
end  
    
end

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值