# SARSA算法
# 基本概念
SARSA(State-Action-Reward-State-Action)是一种在线策略(On-Policy)的强化学习算法。与Q-Learning不同,SARSA在学习过程中使用实际执行的动作来更新Q值,这使得它更加保守和安全。
# 数学原理
# 1. 算法名称由来
SARSA名称来源于算法使用的五元组:
- (当前状态)
- (当前动作)
- (即时奖励)
- (下一状态)
- (下一动作)
# 2. 值函数定义
SARSA的状态-动作值函数定义:
其中:
- 是状态-动作值函数
- 是折扣因子(0到1之间)
- 是在时间t获得的奖励
# 3. 更新规则
SARSA的更新公式:
其中:
- 是学习率(0到1之间)
- 是即时奖励
- 是下一个状态-动作对的Q值
# 4. 策略选择
通常使用ε-贪心策略:
# 算法步骤
初始化
- 创建Q表并初始化
- 设定超参数:学习率α、折扣因子γ、探索率ε
对每个回合:
- 初始化状态s
- 使用策略选择动作a
- 重复直到达到终止状态:
- 执行动作a,观察r和s'
- 使用相同策略选择a'
- 更新Q值
- s ← s',a ← a'
import numpy as np
class SARSA:
def __init__(self, n_states, n_actions, alpha=0.1, gamma=0.9, epsilon=0.1):
self.q_table = np.zeros((n_states, n_actions))
self.alpha = alpha # 学习率
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
def choose_action(self, state):
if np.random.random() > self.epsilon:
return np.argmax(self.q_table[state])
return np.random.randint(self.q_table.shape[1])
def learn(self, state, action, reward, next_state, next_action):
old_value = self.q_table[state, action]
next_value = self.q_table[next_state, next_action]
# SARSA更新公式
new_value = (1 - self.alpha) * old_value + \
self.alpha * (reward + self.gamma * next_value)
self.q_table[state, action] = new_value
# 优势特点
# 1. 在线学习
- 使用实际执行的动作更新
- 更符合实际交互场景
- 策略评估更准确
# 2. 安全性
- 考虑实际执行策略
- 避免危险状态
- 更适合真实环境
# 3. 稳定性
- 更新更加平滑
- 波动相对较小
- 训练更加稳定
# 应用场景
机器人导航
- 避障导航
- 路径规划
- 安全探索
游戏AI
- 赛车游戏
- 迷宫探索
- 生存游戏
工业控制
- 过程控制
- 设备调度
- 能源管理
金融交易
- 风险控制
- 投资组合
- 交易策略
# 优缺点
# 优点
- 更安全保守
- 更适合实际场景
- 训练更加稳定
- 考虑动作连续性
# 缺点
- 收敛速度较慢
- 性能可能次优
- 对探索策略敏感
- 需要更多样本
# 实践建议
# 1. 参数设置
- 适当降低学习率
- 根据任务调整γ
- 动态调整ε
# 2. 环境设计
- 合理设置奖励
- 避免稀疏奖励
- 考虑安全约束
# 3. 探索策略
- 使用软性探索
- 渐进式探索
- 引导式探索
# 4. 改进方向
- 经验回放
- 优先级采样
- 多步SARSA
# 进阶优化
Expected SARSA
- 考虑期望更新
- 降低方差
- 提高稳定性
n步SARSA
- 使用多步回报
- 加速价值传播
- 平衡偏差方差
SARSA(λ)
- 引入资格迹
- 加速学习
- 提高效率
Safe SARSA
- 约束探索
- 保证安全性
- 风险控制
← Q-Learning算法 DQN算法 →