【强化学习理论】状态价值函数与动作价值函数系列公式推导

由于时常对状态价值函数与动作价值函数之间的定义区别、公式关系迷惑不清,此次进行梳理并作记录。

理解公式推导需要先了解基础定义中几个概念。

基础定义

奖励函数

奖励函数有两种记法。

①记作 r ( s ) r(s) r(s),表示某状态 s s s的奖励,指:转移到该状态时能够获得的奖励的期望,即:
r ( s ) = E [ R t ∣ S t = s ] r(s) = \mathbb {E}[R_t | S_t = s] r(s)=E[RtSt=s]

为什么是用 R t R_t Rt的期望而不是直接用 R t R_t Rt来表示这个状态的奖励?

因为对于一个相同的状态,其采取的动作不同,获得的奖励 R t R_t Rt可能不同。

②记作 r ( s , a ) r(s, a) r(s,a),表示某状态 s s s下采取动作 a a a的奖励,指:转移到该状态并采取该动作时能够获得的奖励的期望,即:
r ( s , a ) = E [ R t ∣ S t = s , A t = a ] r(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] r(s,a)=E[RtSt=s,At=a]

为什么是用 R t R_t Rt的期望而不是直接用 R t R_t Rt来表示这个状态下采取这个动作的奖励?

因为对于一个相同的状态,即使采取的动作相同,其下一个状态 s ′ s^{\prime} s也可能不同,之后获得的奖励 R t + 1 R_{t+1} Rt+1也可能不同,最终获得的回报 G t G_t Gt自然也不同。

回报

回报 (Return),记作 G t G_t Gt,指从 t t t时刻的状态 s t s_t st开始,直至终止状态时,所有奖励的衰减之和,即:
G t = R t + γ R t + 1 + γ 2 R t + 2 + . . . = ∑ k = 0 ∞ γ k R t + k \begin{aligned} G_t =& R_t + \gamma R_{t+1} + \gamma ^ 2 R_{t + 2} + ... \\ =& \sum_{k = 0}^{\infty} \gamma ^ k R_{t + k} \end{aligned} Gt==Rt+γRt+1+γ2Rt+2+...k=0γkRt+k

价值

价值 (value),是一个基于状态的概念,某个状态的价值指:从某时刻的某状态 s s s开始,直至终止状态时,累积奖励(也就是回报 G t G_t Gt)的期望

1、为什么是要用** G t G_t Gt的期望**而不能直接用 G t G_t Gt

因为对于相同的起始状态 s s s,其 G t G_t Gt可以是不一样的。想要客观地评价一个状态的价值,就要尽可能地考虑它能带来的不同的回报。

2、为什么 G t G_t Gt可以是不一样的?

因为在交互进行的过程中,起始状态 s t s_t st可能转到不同的状态 s ′ s^{\prime} s,得到的 R t R_t Rt也不同,最终的回报 G t G_t Gt自然也就不同。

价值函数

价值函数 (value function),记作 V ( s ) V(s) V(s),可以理解成一个映射关系,输入是状态 s s s​,输出是该状态的价值,即:
V ( s ) = E [ G t ∣ S t = s ] V(s) = \mathbb{E} [G_t | S_t = s] V(s)=E[GtSt=s]

奖励函数和价值函数的区别是什么?

按照我自己的理解,奖励函数是只关注状态当前能获得的收益,价值函数则关注从当前状态开始直至未来结束时的所有收益。

状态转移矩阵

状态转移矩阵,可记作 P ( s ′ ∣ s ) P(s^{\prime} | s) P(ss),表示状态 s s s转移到状态 s ′ s^{\prime} s的概率。

在状态集合有限的情况下,可以用矩阵表示;若状态集合不是有限的,则称为状态转移函数。

策略

策略 (policy),记作 π \pi π。可以将策略理解成:在已知输入状态 s s s的情况下,采取动作 a a a的概率,即:
π ( s , a ) = π ( a ∣ s ) = P ( A t = a ∣ S t = s ) \pi(s, a) =\pi(a | s)= P(A_t = a | S_t = s) π(s,a)=π(as)=P(At=aSt=s)
策略 π \pi π(的取值)只与当前的状态 s s s相关,与当前状态之前的状态无关。

对于同样的状态 s s s,使用的策略 π \pi π不同,采取的动作 a a a不同,价值value也就不同。

状态转移函数

状态转移函数,可记作 P ( s ′ ∣ s , a ) P(s^{\prime} | s, a) P(ss,a),表示在状态 s s s执行动作 a a a后到达状态 s ′ s^{\prime} s的概率。

