【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

一. 内容概述

1. 第二章主要有两个内容

(1)一个核心概念:状态值(state value):从一个状态出发,沿着一个策略我所得到的奖励回报的平均值。状态值越高,说明对应的策略越好。之所以关注状态值,是因为它能评价一个策略的好坏

(2)基本工具:贝尔曼公式(the Bellman equation):

  • 用于分析状态值,描述所有状态和状态值之间的关系,这个关系就是一个方程,一个等式。通过求解这个方程就可以求解出来一个给定策略的状态值,因此就可以评价这个策略的好坏。
  • 求解贝尔曼公式进而得到一个策略所对应的状态值这样的一个过程被称为策略评价(policy evaluation),policy evaluation 在强化学习中是非常基础的一个概念,我评价了一个策略得到它的值,然后基于它的值再改进策略然后循环下去,最后就能得到一个最优的策略。

2. 第二章大纲

  1. 激励性实例(Motivating examples)
  2. 状态值(state value)
  3. 贝尔曼公式( Bellman equation):推导
  4. 贝尔曼公式( Bellman equation):矩阵向量形式
  5. 贝尔曼公式( Bellman equation):求解状态值(state value)
  6. 动作值:从 state value 过渡到 action value

二. 激励性实例(Motivating examples)

1. 例子1:为什么回报/收益(return)很重要?

(1)什么是回报(return)

​ 沿着轨迹获得的奖励(reward)的(折扣discounted)总和。

​ What is return? The (discounted) sum of the rewards obtained along a trajectory.

(2)为什么回报(return)很重要?

下图的第三个表示,这个策略在 s1 状态有百分之 50 的概率向右,有百分之 50 的概率向下。

在这里插入图片描述

问题: 从起点 s 1 s_1 s1 出发,哪项策略(policy)是 “最好的”?哪项 “最差”?

直觉: 第一个最好,第二个最差,因为第二个进入了forbidden area。第三个策略是不好也不差,它有一定的概率进入forbidden area。

数学: 我们能用数学来描述这种直觉吗?

回报(return)可以用来评估策略(policy),return 可以告诉我们哪个策略好,哪个策略坏,这样才能不断地改进策略。请参阅下文。

  • 根据策略 1(左图),从 s 1 s_1 s1 开始,折扣回报(discounted return)为

r e t u r n 1 = 0 + γ 1 + γ 2 1 + … , = γ ( 1 + γ + γ 2 + …   ) , = γ 1 − γ \begin{align} return_1 &= 0 + \gamma 1 + \gamma^2 1 + \dots, \\ &=\gamma(1 + \gamma + \gamma^2 + \dots), \\ &= \frac{\gamma}{1 - \gamma} \end{align} return1=0+γ1+γ21+,=γ(1+γ+γ2+),=1γγ

  • 根据策略 2(中图),从 s 1 s_1 s1 开始,折扣回报(discounted return)为

r e t u r n 2 = − 1 + γ 1 + γ 2 1 + … , = − 1 + γ ( 1 + γ + γ 2 + …   ) , = − 1 + γ 1 − γ \begin{align} return_2 &= -1 + \gamma 1 + \gamma^2 1 + \dots, \\ &= -1 + \gamma(1 + \gamma + \gamma^2 + \dots), \\ &= -1 + \frac{\gamma}{1 - \gamma} \end{align} return2=1+γ1+γ21+,=1+γ(1+γ+γ2+),=1+1γγ

  • 根据策略 3(右图),从 s 1 s_1 s1 开始,折扣回报(discounted return)为(策略3是随机性的Policy 3 is stochastic!)

r e t u r n 3 = 0.5 ( − 1 + γ 1 − γ ) + 0.5 ( γ 1 − γ ) = − 0.5 + γ 1 − γ \begin{align} return_3 &= 0.5 (-1 + \frac{\gamma}{1 - \gamma})+ 0.5(\frac{\gamma}{1-\gamma}) \\ &= -0.5 + \frac{\gamma}{1-\gamma} \end{align} return3=0.5(1+1γγ)+0.5(1γγ)=0.5+1γγ

策略 3 这里其实是在计算期望。这里已经不是 return 的概念了,return 的概念是针对一个轨迹定义的,现在有两个轨迹,我们在做的是求平均值,即求期望。其实这里求的是状态值(state value)。

总之,从 s 1 s_1 s1 开始
r e t u r n 1 > r e t u r n 3 > r e t u r n 2 return_1 > return_3 > return_2 return1>return3>return2
上述不等式表明,第一种策略是最好的,第二种策略是最差的,这与我们的直觉完全相同。

计算回报(return)对于评估一项策略非常重要。

2. 例子2:如何计算回报(return)?

在这里插入图片描述

上图中四个状态(state)是 s 1 , s 2 , s 3 , s 4 s_1,s_2,s_3,s_4 s1,s2,s3,s4,策略(policy)是绿色的箭头,奖励(reward)是 r 1 , r 2 , r 3 , r 4 r_1,r_2,r_3,r_4 r1,r2,r3,r4

(1)方法1:通过定义

v i v_i vi 表示从 s i ( i = 1 , 2 , 3 , 4 ) s_i(i = 1,2,3,4) si(i=1,2,3,4)出发得到的回报(return)。

注意,轨迹是无穷的,例如,从 s 1 s_1 s1 出发: s 1 → s 2 → s 3 → s 4 → s 1 → s 2 …   . s_1 \rightarrow s_2 \rightarrow s_3 \rightarrow s_4 \rightarrow s_1 \rightarrow s_2\dots. s1s2s3s4s1s2.会一直走下去
v 1 = r 1 + γ r 2 + γ 2 r 3 + … v 2 = r 2 + γ r 3 + γ 2 r 4 + … v 3 = r 3 + γ r 4 + γ 2 r 1 + … v 4 = r 4 + γ r 1 + γ 2 r 2 + … \begin{align} v_1 &= r_1 + \gamma r_2 + \gamma^2 r_3 + \dots \\ v_2 &= r_2 + \gamma r_3 + \gamma^2 r_4 + \dots \\ v_3 &= r_3 + \gamma r_4 + \gamma^2 r_1 + \dots \\ v_4 &= r_4 + \gamma r_1 + \gamma^2 r_2 + \dots \\ \end{align} v1v2v3v4=r1+γr2+γ2r3+=r2+γr3+γ2r4+=r3+γr4+γ2r1+=r4+γr1+γ2r2+

(2)方法2:

