摘要

本系列知识点讲解基于蘑菇书EasyRL中的内容进行详细的疑难点分析!具体内容请阅读蘑菇书EasyRL


对应蘑菇书EasyRL——3.4 免模型控制


Sarsa 算法详细推导与示例

1. Sarsa 算法简介

Sarsa(State-Action-Reward-State-Action)是一种基于时序差分(TD, Temporal Difference)的强化学习算法,用于学习最优策略。它是一种在线学习算法,使用贪心策略ε-贪心策略进行探索,并逐步更新状态-动作值函数 Q ( s , a ) Q(s, a) Q(s,a)

Sarsa 的核心思想是:

在每个时间步 t t t,基于当前状态 S t S_t St 和动作 A t A_t At,计算下一步的状态 S t + 1 S_{t+1} St+1 和动作 A t + 1 A_{t+1} At+1,并使用 ( S t , A t , R t + 1 , S t + 1 , A t + 1 ) (S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}) (St,At,Rt+1,St+1,At+1)五元组 来更新 Q 值。


2. Sarsa 算法推导

在强化学习中,我们希望学得最优状态-动作值函数
Q ∗ ( s , a ) = max ⁡ π Q π ( s , a ) Q^*(s,a) = \max_{\pi} Q^\pi(s,a) Q(s,a)=πmaxQπ(s,a)
其中:

  • Q π ( s , a ) Q^\pi(s, a) Qπ(s,a) 是策略 π \pi π 下的状态-动作值函数
  • 我们希望找到最优策略 π ∗ \pi^* π,使得智能体在每个状态 s s s 选择的动作 a a a 最大化其未来累积奖励。

(1)Q 值的 Bellman 公式

回顾 Q 值的 Bellman 方程
Q π ( s , a ) = E [ R t + 1 + γ Q π ( S t + 1 , A t + 1 ) ∣ S t = s , A t = a ] Q^\pi(s,a) = \mathbb{E} \left[ R_{t+1} + \gamma Q^\pi(S_{t+1}, A_{t+1}) \mid S_t = s, A_t = a \right] Qπ(s,a)=E[Rt+1+γQπ(St+1,At+1)St=s,At=a]
其中:

  • R t + 1 R_{t+1} Rt+1 是采取动作 A t A_t At 后获得的即时奖励
  • γ \gamma γ 是折扣因子
  • Q π ( S t + 1 , A t + 1 ) Q^\pi(S_{t+1}, A_{t+1}) Qπ(St+1,At+1) 是下一步的状态-动作值

(2)Sarsa 更新公式

Sarsa 采用时序差分(TD)学习,其核心更新公式为:
Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γQ(St+1,At+1)Q(St,At))
其中:

  • α \alpha α 是学习率
  • R t + 1 + γ Q ( S t + 1 , A t + 1 ) R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) Rt+1+γQ(St+1,At+1)TD 目标(TD Target)
  • R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t) Rt+1+γQ(St+1,At+1)Q(St,At)TD 误差(TD Error)

(3)Sarsa 算法的完整步骤

  1. 初始化 Q ( s , a ) Q(s, a) Q(s,a)

    • 初始化所有状态-动作对的 Q 值(通常设为 0 或随机小值)
  2. 选择初始状态 S 0 S_0 S0 和动作 A 0 A_0 A0

    • 使用 ε-贪心策略 选择动作,即:
      • 以概率 1 − ϵ 1 - \epsilon 1ϵ 选择 Q 值最高的动作
      • 以概率 ϵ \epsilon ϵ 随机选择 其他动作(探索)
  3. 在环境中执行 A t A_t At,观察 R t + 1 R_{t+1} Rt+1 S t + 1 S_{t+1} St+1

    • 例如,执行 A t A_t At 后,环境返回奖励 R t + 1 R_{t+1} Rt+1 并进入状态 S t + 1 S_{t+1} St+1
  4. 选择下一步的动作 A t + 1 A_{t+1} At+1

    • 仍然使用 ε-贪心策略 选择 A t + 1 A_{t+1} At+1
  5. 更新 Q 值
    Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γQ(St+1,At+1)Q(St,At))

  6. 循环直到达到终止状态

    • 继续执行步骤 3–5,直到达到终止状态。