与状态转移矩阵相比,状态转移函数可以表示状态集合不是有限的情况。

状态转移有两种表现形式,一种是 P ( s ′ ∣ s ) P(s^{\prime} | s) P(ss),另一种是 P ( s ′ ∣ s , a ) P(s^{\prime} | s, a) P(ss,a),连接两者之间的桥梁是策略 π \pi π,即:
P ( s ′ ∣ s ) = ∑ a ∈ A π ( a ∣ s ) P ( s ′ ∣ s , a ) P(s^{\prime} | s) = \sum_{a \in A} \pi(a | s)P(s^{\prime} | s, a) P(ss)=aAπ(as)P(ss,a)

状态价值函数

状态价值函数 (state-value function),可记作 V π ( s ) V^{\pi}(s) Vπ(s),表示:马尔可夫决策过程中,智能体从状态 s s s出发,遵循策略 π \pi π获得的回报 G t G_t Gt期望,即:
V π ( s ) = E π [ G t ∣ S t = t ] V^{\pi}(s) = \mathbb{E}_{\pi}[G_t | S_t = t] Vπ(s)=Eπ[GtSt=t]

看起来和价值函数很像,只不过价值函数中没有强调策略

下面这两个问题及其回答,跟理解价值时提的那两个问题和回答是相似的。

1、为什么是回报 G t G_t Gt的期望而不是只用回报 G t G_t Gt就行了?

因为对于同一个状态 s s s和给定的策略 π \pi π,其 G t G_t Gt可能不同。想要客观地评价一个状态在给定策略下的价值,就要尽可能地考虑它能带来的不同的回报。

2、为什么 G t G_t Gt可以是不一样的?

因为对于同一个状态 s s s和给定的策略 π \pi π,智能体在当前状态采取的动作 a a a可能不同(特别是当使用的策略是随机性策略时),得到的 R t R_t Rt不同,最终的 G t G_t Gt也可能不同。

动作价值函数

动作价值函数 (action-value function),可记作 Q π ( s , a ) Q^{\pi}(s, a) Qπ(s,a),表示:马尔可夫决策过程中,智能体从状态 s s s出发,根据策略 π \pi π执行动作 a a a,最终获得的回报 G t G_t Gt期望,即:
Q π ( s , a ) = E [ G t ∣ S t = s , A t = a ] Q^{\pi}(s, a) = \mathbb{E}[G_t | S_t = s, A_t = a] Qπ(s,a)=E[GtSt=s,At=a]

看起来和状态价值函数很像,只不过状态价值函数中没有强调动作

下面这两个问题及其回答,跟理解状态价值函数时提的那两个问题和回答是相似的。

1、为什么是回报 G t G_t Gt的期望而不是只用回报 G t G_t Gt就行了?

因为对于同一个状态 s s s、给定的策略 π \pi π和给定的动作 a a a,其 G t G_t Gt可能不同。想要客观地评价一个状态在给定策略下的价值,就要尽可能地考虑它能带来的不同的回报。

2、为什么 G t G_t Gt可以是不一样的?

因为对于同一个状态 s s s、给定的策略 π \pi π和给定的动作 a a a,其下一步到达的状态 s ′ s^{\prime} s可能不同(因为环境可能已经发生不同的变化了),智能体在不同采取的动作 a a a可能不同(特别是当使用的策略是随机性策略时),得到的 R t R_t Rt不同,最终的 G t G_t Gt也可能不同。

状态价值函数与动作价值函数之间的关系

关系1

V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) V^{\pi}(s) = \sum_{a \in A} \pi(a | s) Q^{\pi}(s, a) Vπ(s)=aAπ(as)Qπ(s,a)

关系1的推导基础:①状态价值函数的定义;②动作价值函数的定义。推导过程如下:
V π ( s ) = E π [ G t ∣ S t = s ] = ∑ a ∈ A π ( a ∣ s ) E π [ G t ∣ S t = s , A t = a ] = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) \begin{aligned} V^{\pi}(s) &= \mathbb {E}_{\pi}[G_t | S_t = s] \\ &= \sum_{a \in A} \pi(a | s) \mathbb{E}_{\pi}[G_t | S_t = s, A_t = a] \\ &= \sum_{a \in A} \pi(a | s) Q^{\pi}(s, a) \end{aligned} Vπ(s)=Eπ[GtSt=s]=aAπ(as)Eπ[GtSt=s,At=a]=aAπ(as)Qπ(s,a)
第1行使用了状态价值函数的定义

