强化学习中SARSA(State-Action-Reward-State-Action)和Q-learning的区别

SARSA(State-Action-Reward-State-Action)和Q-learning是两种经典的强化学习算法,它们都用于学习最优策略以使智能体在一个环境中获得最大的累积奖励。它们之间的主要区别在于它们更新动作值函数(Q值函数)的方式以及其适用的情况。

  1. 更新方式:
  • SARSA: 在SARSA算法中,Q值函数的更新是基于当前状态下采取的动作、接下来的状态、以及接下来采取的动作所获得的奖励。具体来说,SARSA使用的更新规则是:
    [ Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma Q(s', a') - Q(s, a) \right] ]
    其中, s s s是当前状态, a a a 是当前采取的动作, r r r 是在采取动作 a a a 后获得的奖励, s ′ s' s是接下来的状态, a ′ a' a 是在状态 s ′ s' s 下采取的下一个动作, α \alpha α 是学习率, γ \gamma γ是折扣因子。
  • Q-learning: 在Q-learning算法中,Q值函数的更新是基于当前状态下采取的动作后可能获得的最大Q值。具体来说,Q-learning使用的更新规则是:
    在这里插入图片描述
    其中, s s s 是当前状态, a a a 是当前采取的动作, r r r 是在采取动作 a a a 后获得的奖励, s ′ s' s是接下来的状态, α \alpha α是学习率, γ \gamma γ 是折扣因子。
  1. 适用情况:
  • SARSA: SARSA是一个在线学习算法,它适用于需要连续地与环境进行交互的情况。由于它的更新是基于当前状态下采取的动作,因此它适用于实时决策的场景,比如机器人导航。
  • Q-learning: Q-learning是一个离线学习算法,它适用于静态环境或者可以进行模拟的环境。由于它的更新是基于最大Q值的,因此它适用于离线学习和批处理更新的情况,比如从历史经验中学习。

总的来说,SARSA和Q-learning都是强化学习算法的经典代表,它们在更新方式和适用情况上有所不同,选择哪种算法取决于具体的问题和应用场景。

  1. 同策略与异策略:

SARSA 和 Q-learning 在更新策略时的一个重要区别在于它们是同策略(on-policy)和异策略(off-policy)学习算法。

1- SARSA是一个同策略学习算法:

  • 在SARSA算法中,智能体使用的策略用于选择动作(即当前策略),同时也用于评估和更新动作值函数。具体来说,SARSA算法使用的是ε-贪婪策略或者柔性策略,以平衡探索和利用。

  • 因为SARSA在更新Q值时使用的是当前策略选择的动作,所以它是一个同策略学习算法。

2- Q-learning是一个异策略学习算法:

  • 在Q-learning算法中,智能体使用的策略用于选择动作(即当前策略),但在更新动作值函数时,它采用的是在状态 s s s下采取动作 a a a 后可能获得的最大Q值(即采取最大化动作值的动作),而不是采用当前策略选择的动作所导致的Q值。
  • 因为Q-learning在更新Q值时使用的不是当前策略选择的动作,而是采取最大化动作值的动作,所以它是一个异策略学习算法。

异策略学习算法具有更广泛的适用性,因为它们可以从旧策略中学习,而不受新策略的影响。这使得Q-learning算法在某些情况下更加有效,尤其是当我们希望探索更多的动作空间时。但是,它们也更容易受到估计误差的影响,因为更新的目标是基于另一个策略的。与之相反,同策略学习算法更稳定,但可能会受到探索和利用之间的权衡的限制。

