强化学习复现笔记(1)基本概念

摘要: 通过强化学习走直线理解基本概念。一条线上包含起点和终点共有6个格子,起点在左终点在右,相当于1维迷宫。各个概念的定义见文末参考链接,本文计算走直线中各变量的具体值来帮助理解基本概念和贝尔曼最优方程。对应参考链接[2]的前3章。

基本概念

  智能体要从最左边的第一个格子走到最右边的终点一次走一步。把6个格子分别记作状态 s 1 , s 2 , ⋯   , s 6 s_1,s_2,\cdots,s_6 s1,s2,,s6,动作有两种,分别记作 L L L R R R。如果不特别说明,一般随机变量为大写字母,具体数值为小写字母。 L L L R R R 表示动作,不是随机变量。假设智能体已经学到了最优的策略,并且在每一步行动时,以 0.9 0.9 0.9 的概率选择最优策略(也就是往右),以 0.1 0.1 0.1 的概率选择随机策略。
  策略函数 (Policy Function) 在一个状态 s i s_i si 处采取每个动作 a i a_i ai 的概率 π ( a ∣ s ) \pi(a|s) π(as)。简单记作 π ( L ∣ s ) = 0.1 , π ( R ∣ s ) = 0.9 \pi(L|s)=0.1,\pi(R|s)=0.9 π(Ls)=0.1,π(Rs)=0.9,严谨写法为
{ π ( A = L ∣ S = s i ) = 0.1 , π ( A = R ∣ S = s i ) = 0.9 , i ≠ 1 π ( A = L ∣ S = s i ) = 0 , π ( A = R ∣ S = s i ) = 1 , i = 1 \begin{cases} \pi(A=L|S=s_i)=0.1,\pi(A=R|S=s_i)=0.9, & i \neq 1 \\ \pi(A=L|S=s_i)=0,\pi(A=R|S=s_i)=1, & i = 1 \\ \end{cases} {π(A=LS=si)=0.1,π(A=RS=si)=0.9,π(A=LS=si)=0,π(A=RS=si)=1,i=1i=1
如果在起点处往左走,环境给的反馈是智能体保持在起点不动。此处的下标 i i i 与后面表示回合数的 t t t 的区别在于,这个例子里的 i i i 是有限的,最多只有6个,而 t t t 的数量可以无限。
  奖励 (Reward): 智能体在状态 s i s_i si 处采取动作 a i a_i ai 后,环境给的奖励 r ( s , a ) r(s,a) r(s,a) r ( s = s 5 , a = R ) = 6 r(s=s_5,a=R)=6 r(s=s5,a=R)=6(不取1是为了便于区分),其余的 r ( s , a ) r(s,a) r(s,a) 都是0。
  (折扣)回报(Return): 从第 t t t 个回合开始计算的每个回合奖励的总和
U t = R t + γ R t + 1 + γ 2 R t + 2 + ⋯ U_t=R_t+\gamma R_{t+1}+\gamma^2R_{t+2}+\cdots Ut=Rt+γRt+1+γ2Rt+2+
下面都能达到终点的的几个动作和对应的回报分别为

  • RRRRR: 0 + 0 γ + 0 γ 2 + 0 γ 3 + 6 γ 4 0+0\gamma+0\gamma^2+0\gamma^3+6\gamma^4 0+0γ+0γ2+0γ3+6γ4
  • RRRLRRR: 0 + 0 γ + 0 γ 2 + 0 γ 3 + + 0 γ 4 + 0 γ 5 + 6 γ 6 0+0\gamma+0\gamma^2+0\gamma^3++0\gamma^4+0\gamma^5+6\gamma^6 0+0γ+0γ2+0γ3++0γ4+0γ5+6γ6
  • RLRRRRLRR: 0 + 0 γ + 0 γ 2 + 0 γ 3 + + 0 γ 4 + 0 γ 5 + 0 γ 6 + + 0 γ 7 + 6 γ 8 0+0\gamma+0\gamma^2+0\gamma^3++0\gamma^4+0\gamma^5 +0\gamma^6++0\gamma^7+6\gamma^8 0+0γ+0γ2+0γ3++0γ4+0γ5+0γ6++0γ7+6γ8

  状态价值函数(State-Value Function): 在状态 s i s_i si 处,采用当前策略 π \pi π 时回报的期望。 V π ( s ) = E ( U t ∣ s = s i ) V_\pi(s)=\mathbb{E}(U_t|s=s_i) Vπ(s)=E(Uts=si)
  动作价值函数(Action-Value Function): 在状态 s i s_i si 处采取动作 a i a_i ai 后,继续保持当前的总体策略 π \pi π 时(也就是以 0.9 0.9 0.9 的概率选择最优策略),回报的期望。 Q π ( s , a ) = E ( U t ∣ s = s i , a = a i ) Q_\pi(s,a)=\mathbb{E}(U_t|s=s_i,a=a_i) Qπ(s,a)=E(Uts=si,a=ai)
  最优动作价值函数(Optimal Action-Value Function): 总是选择最优策略时回报的期望。 Q ∗ ( s , a ) = E ( U t ∣ s = s i , a = a i ) Q^*(s,a)=\mathbb{E}(U_t|s=s_i,a=a_i) Q(s,a)=E(Uts=si,a=ai)
  状态价值函数需要用到贝尔曼方程(不是参考文献[1]里的最优贝尔曼方程),下面的推导过程参考文献[2](P26式2.5),并假设状态转移函数 p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a) 里不包含随机性。
V π ( s ) = E ( U t ∣ s ) = E ( R t ∣ s ) + γ E ( U t + 1 ∣ s ) V_\pi(s) = \mathbb{E}(U_t|s) = \mathbb{E}(R_t|s)+\gamma\mathbb{E}(U_{t+1}|s) Vπ(s)=E(Uts)=E(Rts)+γE(Ut+1s)
其中 E ( R t ∣ s ) = r t ( s ) \mathbb{E}(R_t|s)=r_t(s) E(Rts)=rt(s) 表示在状态 s s s 时的期望奖励。另外用 s ′ s' s 表示 s s s 的下一个状态。状态 s s s 时第 t + 1 t+1 t+1 个回合的期望奖励 E ( U t + 1 ∣ s ) \mathbb{E}(U_{t+1}|s) E(Ut+1s) 应该等于下一个回合(即 t + 1 t+1 t+1 个回合)时所有状态( s i ′ = s i − 1 s_i'=s_{i-1} si=si1 s i ′ = s i + 1 s_i'=s_{i+1} si=si+1)的期望奖励总和,即(第2个等号后面代入实际值便于理解)
E ( U t + 1 ∣ s ) = ∑ s ′ E ( U t + 1 ∣ s , s ′ ) P ( s ′ ∣ s ) = 0.9 E ( U t + 1 ∣ s , s 1 ) + 0.1 E ( U t + 1 ∣ s , s 2 ) = ∑ s ′ E ( U t + 1 ∣ s ′ ) P ( s ′ ∣ s ) = 0.9 E ( U t + 1 ∣ s 1 ) + 0.1 E ( U t + 1 ∣ s 2 ) = V π ( s ′ ) = 0.9 V π ( s 1 ) + 0.1 V π ( s 2 ) \begin{aligned} \mathbb{E}(U_{t+1}|s) =& \sum_{s'}\mathbb{E}(U_{t+1}|s,s')\mathbb{P}(s'|s) \quad=0.9\mathbb{E}(U_{t+1}|s,s_1) + 0.1\mathbb{E}(U_{t+1}|s,s_2) \\ =& \sum_{s'}\mathbb{E}(U_{t+1}|s')\mathbb{P}(s'|s) \quad=0.9\mathbb{E}(U_{t+1}|s_1) + 0.1\mathbb{E}(U_{t+1}|s_2) \\ =& V_\pi(s')\quad =0.9V_\pi(s_1) + 0.1V_\pi(s_2) \\ \end{aligned} E(Ut+1s)===sE(Ut+1s,s)P(ss)=0.9E(Ut+1s,s1)+0.1E(Ut+1s,s2)sE(Ut+1s)P(ss)=0.9E(Ut+1s1)+0.1E(Ut+1s2)Vπ(s)=0.9Vπ(s1)+0.1Vπ(s2)
所以
V π ( s ) = E ( R t ∣ s ) + γ E ( U t + 1 ∣ s ) = r ( s ) + γ V π ( s ′ ) \begin{aligned} V_\pi(s) =& \mathbb{E}(R_t|s)+\gamma\mathbb{E}(U_{t+1}|s) \\ =& r(s)+\gamma V_\pi(s') \end{aligned} Vπ(s)==E(Rts)+γE(Ut+1s)r(s)+γVπ(s)
其中 E ( U t + 1 ∣ s , s ′ ) = E ( U t + 1 ∣ s ′ ) \mathbb{E}(U_{t+1}|s,s')=\mathbb{E}(U_{t+1}|s') E(Ut+1s,s)=E(Ut+1s) 成立是因为马尔可夫过程。这里我有个疑问,倒立摆是不是马尔可夫过程?如果倒立摆的奖励函数仅与摆的高度也就是摆的角度有关,那下一时刻摆的角度不仅取决于当前时刻摆的角度,也取决于当前时刻的角速度或者说是上一时刻的角度(当前时刻的角速度可以认为是取决于当前时刻和上一时刻的摆角),那是否可以说倒立摆不是马尔可夫过程?
  类似地(同样暂时忽略状态转移函数 p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a) 中的随机性),
Q ( s , a ) = E ( U t ∣ s , a ) = E ( R t ∣ s , a ) + γ E ( U t + 1 ∣ s , a ) = r ( s , a ) + γ E ( U t + 1 ∣ s ′ ) = r ( s , a ) + γ v ( s ′ ) \begin{aligned} Q(s,a) =& \mathbb{E}(U_t|s,a) \\ =& \mathbb{E}(R_t|s,a)+\gamma\mathbb{E}(U_{t+1}|s,a) \\ =& r(s,a)+\gamma\mathbb{E}(U_{t+1}|s') \\ =& r(s,a)+\gamma v(s') \\ \end{aligned} Q(s,a)====E(Uts,a)E(Rts,a)+γE(Ut+1s,a)r(s,a)+γE(Ut+1s)r(s,a)+γv(s)
由此可以得到 V π ( s ) V_\pi(s) Vπ(s) Q π ( s , a ) Q_\pi(s,a) Qπ(s,a) 之间的关系
V π ( s ) = ∑ a π ( a ∣ s ) Q π ( s , a ) V_\pi(s)=\sum_a\pi(a|s)Q_\pi(s,a) Vπ(s)=aπ(as)Qπ(s,a)
直观理解就是,【状态 s s s 处的期望奖励 V π ( s ) V_\pi(s) Vπ(s)】 = 【 s s s 处向左的期望奖励 Q π ( s , L ) Q_\pi(s,L) Qπ(s,L) × \times × 【向左的概率 π ( L ∣ s ) \pi(L|s) π(Ls)】 + 【 s s s 处向右的期望奖励 Q π ( s , R ) Q_\pi(s,R) Qπ(s,R) × \times × 【向右的概率 π ( R ∣ s ) \pi(R|s) π(Rs)】。

各个变量的具体值

  在这一个例子中,最优动作价值函数就是一直往右走,比较好计算。
Q ∗ ( s = s 1 , a = R ) = 6 γ 4 Q ∗ ( s = s 2 , a = R ) = 6 γ 3 ⋮ Q ∗ ( s = s 5 , a = R ) = 6 \begin{aligned} & Q^*(s=s_1,a=R)=6\gamma^4 \\ & Q^*(s=s_2,a=R)=6\gamma^3 \\ & \vdots \\ & Q^*(s=s_5,a=R)=6 \\ \end{aligned} Q(s=s1,a=R)=6γ4Q(s=s2,a=R)=6γ3Q(s=s5,a=R)=6
  下面计算在这个走直线的例子中每个状态的期望奖励 r ( s ) r(s) r(s),也就是向左走的奖励乘概率加上向右走的奖励乘概率:
r ( s ) = E ( R t ∣ s ) = ∑ a P ( a ∣ s ) r ( s , a ) = 0.9 r ( s , R ) + 0.1 r ( s , L ) r(s)=\mathbb{E}(R_t|s)=\sum_a\mathbb{P}(a|s)r(s,a) =0.9r(s,R)+0.1r(s,L) r(s)=E(Rts)=aP(as)r(s,a)=0.9r(s,R)+0.1r(s,L)
于是可以算出
r ( s 5 ) = 0.9 ⋅ 6 + 0.1 ⋅ 0 = 5.4 r ( s 4 ) = r ( s 3 ) = r ( s 2 ) = r ( s 1 ) = 0 \begin{aligned} & r(s_5)=0.9\cdot 6+0.1\cdot 0 = 5.4 \\ & r(s_4)=r(s_3)=r(s_2)=r(s_1)=0 \\ \end{aligned} r(s5)=0.96+0.10=5.4r(s4)=r(s3)=r(s2)=r(s1)=0
此时每个状态的状态价值函数为 (已知 V π ( s 6 ) = 6 V_\pi(s_6)=6 Vπ(s6)=6
V π ( s 5 ) = r ( s 5 ) + γ ( 0.9 ⋅ 6 + 0.1 V π ( s 4 ) ) V π ( s 4 ) = r ( s 4 ) + γ ( 0.9 V π ( s 5 ) + 0.1 V π ( s 3 ) ) V π ( s 3 ) = r ( s 3 ) + γ ( 0.9 V π ( s 4 ) + 0.1 V π ( s 2 ) ) V π ( s 2 ) = r ( s 2 ) + γ ( 0.9 V π ( s 3 ) + 0.1 V π ( s 1 ) ) V π ( s 1 ) = r ( s 1 ) + γ ( 0.9 V π ( s 2 ) + 0.1 V π ( s 1 ) ) \begin{aligned} & V_\pi(s_5)=r(s_5)+\gamma(0.9\cdot 6+0.1V_\pi(s_4)) \\ & V_\pi(s_4)=r(s_4)+\gamma(0.9V_\pi(s_5) + 0.1V_\pi(s_3)) \\ & V_\pi(s_3)=r(s_3)+\gamma(0.9V_\pi(s_4) + 0.1V_\pi(s_2)) \\ & V_\pi(s_2)=r(s_2)+\gamma(0.9V_\pi(s_3) + 0.1V_\pi(s_1)) \\ & V_\pi(s_1)=r(s_1)+\gamma(0.9V_\pi(s_2) + 0.1V_\pi(s_1)) \\ \end{aligned} Vπ(s5)=r(s5)+γ(0.96+0.1Vπ(s4))Vπ(s4)=r(s4)+γ(0.9Vπ(s5)+0.1Vπ(s3))Vπ(s3)=r(s3)+γ(0.9Vπ(s4)+0.1Vπ(s2))Vπ(s2)=r(s2)+γ(0.9Vπ(s3)+0.1Vπ(s1))Vπ(s1)=r(s1)+γ(0.9Vπ(s2)+0.1Vπ(s1))
γ = 0.8 \gamma=0.8 γ=0.8,可以解得
V π ( s 5 ) = 4.602433406284881 V π ( s 4 ) = 3.5304175785610044 V π ( s 3 ) = 2.708319075448633 V π ( s 2 ) = 2.080230236058876 V π ( s 1 ) = 1.6280062716982504 \begin{aligned} & V_\pi(s_5)=4.602433406284881 \\ & V_\pi(s_4)=3.5304175785610044 \\ & V_\pi(s_3)=2.708319075448633 \\ & V_\pi(s_2)=2.080230236058876 \\ & V_\pi(s_1)=1.6280062716982504 \\ \end{aligned} Vπ(s5)=4.602433406284881Vπ(s4)=3.5304175785610044Vπ(s3)=2.708319075448633Vπ(s2)=2.080230236058876Vπ(s1)=1.6280062716982504
求解的python代码见文末代码[1]。动作价值函数可以采用类似的方法计算。

贝尔曼最优方程

  假设不知道最优策略,也就是现在还没有任何策略,希望能一步直接算出最优策略。根据贝尔曼最优方程
v ( s ) = max ⁡ π ∑ a π ( a ∣ s ) q ( s , a ) v(s) = \max_\pi\sum_a\pi(a|s)q(s,a) v(s)=πmaxaπ(as)q(s,a)
其中动作价值函数
q ( s , a ) = r ( s , a ) + γ v ( s ′ ) q(s,a)=r(s,a)+\gamma v(s') q(s,a)=r(s,a)+γv(s)
  按照分配权重的思想,为了使几个变量的加权和最大,则最大的变量的权重是1,其余的都是0,所以最优策略和最优状态价值函数满足(进一步的解释见参考链接[2]的P42例3.2)
π ∗ ( a ∣ s ) = arg max ⁡ π π ( a ∣ s ) q ∗ ( s , a ) v ∗ ( s ) = max ⁡ π ∑ a π ( a ∣ s ) q ( s , a ) = max ⁡ a q ( s , a ) = max ⁡ a [ r ( s , a ) + γ v ( s ′ ) ] \begin{aligned} \pi^*(a|s) =& \argmax_\pi\pi(a|s)q^*(s,a) \\ v^*(s) =& \max_\pi\sum_a\pi(a|s)q(s,a) \\ =& \max_a q(s,a) \\ =& \max_a[r(s,a)+\gamma v(s')] \\ \end{aligned} π(as)=v(s)===πargmaxπ(as)q(s,a)πmaxaπ(as)q(s,a)amaxq(s,a)amax[r(s,a)+γv(s)]
  下面代入走直线的例子。已知只有 r ( s 5 , R ) = 6 r(s_5,R)=6 r(s5,R)=6,也就是说只有在状态 s 5 s_5 s5 处往右走的动作价值函数为6,其它函数值都是0。
v ( s 1 ) = max ⁡ [ r ( s 1 , L ) + γ v ( s 1 ) , r ( s 1 , R ) + γ v ( s 2 ) ] = γ max ⁡ [ v ( s 1 ) , v ( s 2 ) ] v ( s 2 ) = max ⁡ [ r ( s 1 , L ) + γ v ( s 1 ) , r ( s 1 , R ) + γ v ( s 3 ) ] = γ max ⁡ [ v ( s 1 ) , v ( s 3 ) ] ⋮ \begin{aligned} v(s_1) =& \max [r(s_1,L)+\gamma v(s_1),r(s_1,R)+\gamma v(s_2)] = \gamma\max[v(s_1),v(s_2)] \\ v(s_2) =& \max [r(s_1,L)+\gamma v(s_1),r(s_1,R)+\gamma v(s_3)] = \gamma\max[v(s_1),v(s_3)] \\ &\vdots \end{aligned} v(s1)=v(s2)=max[r(s1,L)+γv(s1),r(s1,R)+γv(s2)]=γmax[v(s1),v(s2)]max[r(s1,L)+γv(s1),r(s1,R)+γv(s3)]=γmax[v(s1),v(s3)]

v ( s 1 ) = γ max ⁡ [ v ( s 1 ) , v ( s 2 ) ] v ( s 2 ) = γ max ⁡ [ v ( s 1 ) , v ( s 3 ) ] v ( s 3 ) = γ max ⁡ [ v ( s 2 ) , v ( s 4 ) ] v ( s 4 ) = γ max ⁡ [ v ( s 3 ) , v ( s 5 ) ] v ( s 5 ) = γ max ⁡ [ v ( s 4 ) , 6 ] \begin{aligned} v(s_1) =& \gamma\max[v(s_1), v(s_2)] \\ v(s_2) =& \gamma\max[v(s_1), v(s_3)] \\ v(s_3) =& \gamma\max[v(s_2), v(s_4)] \\ v(s_4) =& \gamma\max[v(s_3), v(s_5)] \\ v(s_5) =& \gamma\max[v(s_4), 6] \\ \end{aligned} v(s1)=v(s2)=v(s3)=v(s4)=v(s5)=γmax[v(s1),v(s2)]γmax[v(s1),v(s3)]γmax[v(s2),v(s4)]γmax[v(s3),v(s5)]γmax[v(s4),6]
可以写作
v ⃗ = f ⃗ ( v ⃗ ) \vec{v}=\vec{f}(\vec{v}) v =f (v )
f ⃗ \vec{f} f 可以证明是个压缩映射(见参考链接[2]的P47定理2),从 v ⃗ = 0 ⃗ \vec{v}=\vec{0} v =0 出发开始迭代,同样设 γ = 0.8 \gamma=0.8 γ=0.8,解得
v ( s 1 ) = 1.96608 v ( s 2 ) = 2.4576 v ( s 3 ) = 3.072 v ( s 4 ) = 3.84 v ( s 5 ) = 4.8 \begin{aligned} v(s_1) =& 1.96608 \\ v(s_2) =& 2.4576 \\ v(s_3) =& 3.072 \\ v(s_4) =& 3.84 \\ v(s_5) =& 4.8 \\ \end{aligned} v(s1)=v(s2)=v(s3)=v(s4)=v(s5)=1.966082.45763.0723.844.8
求解的python代码见文末代码[2]。
状态 s 1 s_1 s1 时的最优策略为
π ( a ∣ s 1 ) = { 1 , a = a ∗ 0 , a ≠ a ∗ a ∗ = arg max ⁡ a q ( s 1 , a ) = R \begin{aligned} & \pi(a|s_1) = \begin{cases} 1, & a=a^* \\ 0, & a \neq a^* \end{cases} \\ & a^* = \argmax_aq(s_1,a)=R\end{aligned} π(as1)={1,0,a=aa=aa=aargmaxq(s1,a)=R
或者写成
π ( a ∣ s 1 ) = arg max ⁡ π π ( a ∣ s 1 ) q ∗ ( s 1 , a ) = arg max ⁡ π π ( a ∣ s 1 ) q ( s 1 , R ) = arg max ⁡ π [ v ( s 1 ) , v ( s 2 ) ] = R \begin{aligned} \pi(a|s_1) =& \argmax_\pi\pi(a|s_1)q^*(s_1,a) \\ =& \argmax_\pi\pi(a|s_1)q(s_1,R) \\ =& \argmax_\pi[v(s_1),v(s_2)]=R \\ \end{aligned} π(as1)===πargmaxπ(as1)q(s1,a)πargmaxπ(as1)q(s1,R)πargmax[v(s1),v(s2)]=R
其中的 q ∗ ( s 1 , a ) = q ( s 1 , R ) q^*(s_1,a)=q(s_1,R) q(s1,a)=q(s1,R),因为
q ( s 1 , L ) = r ( s 1 , L ) + γ v ( s 1 ) = 1.96608 γ q ( s 1 , R ) = r ( s 1 , R ) + γ v ( s 2 ) = 2.4576 γ q ( s 1 , R ) > q ( s 1 , L ) \begin{aligned} q(s_1,L) =& r(s_1,L)+\gamma v(s_1) = 1.96608\gamma \\ q(s_1,R) =& r(s_1,R)+\gamma v(s_2) = 2.4576\gamma \\ q(s_1,R) >& q(s_1,L) \end{aligned} q(s1,L)=q(s1,R)=q(s1,R)>r(s1,L)+γv(s1)=1.96608γr(s1,R)+γv(s2)=2.4576γq(s1,L)
其它状态类似。并且需要注意的是策略在每次迭代时都更新,此处只在迭代结束后更新。

参考

  1. 王树森 张志华,《深度强化学习(初稿)》
  2. Mathematical Foundation of Reinforcement Learning -GitHub

附代码

代码[1]. 求解 ϵ \epsilon ϵ-贪婪最优策略的状态价值函数

import numpy as np
A = np.array([
    [0.0, 0.08, 0.0, 0.0, 0.0],
    [0.72, 0.0, 0.08, 0.0, 0.0],
    [0.0, 0.72, 0.0, 0.08, 0.0],
    [0.0, 0.0, 0.72, 0.0, 0.08],
    [0.0, 0.0, 0.0, 0.72, 0.08]])
B = np.eye(5) - A
C = np.array([4.32, 0, 0, 0, 0])
D = np.matmul(np.linalg.inv(B) , C.T)
for n in range(5):
    print(D[n])

代码[2]. 迭代法求解贝尔曼最优方程

import numpy as np
def fx(x):
    y = np.zeros(5)
    y[0] = 0.8 * max(x[0], x[1])
    y[1] = 0.8 * max(x[0], x[2])
    y[2] = 0.8 * max(x[1], x[3])
    y[3] = 0.8 * max(x[2], x[4])
    y[4] = 0.8 * max(x[3], 6)
    return y
vold = np.zeros(5)
while 1:
    vnew = fx(vold)
    sumv = sum(vnew - vold)**2
    if (sumv < 1e-6):
        break
    vold = vnew
print(vold)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值