从第2行转换到第3行的理解使用了动作价值函数的定义

在此我就第2行为何将 E π [ G t ∣ S t = s ] \mathbb{E}_{\pi}[G_{t} | S_t = s] Eπ[GtSt=s]转换成 ∑ a ∈ A π ( a ∣ s ) E π [ G t ∣ S t = s , A t = a ] \sum_{a \in A} \pi(a | s) \mathbb{E}_{\pi}[G_t | S_t = s, A_t = a] aAπ(as)Eπ[GtSt=s,At=a],而不是 ∑ a ∈ A π ( a ∣ s ) G t \sum_{a \in A} \pi(a | s) G_t aAπ(as)Gt(这两种想法的差别只在于有没有对 G t G_{t} Gt求期望)给出自己的解释:后者虽然看起来比较符合数学期望的公式形式:状态 s s s根据概率 π ( a ∣ s ) \pi(a | s) π(as)选择动作 a a a后,后面乘上的对象应该就是对应的状态 s s s采取动作 a a a所得到的回报 G t G_{t} Gt。但是前文在解释动作价值函数的定义时提到:对于同一个状态 s s s、给定的策略 π \pi π和给定的动作 a a a,其 G t G_t Gt可能不同。也就是说, ( s , a ) (s, a) (s,a) G t G_{t} Gt并不是一一对应的关系,因此也无法直接相乘。此时就要找一个既能与 ( s , a ) (s, a) (s,a)一一对应、又能概括 ( s , a ) (s, a) (s,a)的收益的概念。这时,动作价值这一概念就成了不错的选择。它对 ( s , a ) (s, a) (s,a)能对应的多个 G t G_{t} Gt计算数学期望,近似计算出 ( s , a ) (s, a) (s,a)的整体收益(这样看来,其实第2行也是可以省略的,直接就能推出第3行了)。

关系2

Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) Q^{\pi}(s, a) = r(s, a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) V^{\pi}(s^{\prime}) Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)

关系2的推导基础:①动作价值函数的定义;②回报的定义;③奖励函数的定义;④状态价值函数的定义。推导过程如下:
Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] = E π [ R t + γ R t + 1 + γ 2 R t + 2 + . . . ∣ S t = s , A t = a ] = E π [ R t + γ ( R t + 1 + γ R t + 2 + . . . ) ∣ S t = s , A t = a ] = E π [ R t ∣ S t = s , A t = a ] + γ E π [ G t + 1 ∣ S t = s , A t = a ] = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) E π [ G t + 1 ∣ S t + 1 = s ′ ] = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) \begin{aligned} Q^{\pi}(s, a) &= \mathbb{E}_{\pi}[G_t | S_t = s, A_t = a] \\ &= \mathbb{E}_{\pi}[R_t + \gamma R_{t+1} + \gamma^2R_{t+2}+ ... | S_t = s, A_t = a] \\ &= \mathbb{E}_{\pi}[R_t + \gamma (R_{t+1} + \gamma R_{t+2} + ...) | S_t = s, A_t = a] \\ &= \mathbb{E}_{\pi}[R_t | S_t = s, A_t = a] + \gamma \mathbb{E}_{\pi}[G_{t+1} | S_t = s, A_t = a] \\ &= r(s, a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) \mathbb{E}_{\pi}[G_{t+1} | S_{t+1} = s^{\prime}] \\ &= r(s, a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) V^{\pi}(s^{\prime}) \end{aligned} Qπ(s,a)=Eπ[GtSt=s,At=a]=Eπ[Rt+γRt+1+γ2Rt+2+...∣St=s,At=a]=Eπ[Rt+γ(Rt+1+γRt+2+...)St=s,At=a]=Eπ[RtSt=s,At=a]+γEπ[Gt+1St=s,At=a]=r(s,a)+γsSP(ss,a)Eπ[Gt+1St+1=s]=r(s,a)+γsSP(ss,a)Vπ(s)
推导过程中,第1行的等式使用了动作价值函数的定义

第1行到第2行的转化、第3行到第4行的转化使用了回报 (Return)的定义

第4行到第5行的转化使用了奖励函数的定义

第5行到第6行的转化使用了状态价值函数的定义