注:本文由chatgpt辅助撰写

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多智能体强化学习 (Multi-agent Reinforcement Learning, MARL) 是指一个由多个个体组成的环境,每个个体都有自己的决策空间,目标是通过与环境的交互,获取最大的累积奖励。MARL 的特点是不同个体之间相互影响,一个个体的决策将会影响其他个体的决策,因此 MARL 的复杂度比单智能体强化学习要高。其主要应用于博弈论、自动驾驶、机器人、智能交通等领域。 基于Sarsa的多智能体强化学习算法可以通过如下步骤实现: 1. 初始化每个智能体的策略,价值函数以及环境模型。 2. 每个智能体与环境交互进行学习,按照如下步骤进行: a. 根据当前状态,每个智能体选择一个行为。这里使用 $\epsilon$-贪心策略,即以一定概率随机选择行为,以一定概率选择当前最优行为。 b. 执行行为,更新环境状态。 c. 获取奖励,用于更新价值函数。 d. 根据新状态和价值函数更新智能体的策略。这里使用Sarsastate-action-reward-state-action)算法,即使用当前策略选择一个行为,然后观察下一个状态及奖励,利用下一个状态和奖励更新当前价值函数,再根据新的价值函数更新策略。 e. 将状态更新为新状态,继续执行下一个动作。 3. 迭代多次执行以上步骤,直到收敛。 下面是基于Sarsa的多智能体强化学习的Python代码: ```python import numpy as np import random #定义环境 class Gridworld: def __init__(self, size): self.size = size self.state = np.zeros(2, dtype=np.int32) self.actions = np.array([[0,1],[0,-1],[1,0],[-1,0]]) self.rewards = np.array([[0,-10],[-10,0],[0,-10],[0,-10]]) #判断当前状态是否终止状态 def is_terminal(self, state): if ((state == [0,0]).all() or (state == [self.size-1,self.size-1]).all()): return True else: return False #获取当前状态的所有可选行为 def get_actions(self): return self.actions #更新状态 def update_state(self, action): new_state = self.state + action if new_state[0] < 0 or new_state[0] >= self.size or new_state[1] < 0 or new_state[1] >= self.size: return False else: self.state = new_state return True #获取当前状态的奖励 def get_reward(self): return self.rewards[np.where(np.all(self.actions == self.action, axis=1))[0][0]] #定义智能体 class Agent: def __init__(self, id, grid): self.id = id self.grid = grid self.q_table = np.zeros((grid.size, grid.size, 4)) #价值函数 self.epsilion = 0.1 #探索概率 self.alpha = 0.5 #学习率 self.gamma = 0.9 #衰减系数 #根据当前状态选择一个行为 def choose_action(self, state): if random.uniform(0,1) < self.epsilion: action = random.choice(self.grid.get_actions()) else: action = self.greedy_policy(state) return action #根据epsilon-greedy策略选择一个行为 def greedy_policy(self, state): values = self.q_table[state[0], state[1], :] max_value = np.max(values) actions = self.grid.get_actions() candidate_actions = [a for a in actions if values[np.where(np.all(self.grid.actions == a, axis=1))[0][0]] == max_value] return random.choice(candidate_actions) #执行一个周期,包括选择行为、执行行为、更新价值函数和策略 def run_cycle(self, state): self.action = self.choose_action(state) self.grid.update_state(self.action) reward = self.grid.get_reward() next_state = self.grid.state next_action = self.choose_action(next_state) value = self.q_table[state[0], state[1], np.where(np.all(self.grid.actions == self.action, axis=1))[0][0]] next_value = self.q_table[next_state[0], next_state[1], np.where(np.all(self.grid.actions == next_action, axis=1))[0][0]] td_error = reward + self.gamma * next_value - value self.q_table[state[0], state[1], np.where(np.all(self.grid.actions == self.action, axis=1))[0][0]] += self.alpha * td_error self.epsilion *= 0.99 #探索概率指数衰减 #执行多个周期 def run_cycles(self, num_cycles): for i in range(num_cycles): if self.grid.is_terminal(self.grid.state): self.grid.state = np.zeros(2, dtype=np.int32) state = self.grid.state self.run_cycle(state) #定义多智能体 class MultiAgent: def __init__(self, num_agents, grid): self.grid = grid self.agents = [Agent(i, grid) for i in range(num_agents)] #执行一个周期,让每个智能体分别执行一个周期 def run_cycle(self): for agent in self.agents: if self.grid.is_terminal(self.grid.state): self.grid.state = np.zeros(2, dtype=np.int32) state = self.grid.state agent.run_cycle(state) #执行多个周期 def run_cycles(self, num_cycles): for i in range(num_cycles): self.run_cycle() #设定环境大小和智能体数量 size = 4 num_agents = 2 #初始化环境和多智能体 grid = Gridworld(size) multi_agent = MultiAgent(num_agents, grid) #执行多个周期 multi_agent.run_cycles(1000) #输出每个智能体的价值函数 for agent in multi_agent.agents: print('agent', agent.id) print(agent.q_table) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艽野尘梦better

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值