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部 ...
随机推荐
- 我的闲鱼Python爬虫接单总结和经验,最高600元一单
最近,我在闲鱼上利用 Python 爬虫技术接了一些任务,想必你一定好奇,通过这样的方式,到底能不能挣钱,能挣多少钱?今天我就来分享一下我的经验和总结. 一.接单经历 之前 Vue 的作者尤大在微博上 ...
- Java面向对象(下)--static/final/代码块/抽象/接口/内部类
目录 1 关键字:static 2 理解main方法的语法 3 类的成员之四:代码块 4关键字:final 5 抽象类与抽象方法 6 接口(interface) 7 类的成员之五:内部类 static ...
- 技能get-ps抠颜色一样的图
公司要插个小图片,从网上down下来的图片是不过是jpg的,背景不透明,这时候可以使用ps工具把这种同一颜色的内容扣下来. 操作步骤: 选择-色彩范围,然后用取样器取颜色,再调节拉条选取颜色范围,最后 ...
- struts1之global-forwards
当你的某个转发要经常用,并且要携带某些数据(request)的时候用全局转发,也就是global-forwards,例如我们在分页的时候,或者得到数据列表的时候.. ForwardAction呢,是为 ...
- 【C语言复习笔记】一些要点
[C语言复习笔记]一些要点 按学校教材复习的,整理的是我不熟悉的地方 最近C用的好少,快忘完了就赶紧整理一下(Python真好玩) 第一章 初识C语言 存储器 内存容量的大小,取决于地址总线的数量 \ ...
- 基于C#的自动校时器 - 开源研究系列文章
上次在公司的Windows7电脑上操作系统没有自动进行校时,导致系统时间老是快那么几分钟,于是想到了用C#开发一个系统时间自动校时器.这个应用不难,主要是能够校时那个操作类的问题. 1. 项目目录: ...
- 从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别
list和vector是STL(标准模板库)中常用的两种序列容器,它们各自在不同类型的操作上有着不同的优势.下面是list和vector在不同操作上的擅长之处: list的擅长操作 插入和删除操作:l ...
- 记录--get请求参数放在body中?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.背景 与后端对接口时,看到有一个get请求的接口,它的参数是放在body中的 ******get请求参数可以放在body中?? 随即问 ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第9章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录
- C# 日志监控软件 基于 FileSystemWatcher 02
基于上一篇<C# 日志监控软件 基于 FileSystemWatcher>改进 using System; using System.Collections.Generic; using ...