在此我就第5行的第2个子项为何将 E π [ G t + 1 ∣ S t = s , A t = a ] \mathbb{E}_{\pi}[G_{t+1} | S_t = s, A_t = a] Eπ[Gt+1St=s,At=a]拆解成 ∑ s ′ ∈ S P ( s ′ ∣ s , a ) E π [ G t + 1 ∣ S t + 1 = s ′ ] \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) \mathbb{E}_{\pi}[G_{t+1} | S_{t+1} = s^{\prime}] sSP(ss,a)Eπ[Gt+1St+1=s],而不是 ∑ s ′ ∈ S P ( s ′ ∣ s , a ) G t + 1 \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) G_{t+1} sSP(ss,a)Gt+1(这两种想法的差别只在于有没有对 G t + 1 G_{t+1} Gt+1求期望)给出自己的解释:后者虽然看起来比较符合数学期望的公式形式:状态 s s s、动作 a a a根据概率 P ( s ′ ∣ s , a ) P(s^{\prime} | s, a) P(ss,a)转移到状态 s ′ s^{\prime} s后,后面乘上的对象应该就是对应的状态 s ′ s^{\prime} s的回报 G t + 1 G_{t+1} Gt+1。但是前文在解释价值的定义时提到:对于相同的起始状态 s s s,其 G t G_t Gt可以是不一样的。也就是说, s ′ s^{\prime} s G t + 1 G_{t+1} Gt+1并不是一一对应的关系,因此也无法直接相乘。此时就要找一个既能与 s ′ s^{\prime} s一一对应、又能概括状态 s ′ s^{\prime} s的收益的概念。这时,价值这一概念就成了不错的选择。它对 s ′ s^{\prime} s能对应的多个 G t + 1 G_{t+1} Gt+1计算数学期望,近似计算出状态 s ′ s^{\prime} s的整体收益(这样看来,其实第5行也是可以省略的,直接就能推出第6行了)。

另外,特别提醒:
Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] = ∑ s ′ ∈ S P ( s ′ ∣ s , a ) E [ G t + 1 ∣ S t + 1 = s ′ ] \begin{aligned} Q^{\pi}(s, a) &= \mathbb{E}_{\pi}[G_t | S_t = s, A_t = a] \\ &= \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) \mathbb{E}[G_{t+1} | S_{t+1} = s^{\prime}] \end{aligned} Qπ(s,a)=Eπ[GtSt=s,At=a]=sSP(ss,a)E[Gt+1St+1=s]
不能这样转!因为这样就没有考虑 R t R_t Rt了,从 G t G_t Gt直接绕到了 G t + 1 G_{t+1} Gt+1

贝尔曼方程 (Bellman Equation)

下式即为贝尔曼方程。
V ( s ) = r ( s ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) V ( s ′ ) V(s) = r(s) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s) V(s^{\prime}) V(s)=r(s)+γsSP(ss)V(s)
与价值函数的原式相比,贝尔曼方程允许使用者在知晓奖励函数状态转移矩阵的情况下即可计算价值函数的解析解

贝尔曼方程的推导基础:①回报的定义;②奖励函数的定义;③价值函数的定义。推导过程如下:
V ( s ) = E [ G t ∣ S t = s ] = E [ R t + γ R t + 1 + γ 2 R t + 2 + . . . ∣ S t = s ] = E [ R t + γ ( R t + 1 + γ R t + 2 + . . . ) ∣ S t = s ] = E [ R t + γ G t + 1 ∣ S t = s ] = E [ R t ∣ S t = s ] + γ E [ G t + 1 ∣ S t = s ] = r ( s ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) E [ G t + 1 ∣ S t + 1 = s ′ ] = r ( s ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s ) V ( s ′ ) \begin{aligned} V(s) &= \mathbb{E}[G_t | S_t = s] \\ &= \mathbb{E}[R_t + \gamma R_{t + 1} + \gamma ^ 2 R_{t + 2} + ... | S_t = s] \\ &= \mathbb{E}[R_t + \gamma (R_{t + 1} + \gamma R_{t + 2} + ...) | S_t = s] \\ &= \mathbb{E}[R_t + \gamma G_{t + 1} | S_t = s] \\ &= \mathbb{E}[R_t | S_t = s] + \gamma \mathbb{E}[G_{t + 1} | S_t = s] \\ &= r(s) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s) \mathbb{E}[G_{t + 1} | S_{t + 1} = s^{\prime}] \\ &= r(s) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s) V(s^{\prime}) \end{aligned} V(s)=E[GtSt=s]=E[Rt+γRt+1+γ2Rt+2+...∣St=s]=E[Rt+γ(Rt+1+γRt+2+...)St=s]=E[Rt+γGt+1St=s]=E[RtSt=s]+γE[Gt+1St=s]=r(s)+γsSP(ss)E[Gt+1St+1=s]=r(s)+γsSP(ss)V(s)
推导过程中,第1行到第2行的转化、第3行到第4行的转化使用了回报 (Return)的定义