环境返回奖励 R t + 1 R_{t+1} Rt+1 并进入状态 S t + 1 S_{t+1} St+1 的过程,是由强化学习环境决定的。这个过程通常由 环境动态模型(Environment Dynamics Model)交互规则 控制,具体来说,它由 马尔可夫决策过程(MDP) 定义。

2.1 环境如何确定 S t + 1 S_{t+1} St+1 R t + 1 R_{t+1} Rt+1

强化学习的环境是一个马尔可夫决策过程(MDP, Markov Decision Process),它由以下 4 个基本要素组成:

  • 状态空间(State Space, S \mathcal{S} S:所有可能的状态集合
  • 动作空间(Action Space, A \mathcal{A} A:所有可能的动作集合
  • 状态转移概率 P ( S t + 1 ∣ S t , A t ) P(S_{t+1} \mid S_t, A_t) P(St+1St,At):决定执行动作 A t A_t At 后,环境转移到状态 S t + 1 S_{t+1} St+1 的概率
  • 奖励函数 R ( S t , A t , S t + 1 ) R(S_t, A_t, S_{t+1}) R(St,At,St+1):决定执行 A t A_t At 后,环境返回的即时奖励

在 MDP 中,环境的动态状态转移函数奖励函数 确定:
S t + 1 ∼ P ( S t + 1 ∣ S t , A t ) S_{t+1} \sim P(S_{t+1} \mid S_t, A_t) St+1P(St+1St,At) R t + 1 = R ( S t , A t , S t + 1 ) R_{t+1} = R(S_t, A_t, S_{t+1}) Rt+1=R(St,At,St+1)
这意味着:

  • 环境不是随机的黑箱,它有内在规则,比如:
    • 网格世界中,向左移动意味着 S t + 1 S_{t+1} St+1 可能是左边的格子。
    • 自动驾驶中,刹车的 A t A_t At 可能导致 S t + 1 S_{t+1} St+1 的速度降低。
  • 有些环境是确定性的,有些是随机的
    • 确定性环境 S t + 1 S_{t+1} St+1 S t S_t St A t A_t At 唯一决定
    • 随机环境:有多个 S t + 1 S_{t+1} St+1 可能的选择,每个有不同的概率

2.2 具体示例:网格世界(Grid World)

假设我们有一个 4×4 的网格世界,智能体可以执行 4 种动作:

  • 上 (↑)下 (↓)左 (←)右 (→)

状态 S S S 由智能体的坐标 ( x , y ) (x, y) (x,y) 表示,假设环境规则如下:

  1. 确定性状态转移
    • 例如,如果智能体在 ( 1 , 1 ) (1,1) (1,1) 处选择 A t = 右 A_t = \text{右} At=,那么:
      S t + 1 = ( 1 , 2 ) S_{t+1} = (1,2) St+1=(1,2)
  2. 奖励函数
    • 每次移动都会得到 R t + 1 = − 1 R_{t+1} = -1 Rt+1=1(消耗一步)
    • 目标位置 ( 4 , 4 ) (4,4) (4,4) 的奖励是 R = + 10 R = +10 R=+10
    • 碰到墙壁则 S t + 1 = S t S_{t+1} = S_t St+1=St(状态不变),奖励 R t + 1 = − 1 R_{t+1} = -1 Rt+1=1
示例 1:智能体在 ( 1 , 1 ) (1,1) (1,1) 选择 A t = 右 A_t = \text{右} At=
  • 当前位置 S t = ( 1 , 1 ) S_t = (1,1) St=(1,1)
  • 采取动作 A t = 右 A_t = \text{右} At=
  • 环境规则:
    • 状态转移 S t + 1 = ( 1 , 2 ) S_{t+1} = (1,2) St+1=(1,2)
    • 奖励计算 R t + 1 = − 1 R_{t+1} = -1 Rt+1=1
  • 代理观察到新的状态 S t + 1 = ( 1 , 2 ) S_{t+1} = (1,2) St+1=(1,2),并继续决策。
示例 2:智能体在 ( 3 , 3 ) (3,3) (3,3) 选择 A t = 下 A_t = \text{下} At=
  • 当前位置 S t = ( 3 , 3 ) S_t = (3,3) St=(3,3)
  • 采取动作 A t = 下 A_t = \text{下} At=
  • 环境规则:
    • 状态转移 S t + 1 = ( 4 , 3 ) S_{t+1} = (4,3) St+1=(4,3)
    • 奖励计算 R t + 1 = − 1 R_{t+1} = -1 Rt+1=1

2.3 代码实现:环境如何返回 S t + 1 S_{t+1} St+1 R t + 1 R_{t+1} Rt+1

在实际的强化学习代码中,环境通常由一个类 Environment 维护,我们可以使用 OpenAI Gym 这样的框架来管理环境的状态转移。以下是一个简单的网格世界环境:

import numpy as np

class GridWorld:
    def __init__(self, grid_size=(4, 4), goal=(3, 3)):
        self.grid_size = grid_size
        self.goal = goal
        self.state = (0, 0)  # 初始位置 (x, y)
        self.actions = ["up", "down", "left", "right"]

    def step(self, action):
        """执行动作并返回 S_{t+1}, R_{t+1}"""
        x, y = self.state
        if action == "up":
            x = max(0, x - 1)
        elif action == "down":
            x = min(self.grid_size[0] - 1, x + 1)
        elif action == "left":
            y = max(0, y - 1)
        elif action == "right":
            y = min(self.grid_size[1] - 1, y + 1)

        self.state = (x, y)
        reward = 10 if self.state == self.goal else -1  # 目标点奖励 +10,其他 -1
        return self.state, reward  # 返回 S_{t+1}, R_{t+1}

    def reset(self):
        """重置环境"""
        self.state = (0, 0)
        return self.state
如何与环境交互?
env = GridWorld()
state = env.reset()  # 初始化环境
print("初始状态:", state)

next_state, reward = env.step("right")  # 执行 A_t = 右
print("下一状态:", next_state, "奖励:", reward)

next_state, reward = env.step("down")  # 执行 A_t = 下
print("下一状态:", next_state, "奖励:", reward)

输出示例:

初始状态: (0, 0)
下一状态: (0, 1) 奖励: -1
下一状态: (1, 1) 奖励: -1

这说明:

  • 状态转移 S t + 1 S_{t+1} St+1 是由环境规则 step() 函数确定的。
  • 奖励 R t + 1 R_{t+1} Rt+1 也是环境定义的,例如到达目标点奖励 +10,其他 -1。

2.4 什么时候需要环境模型?

有些强化学习算法(如动态规划)需要完整的环境模型

  • 完全可知环境(如国际象棋)→ 可以直接查询状态转移规则
  • 未知环境(如自动驾驶)→ 需要智能体通过采样学习环境模型(模型学习)

但在 强化学习(RL) 中,我们通常不需要明确知道状态转移规则,而是通过不断试错学习来估计最优策略。


2.5 结论

  1. 环境如何确定 S t + 1 S_{t+1} St+1 R t + 1 R_{t+1} Rt+1

    • 由环境的 状态转移概率 P ( S t + 1 ∣ S t , A t ) P(S_{t+1} \mid S_t, A_t) P(St+1St,At)奖励函数 R ( S t , A t , S t + 1 ) R(S_t, A_t, S_{t+1}) R(St,At,St+1) 决定。
  2. 强化学习中的环境是什么?

    • 强化学习环境可以是 网格世界、自动驾驶、金融市场等,不同环境有不同的状态转移规则。
  3. 如何在代码中实现环境?

    • 通过 step(action) 方法,根据 状态转移规则 计算下一个状态 S t + 1 S_{t+1} St+1,并返回奖励 R t + 1 R_{t+1} Rt+1

3. Sarsa 算法示例

(1)假设的环境

我们使用一个 网格世界(Grid World) 来展示 Sarsa 的学习过程。假设:

  • 代理(Agent)在 3×3 网格 中移动(上、下、左、右)
  • 目标是在尽可能少的步数内到达终点
  • 采取每个动作的奖励 R = − 1 R = -1 R=1(每走一步都消耗 1)
  • 到达目标位置(如 S G S_G SG)时,奖励 R = 10 R = 10 R=10,然后 episode 结束。

(2)Sarsa 计算过程

假设:

  • α = 0.1 \alpha = 0.1 α=0.1,学习率
  • γ = 0.9 \gamma = 0.9 γ=0.9,折扣因子
  • 代理从状态 S 1 S_1 S1 开始,随机选择动作 A 1 A_1 A1(向右)
第一步
  • 当前状态 S 1 S_1 S1
  • 选择动作 A 1 = 右 A_1 = \text{右} A1=
  • 执行 A 1 A_1 A1,环境返回:
    • 奖励 R 2 = − 1 R_2 = -1 R2=1
    • 新状态 S 2 S_2 S2
  • 选择 S 2 S_2 S2 中的动作 A 2 A_2 A2(假设是向下)
  • 计算 Q 值更新:
    Q ( S 1 , A 1 ) ← Q ( S 1 , A 1 ) + α ( R 2 + γ Q ( S 2 , A 2 ) − Q ( S 1 , A 1 ) ) Q(S_1, A_1) \leftarrow Q(S_1, A_1) + \alpha \left( R_2 + \gamma Q(S_2, A_2) - Q(S_1, A_1) \right) Q(S1,A1)Q(S1,A1)+α(R2+γQ(S2,A2)Q(S1,A1))
第二步
  • 代理执行 A 2 A_2 A2,到达 S 3 S_3 S3,获得奖励 R 3 = − 1 R_3 = -1 R3=1
  • 选择 S 3 S_3 S3 的动作 A 3 A_3 A3,继续更新 Q Q Q
最终到达终点
  • 当到达目标状态 S G S_G SG
    • 奖励 R = 10 R = 10 R=10
    • 终止 episode
    • 终止状态的 Q 值不再更新。

4. Sarsa 与 Q-learning 的对比

方法SarsaQ-learning
更新方式使用 当前策略 选择 A t + 1 A_{t+1} At+1使用 最大 Q 值 更新
公式 Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γQ(St+1,At+1)Q(St,At)) Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ max ⁡ a Q ( S t + 1 , a ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma \max_a Q(S_{t+1}, a) - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γmaxaQ(St+1,a)Q(St,At))
是否遵循策略,在 S t + 1 S_{t+1} St+1 选择 A t + 1 A_{t+1} At+1 来更新,使用贪心策略计算最优值
收敛性较稳定,但可能收敛到次优策略收敛更快,但可能过度乐观

5. 结论

  1. Sarsa 是一种基于时序差分(TD)方法的强化学习算法,通过五元组 ( S t , A t , R t + 1 , S t + 1 , A t + 1 ) (S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}) (St,At,Rt+1,St+1,At+1) 来更新 Q 值。
  2. Sarsa 遵循当前策略 进行更新,因此它是**on-policy(在线策略)**方法。
  3. Sarsa 和 Q-learning 的区别
    • Sarsa 更稳定,因为它遵循当前策略
    • Q-learning 更激进,因为它使用最大 Q 值来更新(off-policy)
  4. Sarsa 适用于安全性要求较高的任务,例如:自动驾驶、机器人控制。

