Sarsa模型和Q_learning模型简记
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值更新的公式:

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_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模型简记的更多相关文章
- 复杂领域的Cynefin模型和Stacey模型
最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...
- 文本信息检索——布尔模型和TF-IDF模型
文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...
- 贫血模型和DDD模型
贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...
- 并发编程:Actors 模型和 CSP 模型
https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27
- 三分钟掌控Actor模型和CSP模型
回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...
- Inception模型和Residual模型卷积操作的keras实现
Inception模型和Residual残差模型是卷积神经网络中对卷积升级的两个操作. 一. Inception模型(by google) 这个模型的trick是将大卷积核变成小卷积核,将多个卷积核 ...
- Actor模型和CSP模型的区别
引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...
- NLP中word2vec的CBOW模型和Skip-Gram模型
参考:tensorflow_manual_cn.pdf Page83 例子(数据集): the quick brown fox jumped over the lazy dog. (1)CBO ...
- 比较一下Linux下的Epoll模型和select模型的区别
一. select 模型(apache的常用) 1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Sel ...
- 利用生产者消费者模型和MQ模型写一个自己的日志系统-并发设计里一定会用到的手段
一:前言 写这个程序主要是用来理解生产者消费者模型,以及通过这个Demo来理解Redis的单线程取原子任务是怎么实现的和巩固一下并发相关的知识:这个虽然是个Demo,但是只要稍加改下Appender部 ...
随机推荐
- MarkDown --- 数学公式语法集
介绍 Markdown 是一种轻量级标记语言,它允许你使用易于阅读.易于编写的纯文本格式来创建富文本内容.通过简单的标记符号,如井号(#).星号(*)和下划线(_),可以快速地添加标题.粗体.斜体.链 ...
- cglib FastClass机制
前言 关于动态代理的一些知识,以及cglib与jdk动态代理的区别,在这一篇已经介绍过,不熟悉的可以先看下. 本篇我们来学习一下cglib的FastClass机制,这是cglib与jdk动态代理的一个 ...
- 主题 3 编辑器(Vim)
主题 3 编辑器(Vim) 编辑器 (Vim) · the missing semester of your cs education (missing-semester-cn.github.io) ...
- day03-功能实现03
功能实现03 9.功能08-分页显示 9.1需求分析 将查询的数据进行分页显示,要求功能如下: 显示共多少条记录 可以设置每页显示几条 点击第几页,显示对应的数据 9.2思路分析 后端使用MyBati ...
- python学习笔记(3):模块
模块 一个.py文件就是一个模块,模块可以包含在包(package)内.包内必须有一个__init**__**.py,包也可以多层嵌套.__init__.py也是一个模块,模块名就是包名. 当用命令行 ...
- Spring Boot自动运行之 CommandLineRunner、ApplicationRunner和@PostConstruct
在使用Spring Boot开发的工作中,我们经常会需要遇到一种功能需求,比如在服务启动时候,去加载一些配置,去请求一下其他服务的接口.Spring Boot给我们提供了三种常用的实现方法: 第一种是 ...
- 简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
前言 最近简单学了下Rust,以我这种菜鸟水平,没感受到什么安全.性能什么方面的优势,只觉得概念太多,编译各种报错.暂时也写不出来什么玩法,索性对比下各种学过的语言的性能.部分语言很早之前学过,很久不 ...
- Android 开发Day4
我们双击进入activity_main.xml 先将android.support.constraint.ConstraintLayout改为LinerLayout线性的,意思就是水平的的结构 并加入 ...
- Java SE 22 新增特性
Java SE 22 新增特性 作者:Grey 原文地址: 博客园:Java SE 22 新增特性 CSDN:Java SE 22 新增特性 源码 源仓库: Github:java_new_featu ...
- 测试监控系列:使用vb批量统计nmon结果
适用于一次统计几十台机器的nmon监控结果. 新建excel,在设置里打开开发者工具,点查看代码,把下面代码贴到模块里即可.最后把表格保存为.xlsm Sub for_nmon()'用来统计nmon结 ...