SARAS多步TD目标算法

SARAS多步TD目标算法

代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl
SARSA算法是on-policy 时序差分

在迭代的时候,我们基于 ϵ \epsilon ϵ-贪婪法在当前状态 S t S_t St 选择一个动作 A t A_t At ,然后会进入到下一个状态 S t + 1 S_{t+1} St+1 ,同时获得奖励 R t + 1 R_{t+1} Rt+1 ,在新的状态 S t + 1 S_{t+1} St+1 我们同样基于 ϵ \epsilon ϵ-贪婪法选择一个动作 A t + 1 A_{t+1} At+1 ,然后用它来更新我们的价值函数,更新公式如下:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ] Q\left(S_t, A_t\right) \leftarrow Q\left(S_t, A_t\right)+\alpha\left[R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right)-Q\left(S_t, A_t\right)\right] Q(St,At)Q(St,At)+α[Rt+1+γQ(St+1,At+1)Q(St,At)]

  • 注意: 这里我们选择的动作 A t + 1 A_{t+1} At+1 ,就是下一步要执行的动作,这点是和Q-Learning算法的最大不同
  • 这里的 TD Target: δ t = R t + 1 + γ Q ( S t + 1 , A t + 1 ) \delta_t=R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right) δt=Rt+1+γQ(St+1,At+1)
  • 在每一个非终止状态 S t S_t St
  • 进行一次更新,我们要获取 5 个数据, < S t , A t , R t + 1 , S t + 1 , A t + 1 > <S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}> <St,At,Rt+1,St+1,At+1>

那么n-step Sarsa如何计算

Q ( S t , A t ) ← Q ( S t , A t ) + α ( q t ( n ) − Q ( S t , A t ) ) Q\left(S_t, A_t\right) \leftarrow Q\left(S_t, A_t\right)+\alpha\left(q_t^{(n)}-Q\left(S_t, A_t\right)\right) Q(St,At)Q(St,At)+α(qt(n)Q(St,At))

其中 q ( n ) q_{(n)} q(n) 为:
q t ( n ) = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n Q ( S t + n , A t + n ) q_t^{(n)}=R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^{n-1} R_{t+n}+\gamma^n Q\left(S_{t+n}, A_{t+n}\right) qt(n)=Rt+1+γRt+2++γn1Rt+n+γnQ(St+n,At+n)

代码

  1. 构建环境
import gym


#定义环境
class MyWrapper(gym.Wrapper):

    def __init__(self):
        #is_slippery控制会不会滑
        env = gym.make('FrozenLake-v1',
                       render_mode='rgb_array',
                       is_slippery=False)

        super().__init__(env)
        self.env = env

    def reset(self):
        state, _ = self.env.reset()
        return state

    def step(self, action):
        state, reward, terminated, truncated, info = self.env.step(action)
        over = terminated or truncated

        #走一步扣一份,逼迫机器人尽快结束游戏
        if not over:
            reward = -1

        #掉坑扣100分
        if over and reward == 0:
            reward = -100

        return state, reward, over

    #打印游戏图像
    def show(self):
        from matplotlib import pyplot as plt
        plt.figure(figsize=(3, 3))
        plt.imshow(self.env.render())
        plt.show()


env = MyWrapper()

env.reset()

env.show()
  1. 构建Q表
import numpy as np

#初始化Q表,定义了每个状态下每个动作的价值
Q = np.zeros((16, 4))

Q
  1. 构建数据
from IPython import display
import random


#玩一局游戏并记录数据
def play(show=False):
    state = []
    action = []
    reward = []
    next_state = []
    over = []

    s = env.reset()
    o = False
    while not o:
        a = Q[s].argmax()
        if random.random() < 0.1:
            a = env.action_space.sample()

        ns, r, o = env.step(a)

        state.append(s)
        action.append(a)
        reward.append(r)
        next_state.append(ns)
        over.append(o)

        s = ns

        if show:
            display.clear_output(wait=True)
            env.show()

    return state, action, reward, next_state, over, sum(reward)


play()[-1]
  1. 训练