分隔符

Sarsa算法由于每次更新值函数时需要知道当前的状态(state)、当前的动作(action)、奖励(reward)、下一步的状态(state)、下一步的动作(action)。如果还没有运动,下一步的状态(state)、下一步的动作(action)是如何知道的呢?

1. Sarsa 需要的五元组

Sarsa 需要以下 五个变量 来进行 Q 值更新:
( S t , A t , R t + 1 , S t + 1 , A t + 1 ) (S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}) (St,At,Rt+1,St+1,At+1)
其中:

  • S t S_t St:当前状态
  • A t A_t At:当前动作
  • R t + 1 R_{t+1} Rt+1:执行 A t A_t At 后,环境返回的奖励
  • S t + 1 S_{t+1} St+1:执行 A t A_t At 后,环境返回的新状态
  • A t + 1 A_{t+1} At+1:在 S t + 1 S_{t+1} St+1 处根据策略选择的动作

核心问题: 如果智能体还没有移动, S t + 1 S_{t+1} St+1 A t + 1 A_{t+1} At+1 是如何得到的呢?


2. Sarsa 运行流程:如何获取 S t + 1 S_{t+1} St+1 A t + 1 A_{t+1} At+1

(1)智能体初始化

  • 设定初始状态 S 0 S_0 S0
  • 使用ε-贪心策略选择一个初始动作 A 0 A_0 A0