第5行到第6行的转化使用了奖励函数的定义

第6行到第7行的转化使用了价值函数的定义

在此我就第6行的第2个子项为何将 E [ G t + 1 ∣ S t = s ] \mathbb{E}[G_{t + 1} | S_t = s] E[Gt+1St=s]拆解成 ∑ s ′ ∈ S P ( s ′ ∣ s ) E [ G t + 1 ∣ S t + 1 = s ′ ] \sum_{s^{\prime} \in S} P(s^{\prime} | s) \mathbb{E}[G_{t + 1} | S_{t + 1} = s^{\prime}] sSP(ss)E[Gt+1St+1=s],而不是 ∑ s ′ ∈ S P ( s ′ ∣ s ) G t + 1 \sum_{s^{\prime} \in S} P(s^{\prime} | s) G_{t + 1} sSP(ss)Gt+1(这两种想法的差别只在于有没有对 G t + 1 G_{t+1} Gt+1求期望)给出自己的解释:后者虽然看起来比较符合数学期望的公式形式:状态 s s s根据概率 P ( s ′ ∣ s ) P(s^{\prime} | s) P(ss)转移到状态 s ′ s^{\prime} s后,后面乘上的对象应该就是对应的状态 s ′ s^{\prime} s的回报 G t + 1 G_{t+1} Gt+1。但是前文在解释价值的定义时提到:对于相同的起始状态 s s s,其 G t G_t Gt可以是不一样的。也就是说, s ′ s^{\prime} s G t + 1 G_{t+1} Gt+1并不是一一对应的关系,因此也无法直接相乘。此时就要找一个既能与 s ′ s^{\prime} s一一对应、又能概括状态 s ′ s^{\prime} s的收益的概念。这时,价值这一概念就成了不错的选择。它对 s ′ s^{\prime} s能对应的多个 G t + 1 G_{t+1} Gt+1计算数学期望,近似计算出状态 s ′ s^{\prime} s的整体收益(这样看来,其实第6行也是可以省略的,直接就能推出第7行了)。

贝尔曼期望方程 (Bellman Expectation Equation)

其实贝尔曼期望方程即是前面的贝尔曼方程,只是在引入动作 a a a之后更加完整。

根据状态价值函数和动作价值函数的两个关系,可以推出2个价值函数的贝尔曼期望方程。

方程1

V π ( s ) = ∑ a ∈ A π ( a ∣ s ) [ r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) ] V^{\pi}(s) = \sum_{a \in A} \pi(a|s) \left[ r(s,a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) V^{\pi}(s^{\prime}) \right] Vπ(s)=aAπ(as)[r(s,a)+γsSP(ss,a)Vπ(s)]
推导过程如下:将关系2式代入关系1式,得:
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) = ∑ a ∈ A π ( a ∣ s ) [ r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) ] \begin{aligned} V^{\pi}(s) &= \sum_{a \in A} \pi(a|s) Q^{\pi}(s,a) \\ &= \sum_{a \in A} \pi(a|s) \left[ r(s,a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) V^{\pi}(s^{\prime}) \right] \end{aligned} Vπ(s)=aAπ(as)Qπ(s,a)=aAπ(as)[r(s,a)+γsSP(ss,a)Vπ(s)]

方程2

Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ∑ a ′ ∈ A π ( a ′ ∣ s ′ ) Q π ( s ′ , a ′ ) Q^{\pi}(s,a) = r(s,a) + \gamma \sum_{s^{\prime} \in S}P(s^{\prime} | s, a) \sum_{a^{\prime} \in A} \pi(a^{\prime} | s^{\prime}) Q^{\pi}(s^{\prime}, a^{\prime}) Qπ(s,a)=r(s,a)+γsSP(ss,a)aAπ(as)Qπ(s,a)

推导过程如下:将关系1式代入关系2式,得:
Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) ∑ a ′ ∈ A π ( a ′ ∣ s ′ ) Q π ( s ′ , a ′ ) \begin{aligned} Q^{\pi}(s,a) &= r(s,a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) V^{\pi}(s^{\prime}) \\ &=r(s,a) + \gamma \sum_{s^{\prime} \in S} P(s^{\prime} | s, a) \sum_{a^{\prime} \in A} \pi(a^{\prime}| s^{\prime})Q^{\pi}(s^{\prime},a^{\prime}) \end{aligned} Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)=r(s,a)+γsSP(ss,a)aAπ(as)Qπ(s,a)

贝尔曼最优方程

待补充……

  • 27
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值