v 1 = r 1 + γ ( r 2 + γ r 3 + …   ) = r 1 + γ v 2 v 2 = r 2 + γ ( r 3 + γ r 4 + …   ) = r 2 + γ v 3 v 3 = r 3 + γ ( r 4 + γ r 1 + …   ) = r 3 + γ v 4 v 4 = r 4 + γ ( r 1 + γ r 2 + …   ) = r 4 + γ v 1 \begin{align} v_1 &= r_1 + \gamma (r_2 + \gamma r_3 + \dots) = r_1 + \gamma v_2 \\ v_2 &= r_2 + \gamma (r_3 + \gamma r_4 + \dots) = r_2 + \gamma v_3 \\ v_3 &= r_3 + \gamma (r_4 + \gamma r_1 + \dots) = r_3 + \gamma v_4 \\ v_4 &= r_4 + \gamma (r_1 + \gamma r_2 + \dots) = r_4 + \gamma v_1 \\ \end{align} v1v2v3v4=r1+γ(r2+γr3+)=r1+γv2=r2+γ(r3+γr4+)=r2+γv3=r3+γ(r4+γr1+)=r3+γv4=r4+γ(r1+γr2+)=r4+γv1

​ 上面这一组式子告诉我们:从不同状态出发得到的 return 依赖于从其他状态出发得到的 return,回报(return)相互依赖。

​ 这一思想在强化学习中被称为 Bootstrapping !

现代的意思就是引申出来:我从自己出发,然后不断地迭代所得到的一些结果。

如何使用这些方程?把上面的一组式子写成矩阵向量的形式(matrix-vector form):

在这里插入图片描述

​ 可被重写成一种更简化的形式:
v = r + γ P v v = r + \gamma Pv v=r+γPv
在这里插入图片描述

I I I (identity matrix)减去 γ \gamma γ 然后乘以P 矩阵,然后乘以 v v v 就等于 γ \gamma γ ,把 ( I − v P ) (I - vP) (IvP)这个矩阵求逆,然后乘以 γ \gamma γ ,就得到了 v v v

从上面的方程可以解出从不同状态出发的价值(value) v ,这就是贝尔曼公式(针对这个特定的确定性 deterministic 问题)!

  • 虽然简单,但它展示了核心概念:一个状态(state)的价值(value)依赖于其他状态(state)的价值(value)
  • 矩阵向量形式更容易理解如何求解状态值(state value)。

练习:

​ 考虑图中所示的策略(policy)。请写出回报(return)之间的关系(即写出贝尔曼方程)

在这里插入图片描述

​ 答案:(从 s 1 s_1 s1 出发,以奖励 0 到状态 s 3 s_3 s3 ,从状态 s 3 s_3 s3 出发得到的 return 是 v 3 v_3 v3;从 s 2 s_2 s2 出发,以奖励 1 到状态 s 4 s_4 s4 ,从状态 s 4 s_4 s4 出发 得到的 return 是 v 4 v_4 v4;…)
v 1 = 0 + γ v 3 v 2 = 1 + γ v 4 v 3 = 1 + γ v 4 v 4 = 1 + γ v 4 \begin{align} v_1 = 0 + \gamma v_3 \\ v_2 = 1 + \gamma v_4 \\ v_3 = 1 + \gamma v_4 \\ v_4 = 1 + \gamma v_4 \\ \end{align} v1=0+γv3v2=1+γv4v3=1+γv4v4=1+γv4
​ 如何求解?这是一个线性方程组,很好求解。 我们可以先计算 v 4 v_4 v4,然后计算 v 3 , v 2 , v 1 v_3,v_2,v_1 v3,v2,v1

三. 状态值(state value)

单步:

单步(single-step)流程: b
S t → A t R t + 1 , S t + 1 S_t \xrightarrow{A_t} R_{t+1},S_{t+1} StAt Rt+1,St+1

  • t , t + 1 t,t + 1 t,t+1:离散时间实例, t t t 指当前的时刻, t + 1 t+1 t+1 指下一个时刻
  • S t : t S_t:t Stt 时刻的状态
  • A t A_t At:在状态 S t S_t St 采取的动作
  • R t + 1 R_{t+1} Rt+1:在状态 S t S_t St 采取动作 A t A_t At 之后获得的奖励(reward)(有时也写成 R t R_t Rt,写成什么都没有区别,只是一个习惯,但是一般都写成 R t + 1 R_{t+1} Rt+1
  • S t + 1 S_{t+1} St+1:采取动作 A t A_t At 后转换到的状态

​ 注意, S t 、 A t 、 R t + 1 S_t、A_t、R_{t+1} StAtRt+1 都是大写的,代表随机变量(random variables),就是我们可以对它进行一系列的操作,比如求期望(expectation)。

​ 每一步的所有跳跃(step)都由以下概率分布(probability distributions)所决定:

  • S t S_t St 要采取什么样的动作(action)由 策略 π \pi π 来决定
  • S t S_t St 采取动作(take action) A t A_t At,要得到什么样的奖励(Reward)由奖励概率(reward probability) 决定
  • S t S_t St 采取动作(take action) A t A_t At,要跳到下一个什么状态(State)由状态转移概率( state transition probability) 决定

在这里插入图片描述

​ governed:受约束的,所规管的

多步:

​ 考虑以下多步骤轨迹(multi-step trajectory):
S t → A t R t + 1 , S t + 1 → A t + 1 R t + 2 , S t + 2 → A t + 2 R t + 3 , … S_t \xrightarrow{A_t} R_{t+1},S_{t+1} \xrightarrow{A_{t+1}} R_{t+2},S_{t+2} \xrightarrow{A_{t+2}} R_{t+3},\dots StAt Rt+1,St+1At+1 Rt+2,St+2At+2 Rt+3,
​ 折扣回报(discounted return)Gt 是所有瞬时回报(immediate reward)与折扣因子(discount rate)乘积相加:
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + … G_t = R_{t+1}+ \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots Gt=Rt+1+γRt+2+γ2Rt+3+

  • γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ[0,1) 是折扣率(discount rate)。
  • G t G_t Gt 也是一个随机变量(random variables),因为 R t + 1 , R t + 2 R_{t+1},R_{t+2} Rt+1,Rt+2都是随机变量(random variables)。

正式定义状态值(state value):

​ 折扣回报(discounted return) G t G_t Gt 的期望值(或称为期望值 expectation 或平均值 mean)被定义为状态值函数(state-value function),或简称为状态值(state value):

在这里插入图片描述

​ 注意:

  • 状态值(state value)它是 s 的函数, 是一种条件期望(conditional expectation),条件是状态从 s 开始。从不同的状态 s 出发,得到的轨迹不同,得到的折扣回报(discounted return) G t G_t Gt 也不同
  • 状态值(state value)它是策略 π \pi π 的函数, 对于不同的策略(policy) ,会得到不同的轨迹,不同的轨迹会得到不同的折扣回报(discounted return)Gt,就会得到不同的状态值(state value)
  • 它代表一个状态的 “价值”。如果状态值(state value)越大,那么从这个状态出发的策略(policy)就更好,因为可以获得更大的累积回报(return)。

问: 回报(return)与状态值(state value)之间的关系是什么?

答:

回报(return)是针对单个轨迹(trajectory)求的 return;

状态值(state value)针对多个轨迹(trajectory)得到的 return 再求平均值。

如果从一个状态出发,有可能得到多个轨迹(trajectory),这时候回报(return)与状态值(state value)显然有区别;

但假如从一个状态出发,一切都是确定性的,只能得到一条轨迹(trajectory),这时候那个状态的回报(return)与那个状态的状态值(state value)是一样的。

在这里插入图片描述

例子:

在这里插入图片描述

​ 这三个例子分别对应三个策略 π 1 , π 2 , π 3 \pi_1,\pi_2,\pi_3 π1,π2,π3,三个策略导致了三个轨迹(trajectory 理解为根据策略可能走出的轨迹),要计算在这三个不同策略下同一个状态 s 1 s_1 s1 的状态值(state value)

在这里插入图片描述

​ 策略 1 和 2 从 s 1 s_1 s1 出发,能得到唯一的一个 trajectory,这个 trajectory 的 return 就是它们分别的 state value

​ 策略 3 有两条轨迹,状态值(state value)是这两条轨迹分别得到的回报(return)的平均值。就是把 probability 乘到前面去,这实际上就是期望(expectation)的求法。

​ 比较三个策略导致的状态值(state value)的大小可知,第一种策略是最好的,第二种策略是最差的,这与我们的直觉完全相同。

四. 贝尔曼公式:推导

1. 推导

  • 状态值(state value)固然重要,但如何计算呢?答案就在贝尔曼公式(Bellman equation)中。
  • 总之,贝尔曼公式(Bellman equation)描述了不同状态的状态值(state value)之间的关系。

​ 考虑一个随机轨迹:
S t → A t R t + 1 , S t + 1 → A t + 1 R t + 2 , S t + 2 → A t + 2 R t + 3 , … S_t \xrightarrow{A_t} R_{t+1},S_{t+1} \xrightarrow{A_{t+1}} R_{t+2},S_{t+2} \xrightarrow{A_{t+2}} R_{t+3},\dots StAt Rt+1,St+1At+1 Rt+2,St+2At+2 Rt+3,
​ 折扣回报(discounted return) G t G_t Gt 可写成
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + … = R t + 1 + γ ( R t + 2 + γ R t + 3 + …   ) = R t + 1 + γ G t + 1 \begin{align} G_t &= R_{t+1}+ \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots \\ &=R_{t+1} + \gamma(R_{t+2} + \gamma R_{t+3} + \dots) \\ &=R_{t+1} + \gamma G_{t+1} \end{align} Gt=Rt+1+γRt+2+γ2Rt+3+=Rt+1+γ(Rt+2+γRt+3+)=Rt+1+γGt+1
​ 所以这个时刻我所得到的 return 等于我能立即得到的奖励(immediate reward) R t + 1 R_{t+1} Rt+1 加上到下一时刻从那出发能得到的 return (futrue reward)乘以 discount rate

​ 那么,根据状态值(state value)的定义可以得出
v π ( s ) = E [ G t ∣ S t = s ] = E [ R t + 1 + γ G t + 1 ∣ S t = s ] = E [ R t + 1 ∣ S t = s ] + γ E [ G t + 1 ∣ S t = s ] \begin{align} v_{\pi}(s) &= \mathbb{E}[G_t|S_t = s]\\ &= \mathbb{E}[R_{t+1} + \gamma G_{t+1} | S_t = s] \\ &={\color{blue} \mathbb{E}[R_{t+1}|S_t = s]} + \gamma {\color{blue} \mathbb{E}[G_{t+1}|S_t = s]} \end{align} vπ(s)=E[GtSt=s]=E[Rt+1+γGt+1St=s]=E[Rt+1St=s]+γE[Gt+1St=s]
​ 接下来,分别计算这两个项,求出他们的形式,就得到了贝尔曼公式

​ 首先,计算第一项 E [ R t + 1 ∣ S t = s ] \mathbb{E}[R_{t+1}|S_t = s] E[Rt+1St=s]:当前时刻我在状态 s ,我得到的立即奖励(immediate reward)是 R t + 1 R_{t+1} Rt+1
E [ R t + 1 ∣ S t = s ] = ∑ a π ( a ∣ s ) E [ R t + 1 ∣ S t = s , A t = a ] = ∑ a π ( a ∣ s ) ∑ r p ( r ∣ s , a ) r \begin{align} \mathbb{E}[R_{t+1}|S_t = s] &= \sum_a \pi(a|s) \mathbb{E} [R_{t+1}|S_t = s,A_t = a] \\ &= \sum_a \pi(a|s) \sum_r p(r|s,a)r \end{align} E[Rt+1St=s]=aπ(as)E[Rt+1St=s,At=a]=aπ(as)rp(rs,a)r
理解:

​ 在状态 s ,我有多个 action 可以去选择,take action a 的概率是 π ( a ∣ s ) \pi(a|s) π(as),当我 take action a 我所得到的 value 是 E [ R t + 1 ∣ S t = s , A t = a ] \mathbb{E}[R_{t+1}|S_t = s, A_t = a] E[Rt+1St=s,At=a] E [ R t + 1 ∣ S t = s , A t = a ] \mathbb{E}[R_{t+1}|S_t = s, A_t = a] E[Rt+1St=s,At=a] 可以写成 ∑ r p ( r ∣ s , a ) r \sum\limits_r p(r|s,a)r rp(rs,a)r

​ 意思是,从 s s s 出发,take action a a a,得到的奖励(reward)是 r r r 的概率是 p ( r ∣ s , a ) p(r|s,a) p(rs,a),根据期望的定义,取值为 r r r 的概率乘以 r r r 本身就是期望。

注意: 第一项其实就是我能得到的立即奖励(immediate reward)的期望/平均

  • 大写的 S 不确定,小写的 s 是确定的。在前面的 state value 定义时已说明,S、R 表示随机变量。
  • 这里的大写 St,At,Rt+1都是集合,所以对于任意时刻 t,S 是确定的,A 可能有几种不同选择。 而之前的例子是确定性奖励,所以对于 R 是一个集合(变量)印象不深。最简单的就是抽奖,你每次执行同样的行为得到的奖励却不同
  • 这里 Π(a|s) 是采取动作 a 的概率,后面一项是采取这个动作之后,到下一个不同状态的概率
  • 比如我有 0.5 概率(pai)撞到墙,但是撞到墙之后有 0.1 概率原地不动,也有 0.9 概率后退一步,这部分内容就是后面的 p
  • 这里就是枚举了所有动作下的概率和收益的成绩加起来算了期望
  • 就是两次离散型随机变量计算期望

​ 其次,计算第二项 E [ G t + 1 ∣ S t = s ] \mathbb{E}[G_{t+1}|S_t = s] E[Gt+1St=s]:第二项是我从当前状态 s s s 出发得到的下一个时刻的回报(return)的期望(mean)

在这里插入图片描述

  • 第一行:从当前 s s s 出发,有多个选择,可以跳到不同 s ′ s' s ,跳到不同 s ′ s' s 的概率是 p ( s ′ ∣ s ) p(s' | s) p(ss),跳到不同 s ′ s' s 所得到的值是 E [ G t + 1 ∣ S t = s , S t + 1 = s ’ ] \mathbb{E}[G_{t+1}|S_t = s,S_{t+1} = s’ ] E[Gt+1St=s,St+1=s],一相加就是 (expectation) E [ G t + 1 ∣ S t = s ] \mathbb{E}[G_{t+1}|S_t = s] E[Gt+1St=s]
  • 从第一行到第二行: E [ G t + 1 ∣ S t = s , S t + 1 = s ′ ] \mathbb{E}[G_{t+1}|S_t = s,S_{t+1} = s' ] E[Gt+1St=s,St+1=s] 意思是当前状态是 s s s,下一个状态是 s ′ s' s,计算从下一个状态出发所得到回报(return)的期望(mean),第二行 E [ G t + 1 ∣ S t + 1 = s ′ ] \mathbb{E}[G_{t+1}|S_{t+1} = s' ] E[Gt+1St+1=s] 把第一行中那一项的 S t = s S_t = s St=s 去掉了,因为我已经知道了下一个状态是 s ′ s' s,就不用关心我之前究竟是在什么状态了,这其实就是马尔可夫的性质,是无记忆的(memoryless Markov property)
  • 从第二行到第三行: E [ G t + 1 ∣ S t + 1 = s ′ ] \mathbb{E}[G_{t+1} | S_{t+1} = s' ] E[Gt+1St+1=s] 意思是从下一个状态 s’ 出发计算我所能得到的回报(return)的平均值(mean),这个就是第三行写的一个状态值(state value) v π ( s ′ ) v_{\pi}(s') vπ(s),只不过是针对 s ′ s' s 的状态值(state value) v π ( s ′ ) v_{\pi}(s') vπ(s)。——最开始的状态值(state value)的定义
  • 从第三行到第四行:从 s s s s ′ s' s 的概率 p ( s ′ ∣ s ) p(s' | s) p(ss):从 s s s 出发我有多种选择,可以选择不同的动作(action),选择 action a 的概率是 π ( a ∣ s ) \pi (a|s) π(as) ,选择这个 action 我跳到 s ′ s' s 的概率是 p ( s ′ ∣ s , a ) p(s' |s, a) p(ss,a),通过两者相乘相加可以得到 p ( s ′ ∣ s ) p(s' | s) p(ss)

注意:

  • 第二项是 future reward 的平均(mean)
  • E [ G t + 1 ∣ S t = s , S t + 1 = s ′ ] = E [ G t + 1 ∣ S t + 1 = s ′ ] \mathbb{E}[G_{t+1}|S_t = s,S_{t+1} = s'] = \mathbb{E}[G_{t+1}|S_{t+1} = s'] E[Gt+1St=s,St+1=s]=E[Gt+1St+1=s] 是由于由于无记忆马尔可夫特性(memoryless Markov property)

贝尔曼公式(Bellman equation):此处 σ \sigma σ 后面应该加一个左大括号 {,右大括号在式子的最后面 }

在这里插入图片描述

强调,由方程中的符号可以得出以下重点:

  • 上述方程称为贝尔曼方程(Bellman equation),它描述了不同状态(states)的状态值函数(state-value functions)之间的关系:因为看上面式子标红的地方,上面式子等式左边是 s s s 的状态值(state value),等式右边是 s ′ s' s 的状态值(state value),他们的关系可以通过这样的一个式子表达出来。
  • 它由两个项组成:即时奖励项(immediate reward term)和未来奖励项(future reward term)。
  • 这是一组等式:每个状态(state)都有这样的等式!!!这不是一个式子,这个式子对状态空间中的所有状态都成立(等式后面的取值范围是 ∀ s ∈ S \forall s \in S sS),所以如果有 n 个状态,就有 n 个这样的式子,通过这 n 个式子可以求解出状态值(state value)。

在这里插入图片描述

  • v π ( s ) v_{\pi}(s) vπ(s) v π ( s ′ ) v_{\pi}(s') vπ(s) 是我们要计算的状态值,计算的思想就是 Bootstrapping ! 直观上来讲,等式左边的状态值(state value) v π ( s ) v_{\pi}(s) vπ(s))依赖于等式右边的状态值(state value) v π ( s ′ ) v_{\pi}(s') vπ(s),看起来好像没法计算,其实我们有一组这样的式子,把这些式子连立就可以算出来。
  • 公式中的 π ( a ∣ s ) \pi (a|s) π(as) 是给定的策略 policy(是一种概率 probability)。解方程称为策略评估(policy evaluation):贝尔曼公式依赖于策略(policy),如果我们能计算出状态值(state value),其实我们在做的一件事就是评估这个策略(policy evaluation)究竟是好是坏
  • 奖励概率 (Reward probability) p ( r ∣ s , a ) p(r|s,a) p(rs,a) 和状态转换概率(State transition probability) p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a) 代表的是动态模型(dynamic model)或称为环境模型(environment model) :分两种情况,一种是我们知道这个模型(model),在本节和下节当中我们都会假设知道这个 model,给出来相应的算法;一种是不知道模型(model),这种情况下我们仍然可以求出 state value,这就是 model free reinforcement learning 的算法。

2. 例子

(1)例子1:

​ 图中的策略 π \pi π 由绿色的箭头表示

在这里插入图片描述

​ 根据一般表达式(general expression)写出贝尔曼方程:
v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] v_{\pi}(s) = \sum_a \pi(a|s)\left[\sum_r p(r|s,a)r + \gamma \sum_{s'}p(s'|s,a)v_{\pi}(s')\right] vπ(s)=aπ(as)[rp(rs,a)r+γsp(ss,a)vπ(s)]
​ 这个例子很简单,因为策略(policy)是确定的(deterministic)。

​ 首先,考虑 s 1 s_1 s1 的状态值(state value):
π ( a = a 3 ∣ s 1 ) = 1    a n d    π ( a ≠ a 3 ∣ s 1 ) = 0 p ( s ′ = s 3 ∣ s 1 , a 3 ) = 1    a n d p ( s ′ ≠ s 3 ∣ s 1 , a 3 ) = 0 p ( r = 0 ∣ s 1 , a 3 ) = 1    a n d p ( r ≠ 0 ∣ s 1 , a 3 ) = 0 \pi(a = a_3|s_1) = 1 \ \ and \ \ \pi(a \ne a_3 | s_1) = 0 \\ p(s' = s_3|s_1,a_3)=1 \ \ and p(s' \ne s_3 | s_1,a_3) = 0 \\ p(r=0|s_1,a_3)=1 \ \ and p(r \ne 0 | s_1,a_3) = 0 π(a=a3s1)=1  and  π(a=a3s1)=0p(s=s3s1,a3)=1  andp(s=s3s1,a3)=0p(r=0∣s1,a3)=1  andp(r=0∣s1,a3)=0
​ 将上面这些概率和值代入贝尔曼方程,得出:(下面这个式子和上面在 二.2 那部分用激励性例子 2 介绍的方法计算出的结果一样,即与上面直观计算出的结果是一样的,虽然此时是用复杂贝尔曼公式得到的,但从直观上来讲很容易理解)
v π ( s 1 ) = 0 + γ v π ( s 3 ) v_{\pi}(s_1) = 0 + \gamma v_{\pi}(s_3) vπ(s1)=0+γvπ(s3)
​ 类似地,可以得出
v π ( s 1 ) = 0 + γ v π ( s 3 ) v π ( s 2 ) = 1 + γ v π ( s 4 ) v π ( s 3 ) = 1 + γ v π ( s 4 ) v π ( s 4 ) = 1 + γ v π ( s 4 ) v_{\pi}(s_1) = 0 + \gamma v_{\pi}(s_3) \\ v_{\pi}(s_2) = 1 + \gamma v_{\pi}(s_4) \\ v_{\pi}(s_3) = 1 + \gamma v_{\pi}(s_4) \\ v_{\pi}(s_4) = 1 + \gamma v_{\pi}(s_4) vπ(s1)=0+γvπ(s3)vπ(s2)=1+γvπ(s4)vπ(s3)=1+γvπ(s4)vπ(s4)=1+γvπ(s4)
​ 从最后一个方程到第一个方程,逐一求解上述方程,得到:
v π ( s 4 ) = 1 1 − γ v π ( s 3 ) = 1 1 − γ v π ( s 2 ) = 1 1 − γ v π ( s 1 ) = γ 1 − γ v_{\pi}(s_4) = \frac{1}{1-\gamma} \\ v_{\pi}(s_3) = \frac{1}{1-\gamma} \\ v_{\pi}(s_2) = \frac{1}{1-\gamma} \\ v_{\pi}(s_1) = \frac{\gamma}{1-\gamma} \\ vπ(s4)=1γ1vπ(s3)=1γ1vπ(s2)=1γ1vπ(s1)=1γγ
​ 如果 γ = 0.9 \gamma = 0.9 γ=0.9,那么
v π ( s 4 ) = 1 1 − 0.9 = 10 v π ( s 3 ) = 1 1 − 0.9 = 10 v π ( s 2 ) = 1 1 − 0.9 = 10 v π ( s 1 ) = 0.9 1 − 0.9 = 9 v_{\pi}(s_4) = \frac{1}{1-0.9} = 10 \\ v_{\pi}(s_3) = \frac{1}{1-0.9} = 10\\ v_{\pi}(s_2) = \frac{1}{1-0.9} = 10\\ v_{\pi}(s_1) = \frac{0.9}{1-0.9} = 9\\ vπ(s4)=10.91=10vπ(s3)=10.91=10vπ(s2)=10.91=10vπ(s1)=10.90.9=9
​ 计算出 s 1 s_1 s1 的状态值是 9, s 2 , s 3 , s 4 s_2,s_3,s_4 s2,s3,s4 的状态值是 10。状态值(state values)代表这个状态的价值,如果一个状态的价值高,说明这个状态是值得我们往那个方向走的,之所以 s 2 , s 3 , s 4 s_2,s_3,s_4 s2,s3,s4 的价值高,是因为它们距离 target area 比较近。

在这里插入图片描述

计算出状态值(state values)后干什么?

耐心等待(计算行动值(action value)并改进策略(improve policy)),慢慢的就会得到最优策略。

s 2 s_2 s2 不是陷阱吗?为什么状态值那么高?

  • 前面提到过,reward 是给动作打分,现在的 v v v 是状态的得分,所以虽然 s 2 s_2 s2 是陷阱,但是进入陷阱的惩罚是不体现在陷阱这个状态里面的
  • 陷阱的负价值体现在 s 1 s_1 s1 的 value 是最小的上面,因为只有 s 1 s_1 s1 有可能往陷阱走
  • s 2 s_2 s2 的策略是走向 s 4 s_4 s4,这个是高价值的;如果 s 1 s_1 s1 还有一个策略是走向 s 2 s_2 s2,那么 s 1 s_1 s1 的 value 还会进一步降低
(2)例子2

在这里插入图片描述

v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] v_{\pi}(s) = \sum_a \pi(a|s)\left[\sum_r p(r|s,a)r + \gamma \sum_{s'}p(s'|s,a)v_{\pi}(s')\right] vπ(s)=aπ(as)[rp(rs,a)r+γsp(ss,a)vπ(s)]

  • 写出每个状态的贝尔曼方程。
  • 求解贝尔曼方程中的状态值。
  • 与上一个示例中的策略进行比较。

在这里插入图片描述

在这个策略(policy)下,计算出 s 1 s_1 s1 的状态值(state value)是 8.5, s 2 , s 3 , s 4 s_2,s_3,s_4 s2,s3,s4 的状态值(state value)是 10。而在上一个策略(policy)下 s 1 s_1 s1 的状态值(state value)是 9。

所以这个策略没有刚才的策略好。

五.贝尔曼公式( Bellman equation):矩阵向量形式(Matrix-vector form)

为什么要考虑矩阵向量形式?因为我们需要从中求解状态值(state value)!

一个未知数依赖于另一个未知数。如何解决这些未知数?
v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] {\color{red}v_{\pi}(s)} = \sum_a \pi(a|s)\left[ \sum_r p(r|s,a)+\gamma \sum_{s'} p(s'|s,a) {\color{red}v_{\pi}(s')} \right] vπ(s)=aπ(as)[rp(rs,a)+γsp(ss,a)vπ(s)]

  • 元素形式(Elementwise form): 上述元素形式的方程对每个状态 s ∈ S s \in S sS 都成立,如果有 n n n 个状态就有 n n n 个这样的方程。这意味着有这样的 ∣ S ∣ |S| S 方程!
  • 矩阵向量形式(Matrix-vector form): 如果我们把所有方程放在一起,就会得到一组线性方程,可以简洁地写成矩阵向量形式。矩阵向量形式非常优雅,也非常重要。

1. 推导出矩阵向量形式:

回顾一下:

v π ( s ) = ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) v π ( s ′ ) ] v_{\pi}(s) = \sum_a \pi(a|s)\left[ \sum_r p(r|s,a)+\gamma \sum_{s'} p(s'|s,a) v_{\pi}(s') \right] vπ(s)=aπ(as)[rp(rs,a)+γsp(ss,a)vπ(s)]
将贝尔曼方程改写为(括号外的项往括号里面分配)
v π ( s ) = γ π ( s ) + γ ∑ s ′ p π ( s ′ ∣ s ) v π ( s ′ ) v_{\pi}(s) = \gamma_{\pi}(s)+\gamma \sum_{s'} p_{\pi}(s'|s)v_{\pi}(s') vπ(s)=γπ(s)+γspπ(ss)vπ(s)
其中

在这里插入图片描述

  • r π ( s ) r_{\pi}(s) rπ(s) 代表从当前状态出发,我所能得到的即时奖励(immediate reward)的平均值
  • 这个式子其实与推导贝尔曼公式的时候计算第一项和第二项的时候写的中间过程的公式是一样的,是即时奖励加未来奖励
  • 从当前 s s s 出发,有多个选择,可以跳到不同 s ′ s' s ,跳到不同 s ′ s' s 的概率是 p ( s ′ ∣ s ) p(s' | s) p(ss)

假设状态(states)可以索引为 s i ( i = 1 , . . . , n ) s_i (i = 1, ... , n) si(i=1,...,n)

对于状态 s i s_i si,贝尔曼方程为:(从 s i s_i si 跳到 s j s_j sj 的概率是 p π ( s j ∣ s i ) p_{\pi}(s_j|s_i) pπ(sjsi),从 s i s_i si 跳到 s j s_j sj 所取的 state value 是 v π ( s j ) v_{\pi}(s_j) vπ(sj)

v π ( s ) = γ π ( s ) + γ ∑ s j p π ( s j ∣ s i ) v π ( s j ) v_{\pi}(s) = \gamma_{\pi}(s)+\gamma \sum_{s_j} p_{\pi}(s_j|s_i)v_{\pi}(s_j) vπ(s)=γπ(s)+γsjpπ(sjsi)vπ(sj)
将所有这些状态方程放在一起,改写成矩阵向量形式, v π v_{\pi} vπ 是一个向量
v π ( s ) = γ π ( s ) + γ P π v π v_{\pi}(s) = \gamma_{\pi}(s)+\gamma P_{\pi}v_{\pi} vπ(s)=γπ(s)+γPπvπ
其中( P π P_{\pi} Pπ 是状态转换矩阵(state transition matrix), p π ( s j ∣ s i ) p_{\pi}(s_j|s_i) pπ(sjsi) 意思是状态从 s i s_i si 跳到 s j s_j sj 的概率)
在这里插入图片描述

代表第 i i i行第 j j j列的元素从 s i s_i si 跳到 s j s_j sj 的这样一个概率

2. 例子

(1)例子1

有四个状态,即 n = 4 的时候的矩阵向量形式

在这里插入图片描述

考虑下图,策略(policy)用绿色的箭头表示
在这里插入图片描述

(2)例子2

在这里插入图片描述

在这里插入图片描述

六.贝尔曼公式( Bellman equation):求解状态值(state value)

1.求解

用刚才推导的贝尔曼公式的矩阵和向量的形式求解状态值(state value)

为什么要求解状态值(state value)?

  • 给定一个策略(policy),我们会列出来它的贝尔曼公式( Bellman equation),再进一步求解这个贝尔曼公式得到状态值(state value),求出相应的状态值这样的一个过程(state value)称为策略评估(policy evaluation)!这是 RL 中的一个基本问题。它是找到更好策略的基础。
  • 策略评估(policy evaluation)是强化学习中的关键,因为只有能够去评价一个策略好或者不好,我们才能进一步改进它最后再找到最优的策略。

矩阵向量形式的贝尔曼方程为: v π v_π vπ 是一个向量
v π = r π + γ P π v π v_{\pi} = r_{\pi} + \gamma P_{\pi}v_{\pi} vπ=rπ+γPπvπ
下面给出两种求解贝尔曼公式的方法:

(1)闭式解为(The closed-form solution is),即状态值(state value)的解析表达式为:
v π = ( I − γ P π ) − 1 r π v_{\pi} = (I - \gamma P_{\pi})^{-1}r_{\pi} vπ=(IγPπ)1rπ
实际上,我们仍然需要使用数值工具来计算矩阵逆,实际中并不会使用。我们能避免矩阵逆运算吗?可以,通过迭代算法(iterative algorithms)。

(2)迭代解决(iterative solution)方案是: v k v_k vk v k + 1 v_{k+1} vk+1 都是向量,包含了不同时刻的所有状态值)
v k + 1 = r π + γ P π v k v_{k+1} = r_{\pi}+\gamma P_{\pi}v_k vk+1=rπ+γPπvk
首先可以随便猜一个 v 0 v_0 v0 等于什么(比如全为0),然后带入到等式右边,得到等式左边的 v 1 v_1 v1
然后把 v 1 v_1 v1 再带到等式右边,得到等式左边的 v 2 v_2 v2
然后把 v 2 v_2 v2 再带到等式右边,得到等式左边的 v 3 v_3 v3,如此循环计算下去,就会得到一个序列 { v 0 , v 1 , v 2 , } \{v0, v1, v2,\} {v0,v1,v2,}。我们可以证明当 k k k 趋向于 ∞ ∞ 的时候, v k v_k vk 就收敛到了 v π v_{\pi} vπ,这个 v π v_{\pi} vπ 就是真实的状态值(state value)
v k → v π = ( I − γ P π ) − 1 r π ,      k → ∞ v_k \rightarrow v_{\pi} = (I- \gamma P_{\pi})^{-1}r_{\pi}, \ \ \ \ k \rightarrow \infty vkvπ=(IγPπ)1rπ,    k
证明:

在这里插入图片描述

2.例子

r b o u n d a r y = r f o r b i d d e n = − 1 , r t a r g e t = + 1 , γ = 0.9 r_{boundary} = r_{forbidden} = -1, r_{target} = +1,\gamma = 0.9 rboundary=rforbidden=1,rtarget=+1,γ=0.9

以下是两项 "好 "的策略(绿色箭头是策略)和状态值(state value)。在第四列中,前两个状态的两项策略是不同的。

在这里插入图片描述

用刚才讲的解析表达式或者迭代算法都可以求出状态值(state value)。

可以看出,状态值(state value)全为正数。

  • 靠近目标 target area 的状态值(state value)都比较大,
  • 距离目标 target area 越远,它的状态值(state value)越小。

以下是两项 "不好"的策略(绿色箭头是策略)和状态值(state value)。状态值(state value)比好策略的状态值小。

在这里插入图片描述

上面两个策略很明显会撞墙或进入禁区,从直觉上讲,这是不好的策略;

而计算出的状态值(state value)有负数,通过状态值(state value)也可以判断出这是不好的策略,这与我们的直觉一致。

可以看出,我们可以通过计算状态值(state value)来评价一个策略(policy)的好坏

七.动作值(action value)

从状态值(state value)到动作值(action value) :

  • 状态值(state value):(agent)智能体从某一状态(state)开始所能获得的平均回报(average return)。
  • 动作值(action value):(agent)智能体从某一状态(state)出发并采取某项动作(taking an action)之后所能获得的平均回报(average return)。

我们为什么关心动作值(action value)?

  • 策略指的是在一个状态我要选择什么样的 action,有一些 action 我们如何做选择呢?就要根据 action value 来做判断,action value 大的意味着我选择那个 action 会得到更多的 reward,那我就会去选择那个。
  • 因为我们想知道哪个动作更好。这一点在下面的讲解中会更加清楚。我们将经常使用动作值。

1.动作值定义

动作值定义:我们从当前状态 s 出发,选择动作 a 之后,我所得到的回报(return)的一个平均(average)就是动作值(action value):
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]

  • q π ( s , a ) q_{\pi}(s,a) qπ(s,a)是状态-动作对 ( s , a ) (s,a) (s,a)的函数,依赖于从哪个状态出发,从哪个状态的 action 出发。
  • q π ( s , a ) q_{\pi}(s,a) qπ(s,a)依赖于 π \pi π,不同的策略会得到不同的 action value

(不确定对)确定了action的话reward不也是确定的吗,为啥还要求期望?

  • 确定了action,action的reward确定,但结果状态不确定,所以期望是给结果状态 v ( s ′ ) v(s') v(s)
  • 就比如之前老师讲的被风吹歪的例子,现态采取同个策略可能会掉到不同的次态

2.动作值与状态值的联系

根据条件期望的性质可以得出:等式右边意思是我有很多个 a a a,我选择一个 a a a 的概率是 π ( a ∣ s ) \pi(a | s) π(as),选择 a a a 后所得到的 average return 是 q π ( s , a ) q_{\pi}(s,a) qπ(s,a)

在这里插入图片描述

因此

v π ( s ) = ∑ a π ( a ∣ s ) q π ( s , a ) ( 2 ) {\color{red}v_{\pi}(s)} = \sum_a \pi(a|s) {\color{red}q_{\pi}(s,a)} \quad \quad \quad (2) vπ(s)=aπ(as)qπ(s,a)(2)
等式左边是从一个状态出发的 state value 等于右边我选择不同 action 得到的 action value 的平均值,权重就是策略 π \pi π

action value其实可以理解为state value的一个action下的值

回想一下,状态值(state value)由以下公式给出

在这里插入图片描述

比较 (2) 和 (3),我们可以得出动作值函数(action-value function)的表达式

在这里插入图片描述

(2) 和 (4) 是一枚硬币的两面:

  • (2) 说明了如何从动作值(action value)中获取状态值(state value)。
  • (4) 则说明了如何从状态值(state value)中获取动作值(action value)。

在概率论范畴下,研究对象都是随机变量,是没有常规意义的平均的。所说的平均都是概率意义平均,即期望。

3.例子

在这里插入图片描述

写出状态 s 1 s_1 s1 的动作值

q π ( s 1 , a 2 ) = − 1 + γ v π ( s 2 ) q_{\pi}(s_1,a_2) = -1+\gamma v_{\pi}(s_2) qπ(s1,a2)=1+γvπ(s2)
问题?下面这些不等于0!!
q π ( s 1 , a 2 ) , q π ( s 1 , a 3 ) , q π ( s 1 , a 4 ) , q π ( s 1 , a 5 ) = ?   B e c a r e f u l   ! ! q_{\pi}(s_1,a_2),q_{\pi}(s_1,a_3),q_{\pi}(s_1,a_4),q_{\pi}(s_1,a_5)=? \ Be careful \ !! qπ(s1,a2),qπ(s1,a3),qπ(s1,a4),qπ(s1,a5)=? Becareful !!
至于其他动作:所有的 action 都可以计算
q π ( s 1 , a 2 ) = − 1 + γ v π ( s 2 ) q π ( s 1 , a 3 ) = 0 + γ v π ( s 3 ) q π ( s 1 , a 4 ) = − 1 + γ v π ( s 1 ) q π ( s 1 , a 5 ) = 0 + γ v π ( s 2 1 \begin{align} q_{\pi}(s_1,a_2) &= -1+\gamma v_{\pi}(s_2) \\ q_{\pi}(s_1,a_3) &= 0+\gamma v_{\pi}(s_3) \\ q_{\pi}(s_1,a_4) &= -1+\gamma v_{\pi}(s_1) \\ q_{\pi}(s_1,a_5) &= 0+\gamma v_{\pi}(s_21 \\ \end{align} qπ(s1,a2)qπ(s1,a3)qπ(s1,a4)qπ(s1,a5)=1+γvπ(s2)=0+γvπ(s3)=1+γvπ(s1)=0+γvπ(s21
强调:

  • 动作值(action value)很重要,因为我们未来会关注在某个状态它不同的 action ,它们之间会相互比较,我们会选一个动作值(action value)最大的那个。因为我们关心的是采取哪种动作。
  • 我们可以先求解贝尔曼公式,计算所有状态值(state value),然后再计算动作值(action value)。
  • 我们也可以不计算状态值(state value),使用或不使用模型直接计算动作值(action value)。

八.总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/523531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIS水文分析填充伪洼地学习

1 基本操作 洼地是指流域内被较高高程所包围的局部区域; 分为自然洼地和伪洼地; 自然洼地是自然界实际存在的洼地; 在 DEM 数据中,由于数据处理的误差和不合适的插值方法所产生的洼地,称为伪洼地; DEM 数据…

【C语言】汉诺塔问题

目录 一、何为汉诺塔问题? 二、汉诺塔计算规律 三、打印汉诺塔的移动路径 总结 一、何为汉诺塔问题? 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世…

Linux Shell:`cat`命令

Linux Shell:cat命令 Linux 系统中的 cat 命令是一种多用途的工具,主要用于查看、创建、连接和追加文件内容。其名称来源于 concatenate 的缩写,意味着它可以用来连接文件内容到标准输出(屏幕)。在日常使用中&#xf…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算,整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”&am…

WHILE循环

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 WHILE 循环是先判断条件,如果条件成立就执行循环体,如果不成立,就退出循环 while 条件表达式 loop 语句序列 end loop 运行的时候&…

14届蓝桥杯省赛 C/C++ B组 T8 整数删除(双向链表,堆)

瞬间定位一个数的左边或者右边,需要用到双向链表。 在过程中不断维护最小值,需要用到堆。 所以定义一个pair类型优先队列,每次取出堆顶进行删除,并且同时让删除元素的左右元素加上其值。 同时需要注意,在删除元素之后…

5. 4 二重循环将二维数组的某列、某矩形转大写

5. 4 二重循环将二维数组的某列、某矩形转大写 1. 把每一行的b都变成大写 assume cs:codesg,ds:data,ss:stack data segmeNTstr db aaaaabbbbbcccccdb aaaaabbbbbcccccdb aaaaabbbbbcccccdb aaaaabbbbbccccc,$ data endsstack segmentdb 10 dup(0) stack endscodesg SEgments…

船气废弃锅炉三维仿真vr交互展示降低培训门槛

火化炉是殡葬行业的核心设备,其操作技艺对于专业人才的培养至关重要。然而,传统实践教学受限于时间、场地、设备损耗等多重因素,难以给予学生充分的实操机会。面对这一挑战,我们创新推出了火化炉vr三维仿真培训软件,以…

Java私房菜:探索泛型之妙用与深意

“泛型”(generics)作为Java特性之一,相信大家也耳熟能详了,就算没听说过,也肯定看过或偶然间使用过泛型,在这里,我们一起重新温习一下泛型,通过一些案例引发些新的思考。Java中的泛…

保研复习数据结构-图(10)

一.图的定义和基本术语 1.什么是图? 图(Graph)是由顶点的有穷非空集合V(G)和顶点之间边的集合E(G)组成,通常表示为:G(V,E),其中,G表示图,V是图G中顶点的集合,E是图G中边的集合。 2.什么是完全图&#xf…

MySQL基础练习题:创建数据库

这部分主要是为了帮助大家回忆回忆MySQL的基本语法,数据库来自于MySQL的官方简化版,题目也是网上非常流行的35题。这些基础习题基本可以涵盖面试中需要现场写SQL的问题。 创建数据库 在开始练习之前,我默认你的电脑上是没有本系列练习题需要…

题目:【序列中删除指定数字】【变种水仙花数】【数组串联】【交换奇偶位】【offsetof宏的实现】

题目一:序列中删除指定数字 #include <stdio.h>int main(){int a0;int arr[50]{0};int c0;scanf("%d",&a);for(int i0;i<a;i){scanf("%d",&arr[i]);//输入a个值}scanf("%d",&c);//输入要删除的数据int i0;int j0;for(i0;i&…

【科东软件】鸿道Intewell-Win_V2.1.1_release版本正式发布

Intewell-Win_V2.1.1_release版本 版本号&#xff1a;V2.1.1 版本发布类型&#xff1a;release正式版本 版本特点 修复此前版本中的问题 运行环境推荐 Intewell developer可以运行在windows7及windows10 64位 支持硬件列表

【40分钟速成智能风控2】互联网金融信用风险

目录 ​编辑 信用风险 白名单准入 贷前识别 贷中管理 贷后催收 信用风险 白名单准入 白名单是信用风险管理的第一道门槛&#xff0c;与整个平台贷款产品的设计和定位有紧密的联系。白名单设立的初衷是圈定目标客户&#xff0c;有了目标客群之后才能更好地进行精准营销&…

非关系型数据库——三万字Redis数据库详解

目录 前言 一、Redis概述 1.主要特点 2.Redis优缺点 3.Redis为什么这么快 4.Redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存 5.线程模型 5.1单线程架构 5.2多线程IO处理&#xff08;Redis 6及以上&#xff09; 5.3线程模型的优化 6.作用 …

基于SpringBoot+微信小程序的点餐系统

一、项目背景介绍&#xff1a; 小程序外卖扫码点餐为客户提供的是最方便的饮食方式,以快速、便捷的点餐业务送货上门为 -客户服务,这省去了客户很多不必要的时间和麻烦,给商家带来更多利益。同时,小程序外卖扫码点餐可以辅助餐饮企业营销,通过信息管理,可以记录餐饮企业方方面面…

Linux--进程(2)

目录 前言 1. 进程的状态 1.1 进程排队 1.2 运行&#xff0c;阻塞&#xff0c;挂起 2.Linux下具体的进程状态 2.1僵尸和孤儿 3.进程的优先级 4.Linux的调度与切换 前言 这篇继续来学习进程的其它知识 上篇文章&#xff1a;Linux--进程&#xff08;1&#xff09;-CS…

挑战30天C++基本入门(DAY8--树)[part 3](速通哦~)

#上一章我们把搜索二叉树的知识给传授完毕&#xff0c;如果认真的看下去并且手打了几遍&#xff0c;基本上内部的逻辑还是可以理解的&#xff0c;那我们现在就截至继续学习树的一些重要知识啦~~ 树高怎么求呀&#xff1f;如果用上一次学的层次遍历来求树高&#xff0c;有点小题…

笔记 | 软件工程:需求分析

1 需求分析 #需求分析 1.1 需求分析概述 初步软件需求存在的问题&#xff1a;不具体&#xff0c;不清晰&#xff0c;关系不明朗&#xff0c;存在潜在缺陷&#xff0c;没有区分不同软件需求&#xff08;有必要鉴别不同软件需求项的重要性差别&#xff0c;区分不同软件需求的开…

图数据库技术:知识图谱的存储与查询

图数据库技术&#xff1a;知识图谱的存储与查询 一、引言 在探索知识的宇宙中&#xff0c;知识图谱是组织和理解海量信息的星系图。在这张图中&#xff0c;每一个概念、实体与事物不再是孤立的点&#xff0c;而是通过关系与边相互连接&#xff0c;形成一个复杂而有机的网络。图…