#训练
def train():
    #训练N局
    for epoch in range(50000):

        #玩一局游戏,得到数据
        state, action, reward, next_state, over, _ = play()
        for i in range(len(state)):
            #计算value
            value = Q[state[i], action[i]]

            #计算target
            #累加未来N步的reward,越远的折扣越大
            #这里是在使用蒙特卡洛方法估计target
            reward_s = 0
            for j in range(i, min(len(state), i + 5)):
                reward_s += reward[j] * 0.9**(j - i)

            #计算最后一步的value,这是target的一部分,按距离给折扣
            target = Q[next_state[j]].max() * 0.9**(j - i + 1)

            #如果最后一步已经结束,则不需要考虑状态价值
            #最后累加reward就是target
            target = target + reward_s

            #更新Q表
            Q[state[i], action[i]] += (target - value) * 0.05

        if epoch % 5000 == 0:
            test_result = sum([play()[-1] for _ in range(20)]) / 20
            print(epoch, test_result)


train()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147209.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mp4视频批量截取!!!

mp4视频批量截取&#xff01;&#xff01;&#xff01; 问题&#xff1a;如果我们想截取一个mp4视频中的多个片段&#xff0c;一个一个截会很麻烦&#xff01; 可以将想要截取的开始时间和结束时间保存到 excel表 中&#xff0c;进行批量截取。 1、对一个视频&#xff0c;记…

HarmonyOS元服务实现今天吃什么

一、前言 作为一个职业打工人&#xff0c;每天点外卖吃啥东西都有选择综合症&#xff0c;突发奇想让程序帮我们随机选择一个吃的&#xff0c;是不是可以解决我们的选择问题呢&#xff0c;说干就干&#xff0c;我们就使用HarmonyOS元服务实现一下这个功能。为什么选择这个Harmon…

java程序中为什么经常使用tomcat

该疑问的产生场景&#xff1a; 原来接触的ssm项目需要在项目配置中设置tomcat&#xff0c;至于为什么要设置tomcat不清楚&#xff0c;只了解需要配置tomcat后项目才能启动。接触的springboot在项目配置中不需要配置tomcat&#xff0c;原因是springboot框架内置了tomcat&#xf…

万界星空科技云MES生产管理系统和ERP的对接

万界星空云MES管理系统的应用比较广&#xff0c;在和ERP连接时&#xff0c;必须先掌握下什么模块是和MES业务流程有关的。在ERP诸多模块中&#xff0c;有MM(物料管理方法模块)、PP(生产计划模块)、QM(质量控制模块)模块和MES有同时的关联&#xff0c;因此&#xff0c;这种模块造…

spring cloud之网关

Gateway网关(*) 什么是网关 # 1.说明 - 网关统一服务入口&#xff0c;可方便实现对平台众多服务接口进行管控。 - 网关 路由转发 过滤器路由转发&#xff1a;接收一切外界请求&#xff0c;转发到后端的微服务上去过滤器&#xff1a;在服务网关中可以完成一系列的横切功能&a…

信号发生器为什么输出信号和配置参数对不上?

1.问题&#xff1a; 今天在调试时遇到信号发生器输出信号与我实际输入的参数不符的问题。 我原本打算输出一个中心点是2.5V然后上下偏移1.5V的信号。刚操作信号发生器的时候&#xff0c;调节到正弦波输出&#xff0c;参数部分&#xff0c;必须要输入High,Low电平。这个很不方…

Linux使用Docker完整安装Superset,同时解决please use superset_config.py to override it报错

文章目录 Docker安装Superset流程1. 首先获取镜像2. 生成SSL3. 创建Superset容器4. 更新数据库5. 测试访问Superset Docker安装Superset流程 1. 首先获取镜像 docker pull amancevice/superset2. 生成SSL 接下来我们运行一些额外的程序&#xff1a; openssl rand -base64 4…

龙讯旷腾PWmat:新的催化反应机理——瞬态相变,对多相电催化剂的设计和多相电催化机理的研究具有重要意义

研究背景 众所周知&#xff0c;材料的性质&#xff0c;包括催化活性都是相敏感的。而材料的相与外界条件有关&#xff0c;电催化反应过程中的外部条件与反应前后的外部条件不同&#xff0c;这自然导致了一个问题&#xff1a;在反应过程中电催化剂的相是否可以与反应前后的相不…

