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. Mybatis中使用choose/when语句采坑记

    项目中写查询语句的时候,时常会使用到Mybatis中的choose/when语句,根据不同的条件执行不同的分支. 最近在使用这个语句的时候,出现问题导致这个语句不能正确执行,排查很久才解决这个问题,因 ...

  2. crypto-js DES加密 base64 post传输

    演示地址: http://pengchenggang.gitee.io/crypto-js-des/ 开源地址: https://gitee.com/pengchenggang/crypto-js-d ...

  3. Linux Socket 摘要(二)(基于TCP的C/S基本实现,相关基础知识,非阻塞select)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. 在winform中如何实现双向数据绑定?

    什么是双向数据绑定? 双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步.这意味着当模型数据发生变化时,UI会自动更新,反之亦然.这种双向数据绑定极大地简 ...

  5. (2)Python解释器的安装

    鉴于有同学在安装Python解释器出现了问题,这里再安装一下 step1,下载安装包,链接https://www.python.org/downloads/ 这里我安装的是3.6.4版本 我选择的是6 ...

  6. 前端开源项目UIRecorder录制脚本遇到的一些问题

    D:\nodejs\node_global>uirecorder init __ ______ ____ __ / / / / _/ / __ \___ _________ _________/ ...

  7. springboot 在 yaml 文件中读取 pom 文件的 properties

    如果没有其他配置,只能读取 yaml 文件所在模块下 和 父级模块的 pom 的 properties,以下是配置: <properties> <revision>1.0< ...

  8. 记录--巧用 overflow-scroll 实现丝滑轮播图

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言: 近期我在项目中就接到了一个完成轮播图组件的需求.最开始我也像大家一样,直接选择使用了知名的开源项目 "Swiper&qu ...

  9. 记录-js基础练习题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 隔行换色(%): window.onload = function() { var aLi = document.getElementsB ...

  10. 香港Azure/.NET俱乐部第一次聚会纪实 - WPF在金融业的商业价值

    香港Azure/.NET俱乐部第一次聚会于2019年12月29日在香港上环地铁站星巴克举行. 香港Azure/.NET俱乐部的定位是:以商业价值为导向. 基于这个定位,可以推导出如下准则: 面向大型企 ...