(2)智能体执行 A t A_t At,与环境交互

  1. 执行当前动作 A t A_t At
    • A t A_t At 传递给环境
  2. 环境返回新的状态 S t + 1 S_{t+1} St+1 和奖励 R t + 1 R_{t+1} Rt+1
    • 由环境的 状态转移规则 计算 S t + 1 S_{t+1} St+1
    • 由环境的 奖励函数 计算 R t + 1 R_{t+1} Rt+1
  3. 在新状态 S t + 1 S_{t+1} St+1 选择新动作 A t + 1 A_{t+1} At+1
    • 使用ε-贪心策略 选择 A t + 1 A_{t+1} At+1
  4. 更新 Q 值
    Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γQ(St+1,At+1)Q(St,At))
  5. 继续下一个时间步
    • 设定 S t ← S t + 1 S_t \leftarrow S_{t+1} StSt+1
    • 设定 A t ← A t + 1 A_t \leftarrow A_{t+1} AtAt+1
    • 继续执行步骤 2-5,直到终止状态。

3. 具体示例

我们来看一个 网格世界(Grid World) 任务:

  • 初始位置: S 0 = ( 0 , 0 ) S_0 = (0,0) S0=(0,0)
  • 目标位置: S G = ( 2 , 2 ) S_G = (2,2) SG=(2,2)
  • 允许的动作:上(↑)、下(↓)、左(←)、右(→)
  • 奖励规则:
    • 移动一步: R = − 1 R = -1 R=1
    • 到达终点: R = 10 R = 10 R=10
    • 撞墙: R = − 1 R = -1 R=1, 状态不变

