强化学习实践 | Sarsa 例子
参考:https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/tabular-sarsa2/
Q-Learning和Sarsa的区别
- epsilon-greedy使用时机不一样:Q-Learning用epsilon-Greedy选择当前时刻(s)的动作。Sarsa用epsilon-Greedy选择下一时刻(s’)的动作a’,并采用这个a’。
- 它们的Target不一样,Q-Learning采用下一个状态s’最大Q(s’,a’),但下一时刻采取的动作并不一定是使得Q(s’,a’)的动作。 [Off-Policy]
- 而Sarsa偏向实践(“说到做到”),因此使用的是Q(s’,a’)。[On-Policy]
实际上Sarsa在选a’的动作的时候还是有90%的概率选择Q值最大的动作a’,但是它是会做这个动作a’的。而Q-Learning只是利用Q(s’,a’)来估计s‘的价值函数,它不一定会到了s’就采取a’。
Sarsa 当前采取的动作是上一个时刻固定的即它知道它下一步会到达哪个state,它还有一个任务是为它接下来的state通过epsilon-greedy的方法选取一个动作。
Sarsa 伪代码
二维走迷宫的例子:
首先,鉴于Q-Learning和Sarsa都使用到了表格的方法。我们可以将它们统一到一个大的Class RL
中
class RL(object):
# action_space是list of index,即各个action的index
def __init__(self, action_space, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):
... # 和 QLearningTable 中的代码一样
# state是一个数字
def check_state_exist(self, state):
... # 和 QLearningTable 中的代码一样
# Epsilon Greedy
def choose_action(self, observation):
... # 和 QLearningTable 中的代码一样
def learn(self, *args):
pass # 每种的都有点不同, 所以用 pass
而Q-Learning和Sarsa具体的区别就在于Learn(更新q表的方式不同)。
具体代码:
import numpy as np
import pandas as pd
class MyRL(object):
# action_space是list of index,即各个action的index
def __init__(self, action_space, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):
self.actions = action_space
self.lr = learning_rate
self.gamma = reward_decay
self.epsilon = e_greedy
self.q_table = pd.DataFrame(columns=self.actions,dtype=np.float32)
... # 和 QLearningTable 中的代码一样
# state是一个数字
def check_state_exist(self, state):
if state not in self.q_table.index:
self.q_table = self.q_table.append(
pd.Series(
data=[0]*len(self.actions),
index