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部 ...
随机推荐
- gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐
gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐 https://gyroflow.xyz/ https://github.com/gyroflow/gyro ...
- IIS 修改配置 进行性能优化
1.修改线程池队列长度和启动模式 2.修改线程池最大工作进程数 --设置为0 目的是根据服务器核数 匹配最佳线程数 3.站点高级设置开启预加载
- pandas DataFrame内存优化技巧:让数据处理更高效
Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力.灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱. 然而,随着数据量的不断增长,如何高效.合理 ...
- 回顾redis底层数据结构
参考,欢迎点击原文:https://blog.csdn.net/qq_38286618/article/details/102530020 https://www.cnblogs.com/jaycek ...
- AOSP编译成功后关闭终端emulator命令找不到
当我们编译好AOSP系统源码后,可以通过emulator命令打开模拟器,但是当我们关闭终端后,在次打开终端输入emulator命令,提示未找到命令: 此时我们需要重新执行下面语句 source bui ...
- 大年学习linux(第三节---用户管理)
三.用户管理 用户和用户组操作命令 ld Finger Pwck 检查/etc/passwd配置文件内的信息与实际主文件夹是否存在,还可比较/etc/passwd和/etc/shadow的信息是否一致 ...
- 使用JMeter从JSON响应的URL参数中提取特定值
在使用Apache JMeter进行API测试时,我们经常需要从JSON格式的响应中提取特定字段的值.这可以通过使用JMeter内置的JSON提取器和正则表达式提取器来完成.以下是一个具体的例子,展示 ...
- 【IOT安全】ASA5520基本知识和配置
本文主要介绍ASA5520防火墙的基本知识和配置 环境搭建 Linux eveng 5.17.8-eve-ng-uksm-wg+ #1 SMP PREEMPT Mon May 16 10:08:59 ...
- CDN 引入 axios 和 qs 及其使用方法
一些小项目,没必要搭建脚手架,直接以CDN的方式引入 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...
- KingbaseES 垃圾回收原理以及如何预防膨胀更新
背景 KingbaseESV8R6支持snapshot too old 那么实际工作中,经常看到表又膨胀了,那么我们讨论一下导致对象膨胀的常见原因有哪些呢? 未开启autovacuum,对于未开启au ...