Sarsa 运行示例

假设智能体在网格 左上角,即:

  • 初始状态: S 0 = ( 0 , 0 ) S_0 = (0,0) S0=(0,0)
  • ε-贪心选择初始动作: A 0 = 右 A_0 = \text{右} A0=
第一步:执行 A 0 A_0 A0,获取 S 1 S_1 S1 R 1 R_1 R1
  • 执行动作: A 0 = 右 A_0 = \text{右} A0=
  • 环境返回:
    • 新状态: S 1 = ( 0 , 1 ) S_1 = (0,1) S1=(0,1)
    • 奖励: R 1 = − 1 R_1 = -1 R1=1
  • S 1 S_1 S1 选择新动作 A 1 A_1 A1(用 ε-贪心策略
    • 例如: 选择 A 1 = 下 A_1 = \text{下} A1=
  • 计算 Q 值更新:
    Q ( S 0 , A 0 ) ← Q ( S 0 , A 0 ) + α ( R 1 + γ Q ( S 1 , A 1 ) − Q ( S 0 , A 0 ) ) Q(S_0, A_0) \leftarrow Q(S_0, A_0) + \alpha \left( R_1 + \gamma Q(S_1, A_1) - Q(S_0, A_0) \right) Q(S0,A0)Q(S0,A0)+α(R1+γQ(S1,A1)Q(S0,A0))
第二步:执行 A 1 A_1 A1,获取 S 2 S_2 S2 R 2 R_2 R2
  • 执行 A 1 = 下 A_1 = \text{下} A1=
  • 环境返回:
    • 新状态: S 2 = ( 1 , 1 ) S_2 = (1,1) S2=(1,1)
    • 奖励: R 2 = − 1 R_2 = -1 R2=1
  • 选择 A 2 = 右 A_2 = \text{右} A2=
  • 计算:
    Q ( S 1 , A 1 ) ← Q ( S 1 , A 1 ) + α ( R 2 + γ Q ( S 2 , A 2 ) − Q ( S 1 , A 1 ) ) Q(S_1, A_1) \leftarrow Q(S_1, A_1) + \alpha \left( R_2 + \gamma Q(S_2, A_2) - Q(S_1, A_1) \right) Q(S1,A1)Q(S1,A1)+α(R2+γQ(S2,A2)Q(S1,A1))

4. 代码实现

在 Python 代码中,我们使用 环境(environment) 来管理状态转移:

import numpy as np

class GridWorld:
    def __init__(self, grid_size=(3,3), goal=(2,2)):
        self.grid_size = grid_size
        self.goal = goal
        self.state = (0, 0)
        self.actions = ["up", "down", "left", "right"]

    def step(self, action):
        """执行动作,返回 S_{t+1} 和 R_{t+1}"""
        x, y = self.state
        if action == "up":
            x = max(0, x - 1)
        elif action == "down":
            x = min(self.grid_size[0] - 1, x + 1)
        elif action == "left":
            y = max(0, y - 1)
        elif action == "right":
            y = min(self.grid_size[1] - 1, y + 1)

        self.state = (x, y)
        reward = 10 if self.state == self.goal else -1
        return self.state, reward

    def reset(self):
        """重置环境"""
        self.state = (0, 0)
        return self.state

def epsilon_greedy(Q, state, epsilon=0.1):
    """ε-贪心策略"""
    if np.random.rand() < epsilon:
        return np.random.choice(["up", "down", "left", "right"])
    else:
        return max(Q[state], key=Q[state].get)

# 初始化环境
env = GridWorld()
Q = { (i,j): { a: 0 for a in ["up", "down", "left", "right"] } for i in range(3) for j in range(3) }

# Sarsa 训练
alpha = 0.1
gamma = 0.9
epsilon = 0.1

state = env.reset()
action = epsilon_greedy(Q, state, epsilon)

for _ in range(100):
    next_state, reward = env.step(action)
    next_action = epsilon_greedy(Q, next_state, epsilon)

    Q[state][action] += alpha * (reward + gamma * Q[next_state][next_action] - Q[state][action])

    state, action = next_state, next_action

5. 总结

  1. Sarsa 不是在一开始就知道 S t + 1 S_{t+1} St+1 A t + 1 A_{t+1} At+1,而是在交互过程中获取的!

    • 先执行动作 A t A_t At 与环境交互
    • 通过环境 返回新的状态 S t + 1 S_{t+1} St+1 和奖励 R t + 1 R_{t+1} Rt+1
    • S t + 1 S_{t+1} St+1 选择新动作 A t + 1 A_{t+1} At+1
    • 进行 Q 值更新。
  2. 智能体需要环境的支持,环境定义了状态转移和奖励函数。

  3. ε-贪心策略 确保了在每个状态选择一个合理的动作,支持探索。


Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