Sarsa模型和Q

编程入门 行业动态 更新时间:2024-10-28 20:28:03

Sarsa<a href=https://www.elefans.com/category/jswz/34/1771358.html style=模型和Q"/>

Sarsa模型和Q

1. Sarsa模型

1.1 Sarsa类代码:
class SarsaAgent(object):def __init__(self,state_n,action_n,learning_rate=0.01,gamma=0.9,e_greed=0.1):""":param state_n:状态总数:param action_n:动作总数:param learning_rate:学习速率:param gamma:奖励衰减率:param e_greed:随机选择动作的概率,智能体有0.1的概率,在当前状态下随机选择动作action"""self.act_n=action_nself.lr=learning_rateself.gamme=gammaself.epsilon=e_greed# 建立Q表,一共有state_n行,acton_n列self.Q = np.zeros((state_n,action_n))
1.2 sample函数:
# 根据观察值,输出动作值def sample(self,state):# 如果讲武德,按照常理,应该从Q表中根据当前state选择action值比较大的if np.random.uniform(0,1)<(1-self.epsilon):action = self.predict(state)# 但也有0.1的概率,随机从action表中选取一个else:action = np.random.choice(self.act_n)return actiondef predict(self,obs):Q_list = self.Q[obs,]maxQ=np.max(Q_list) # 取Q表中当前状态下的最大action值action_list=np.where(Q_list==maxQ)[0]   # 然后把所有与最大action值相同的action变量,都取出来action = np.random.choice(action_list)  # 随机从这些action变量里取一个return action

Q值更新的公式:

\[\begin{align} Target=G_t & =R_{t+1}+\gamma R_{t+2}+\gamma^2R_{t+3}+{\ldots} =\sum_{k=0}^n\gamma^kR_{t+k+1} \\ G_t & =R_{t+1}+\gamma R_{t+2}+\gamma^2R_{t+3}+{\ldots} \\ & = R_{t+1}+\gamma (R_{t+2}+\gamma R_{t+3}+{\ldots}) \\ & = R_{t+1}+\gamma G_{t+1} \end{align} \]

'Sarsa模型':用下一个状态的Q值,来更新当前状态的Q值,也就是用G(t+1)来更新G(t)。在状态St下,需要知道的有At(当前状态下选择的动作),Rt(当前状态下选择动作后的回报),S(t+1)(下一个状态),A(t+1)(下一个状态选择的动作),然后根据这个五元组(St,At,Rt,S(t+1),A(t+1))来更新当前状态下的Q值。并且到了S(t+1)后一定会执行A(t+1)

1.3 Q值更新函数
def sarsa_learn(self,state,action,reward,next_state,next_action,done):""":param self::param state:当前状态:param action: 当前状态下选择的动作:param reward: 当前状态下选择动作的回报:param next_state: 选择动作后的下一个状态:param next_action: 下一个状态下选择的动作:param done: 是否到达目的地,到达目的地后就奖励reward:return:"""#  predict_Q :预测值,也就是当前状态下,选择动作后的回报#  target_Q : 目标值,predict_Q = self.Q[state,action]if done:target_Q = rewardelse:target_Q = reward + self.gamma*self.Q[next_state,next_action]# 当前状态下Q值更新,时序差分,不懂时序差分的可以百度了解一下self.Q[state,action]+=self.lr*(target_Q-predict_Q)

2. Q_learning模型

Q值更新的公式:

\[Q(S_t,A_t)=Q(S_t,A_t)+\alpha[R_{t+1}+\gamma{max_a}{Q}(S_{t+1},a)-Q(S_t,A_t)] \]

Q_learning模型:不需要知道下一个状态选择的是那个动作,根据下一个状态S(t+1),求得Q值最大的action,然后利用最大的action来更新当前状态St的Q值,也就是会默认用下一个状态的Q值最大的动作来更新当前状态Q值。但是到了状态S(t+1)后,不一定执行动作action,因为还会有一个随机的概率来随机选择动作

Q_learning 的代码除更新的公式那里不一样,其余基本都一样,Sarsa需要计算下一个状态下的action,Q_learning需要计算下一个状态下的最大的Q值(不管是那个动作)。

2.1 Q值更新函数如下:
def sarsa_learn(self,state,action,reward,next_state,next_action,done):""":param self::param state:当前状态:param action: 当前状态下选择的动作:param reward: 当前状态下选择动作的回报:param next_state: 选择动作后的下一个状态:param next_action: 下一个状态下选择的动作:param done: 是否到达目的地,到达目的地后就奖励reward:return:"""#  predict_Q :预测值,也就是当前状态下,选择动作后的回报#  target_Q : 目标值,predict_Q = self.Q[state,action]if done:target_Q = rewardelse:target_Q = reward + self.gamma*np.max(self.Q[next_state,:])# 当前状态下Q值更新,时序差分,不懂时序差分的可以百度了解一下self.Q[state,action]+=self.lr*(target_Q-predict_Q)

更多推荐

Sarsa模型和Q

本文发布于:2024-02-11 17:42:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682375.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模型   Sarsa

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!