基于萤火虫算法优化概率神经网络PNN的分类预测 - 附代码

基于萤火虫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于萤火虫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于萤火虫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

demo(一)eureka----服务注册与提供

下面写一个简单的demo验证下eureka&#xff0c;实现服务注册、服务发现。 一、单节点&#xff1a; 1、api&#xff1a; 封装其他组件需要共用的dto 2、eureka-service服务注册中心&#xff1a; &#xff08;1&#xff09;pom: <?xml version"1.0" encoding&q…

Anaconda当前有几个python环境,Anaconda常用命令

通过下面的命令即可知道当前的conda拥有几个python版本环境。 conda env list常用命令 python版本 python --version or python --V当前conda可以使用那些python版本 conda search "^python$"创建一个新的python版本环境&#xff0c;例如python版本是3.8.3 cond…

问题 G: Girls and Boys(最大独立集)

由于未知编号对应性别&#xff0c;故进行两次作图 详细看下图&#xff0c; 该图为转载&#xff1a; AC代码&#xff08;较转载代码修改过&#xff0c;源代码无法AC&#xff09;&#xff1a; #include<iostream> #include<string.h> using namespace std; #define …

外包能做多久?这才是掩藏在虚假繁荣后的真实

讲一下我的故事和想法&#xff0c;你们自己寻思一下 我25岁&#xff0c;中级测试&#xff0c;外包&#xff0c;薪资13.5k&#xff0c;人在上海。 内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。 假设以我为界限…

19 - 如何用协程来优化多线程业务?

近几年&#xff0c;国内很多互联网公司开始使用或转型 Go 语言&#xff0c;其中一个很重要的原因就是 Go 语言优越的性能表现&#xff0c;而这个优势与 Go 实现的轻量级线程 Goroutines&#xff08;协程 Coroutine&#xff09;不无关系。那么 Go 协程的实现与 Java 线程的实现有…

C语言入门——第15节课

目录 一、优化编写的strcmp函数 二、结构体对齐 三、memset函数 1.memset函数的使用 2.编写memset函数 四、memcpy函数 1.memcpy函数的使用 2.编写memcpy函数 五、函数 1.函数的编译链接和内存布局 2.可见性 ①块作用域 ②全局作用域 ③作用域解析符:: 3.生存期 …

springboot整合minio步骤

springboot整合minio步骤 springboot整合minio十分的简单&#xff0c;接下来使用springboot整合一下minio。 一、导入依赖 首先需要导入minio的依赖。 <!--maven引入minio排除okhttp依赖并添加高版本的okhttp依赖--><dependency><groupId>io.minio</g…

Git新建分支

修改代码之Git策略思考&#xff1a; 有三种办法&#xff1a; 需要在主分支上新建一个分支&#xff0c;不合并新建版本。其实也是先新建一个分支&#xff0c;然后合并到主分支&#xff0c;再删除分支。直接新建远程仓库。 考虑&#xff0c;3&#xff09;最浪费&#xff0c;其…

聚势启新,KaiwuDB 生态联盟沙龙首站落地长春

11月9日&#xff0c;由 KaiwuDB 联合和润集团、致远互联主办的“KaiwuDB 生态联盟沙龙”首站活动在吉林长春顺利举办。沙龙以“聚势&#xff0c;启新”为主题&#xff0c;邀请基础软硬件、应用软件、信息安全等产业链上下游伙伴企业到场&#xff0c;共同就产业数智化趋势下的新…

Nginx 是如何解决惊群效应的?

什么是惊群效应&#xff1f; 第一次听到的这个名词的时候觉得很是有趣&#xff0c;不知道是个什么意思&#xff0c;总觉得又是奇怪的中文翻译导致的。 复杂的说&#xff08;来源于网络&#xff09;TLDR; 惊群效应&#xff08;thundering herd&#xff09;是指多进程&#xff…

红黑树的概念和简单实现

目录 红黑树的概念红黑树的结构红黑树的插入红黑树的验证 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑…