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_n
self.lr=learning_rate
self.gamme=gamma
self.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 action def 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 = reward
else:
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 = reward
else:
target_Q = reward + self.gamma*np.max(self.Q[next_state,:])
# 当前状态下Q值更新,时序差分,不懂时序差分的可以百度了解一下
self.Q[state,action]+=self.lr*(target_Q-predict_Q)

Sarsa模型和Q_learning模型简记的更多相关文章

  1. 复杂领域的Cynefin模型和Stacey模型

    最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...

  2. 文本信息检索——布尔模型和TF-IDF模型

    文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 ​ 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...

  3. 贫血模型和DDD模型

    贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...

  4. 并发编程:Actors 模型和 CSP 模型

    https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27    

  5. 三分钟掌控Actor模型和CSP模型

    回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...

  6. Inception模型和Residual模型卷积操作的keras实现

    Inception模型和Residual残差模型是卷积神经网络中对卷积升级的两个操作. 一.  Inception模型(by google) 这个模型的trick是将大卷积核变成小卷积核,将多个卷积核 ...

  7. Actor模型和CSP模型的区别

    引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...

  8. NLP中word2vec的CBOW模型和Skip-Gram模型

    参考:tensorflow_manual_cn.pdf     Page83 例子(数据集): the quick brown fox jumped over the lazy dog. (1)CBO ...

  9. 比较一下Linux下的Epoll模型和select模型的区别

    一. select 模型(apache的常用) 1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Sel ...

  10. 利用生产者消费者模型和MQ模型写一个自己的日志系统-并发设计里一定会用到的手段

    一:前言 写这个程序主要是用来理解生产者消费者模型,以及通过这个Demo来理解Redis的单线程取原子任务是怎么实现的和巩固一下并发相关的知识:这个虽然是个Demo,但是只要稍加改下Appender部 ...

随机推荐

  1. Github无法读取远程仓库

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ Git无法访问 今早起来访问Github炸了,Git不能用了,提示: ...

  2. 浅谈Zabbix与Prometheus区别

    Zabbix和Prometheus都是非常流行的监控系统.它们有许多相似之处,但也有一些不同之处.以下是Zabbix和Prometheus监控对比的一些关键点: 1.数据模型和查询语言 Prometh ...

  3. npm 添加 淘宝代理

    npm config set registry https://registry.npm.taobao.org

  4. Github下载release附件变相提速方法

    最近找到了个油猴插件,下载2M/s,推荐大家使用Github 镜像访问,加速下载 描述 github上面有许多开源的软件,作者们都打包发布为release版本,我们可以下载打包好的软件,但是,由于国内 ...

  5. JSF之常用注解

    @ManagedBean 以托管 bean 的形式注册一个类实例,然后将其放入到使用其中一个 @...Scoped 注释指定的范围内.如果没有指定任何范围,JSF 将把此 bean 放入请求范围,如果 ...

  6. 自定义Key类型的字典无法序列化的N种解决方案

    当我们使用System.Text.Json.JsonSerializer对一个字典对象进行序列化的时候,默认情况下字典的Key不能是一个自定义的类型,本文介绍几种解决方案. 一.问题重现 二.自定义J ...

  7. [Spring]aop的配置与使用

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129907717 出自[进步* ...

  8. KingbaseES V8R6集群部署案例之---openEuler系统脚本部署故障

    案例说明: 在openEuler系统下通过脚本方式部署KingbaseES V8R6集群,脚本执行过程中,加载vip失败.本次故障问题,主要是因为openEuler系统shell和脚本的不兼容引起. ...

  9. KingbaseES 数据插入更新操作

    数据库使用过程中,经常会遇到一种场景:业务系统对数据进行dml操作,当数据库中数据不存在时,将数据做为新记录插入到表中,当数据库中数据存在时,对现有数据进行更新操作. 下面介绍KingbaseES中对 ...

  10. C++ future

    promise 空模板 非 void 特化,用于在线程间交流对象 void 特化,用于交流无状态事件 类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象 ...