[PyTorch][chapter 61][强化学习-免模型学习1]

前言:

      在现实的学习任务中,环境 E=<X,A,P,R>

    其中的转移概率P,奖赏函数R 是未知的,或者状态X也是未知的

    称为免模型学习(model-free learning)

目录:

     1:  蒙特卡洛强化学习

     2:同策略-蒙特卡洛强化学习

     3: 异策略- 蒙特卡洛强化学习


一  蒙特卡洛强化学习

   

   在免模型学习的情况下,策略迭代算法会遇到两个问题:

  1:  是策略无法评估
            因为无法做全概率展开。此时 只能通过在环境中执行相应的动作观察得到的奖赏和转移的状态、
       
       解决方案:一种直接的策略评估代替方法就是“采样”,然后求平均累积奖赏,作为期望累积奖赏的近似,这称为“蒙特卡罗强化学习”。

  2:  策略迭代算法估计的是 状态值函数(state value function) V,而最终的策略是通过 状态        动作值函数(state-action value function) Q 来获得。
        模型已知时,有很简单的从 V 到 Q 的转换方法,而模型未知 则会出现困难。
       
       解决方案:所以我们将估计对象从 V 转为 Q,即:估计每一对 “状态-动作”的值函数。

     模型未知的情况下,我们从起始状态出发,使用某种策略进行采样,执行该策略T步,

并获得轨迹 < x_0,a_0,r_1,a_1,r_2,...x_{T-1},a_{T-1},r_T,x_T>,

 然后 对轨迹中出现的每一对 状态-动作,记录其后的奖赏之和,作为 状态-动作 对的一次

累积奖赏采样值. 多次采样得到多条轨迹后,将每个状态-动作对的累积奖赏采样值进行平均。即得到 状态-动作值函数的估计.


二  同策略蒙特卡洛强化学习

  

    要获得好的V值函数估计,就需要不同的采样轨迹。 

   我们将确定性的策略\pi 称为原始策略

  原始策略上使用 \epsilon-贪心法的策略记为\pi^{\epsilon }(x)=

   以概率1-\epsilon 选择策略1:           策略1 :\pi(x)

   以概率\epsilon    选择策略2:        策略2:均匀概率选取动作,

对于最大化值函数的原始策略

\pi= argmax_{a}Q(x,a)

其中\epsilon-贪心策略\pi^{\epsilon }中:

当前最优动作被选中的概率   1-\epsilon +\frac{\epsilon }{|A|}

 每个非最优动作选中的概率 \frac{\epsilon }{|A|},多次采样后将产生不同的采样轨迹。

因此对于最大值函数的原始策略\pi^{'},同样有

算法中,每采样一条轨迹,就根据该轨迹涉及的所有"状态-动作"对值函数进行更新

同策略蒙特卡罗强化学习算法最终产生的是E-贪心策略。然而,引入E-贪心策略是为了便于策略评估,而不是最终使用


三  同策略蒙特卡洛算法 Python

# -*- coding: utf-8 -*-
"""
Created on Fri Nov  3 09:37:32 2023

@author: chengxf2
"""

# -*- coding: utf-8 -*-
"""
Created on Thu Nov  2 19:38:39 2023

@author: cxf
"""

import random
from enum import Enum

class State(Enum):
    '''状态空间X'''
    shortWater =1 #缺水
    health = 2   #健康
    overflow = 3 #溢水
    apoptosis = 4 #凋亡

class Action(Enum):
    '''动作空间A'''
    water = 1 #浇水
    noWater = 2 #不浇水
    
class Env():
    
    def reward(self, nextState):
        
        r = -100
        if nextState is State.shortWater:
             
            r =-1
            
        elif nextState is State.health:
            
            r = 1
            
        elif nextState is State.overflow:
            r= -1
        else:
            r = -100
        return r
            
    
    def action(self, state, action):
         
       
         if state is State.shortWater:
             #print("\n state--- ",state, "\t action---- ",action)
             if action is Action.water :
              
                 S =[State.shortWater, State.health]
                 proba =[0.5, 0.5]
             else:
                 S =[State.shortWater, State.apoptosis]
                 proba =[0.4, 0.6]
             
            
         elif state is State.health:
             #健康
             if action is Action.water :
                 S =[State.health, State.overflow]
                 proba =[0.6, 0.4]
             else:
                 S =[State.shortWater, State.health]
                 proba =[0.6, 0.4]
             
         elif state is State.overflow:
             #溢水
             if action is Action.water :
                 S =[State.overflow, State.apoptosis]
                 proba =[0.6, 0.4]
             else:
                 S =[State.health, State.overflow]
                 proba =[0.6, 0.4]
             
         else:  
             #凋亡
                 S =[State.apoptosis]
                 proba =[1.0]
         #print("\n S",S, "\t prob ",proba)
         nextState = random.choices(S, proba)[0]
         
         r = self.reward(nextState)
         #print("\n nextState ",nextState,"\t reward ",r)
         return nextState,r
         
         
         
     
    def __init__(self):
         
         self.X = None
         
    
     
    
    
    
class Agent():
    
    
    def initPolicy(self):
        
        self.Q ={}
        self.count ={}
        brandom = True #使用随机策略
        for state in self.S:
            for action in self.A:
                self. Q[state, action] = 0
                self.count[state,action]= 0
                randProb= [0.5,0.5]
                
        return self.Q, self.count, randProb,brandom
                
    
    def randomPolicy(self,randProb,T):
        
        A = self.A
        env = Env()
        state = State.shortWater #从缺水开始
        
        history =[]
        for t in range(T):
            a = random.choices(A, randProb)[0]
            nextState,r = env.action(state, a)
            item = [state,a,r,nextState]
            history.append(item)
            state = nextState
        
        return history
    
    def runPolicy(self,policy,T):
        

        env = Env()
        state = State.shortWater #从缺水开始
        
        history =[]
        for t in range(T):
            
            action = policy[state]
            nextState,r = env.action(state, action)
            item = [state,action,r,nextState]
            history.append(item)
            state = nextState
        
        return history
       
    def getTotalReward(self, t,T, history):
        
        denominator =T -t
        totalR = 0.0
        
        for i in range(t,T):#列表下标为0 开始,所以不需要t+1
            r= history[i][2]
            totalR +=r
            
        return totalR/denominator
              
    def updateQ(self, t ,history,R):
           #[state,action,r,nextState]
           state = history[t][0]
           action = history[t][1]
           count = self.count[state,action]
           
           self.Q[state, action]= (self.Q[state,action]*count+R)/(count+1)
           self.count[state,action] = count+1
           
           
        
        
        
    def learn(self):
        
        Q,count,randProb,bRandom =self.initPolicy()
        T =10
        policy ={}
        
        for s in range(1,self.maxIter): #采样第S 条轨迹
            
            if bRandom: #使用随机策略
                history = self.randomPolicy(randProb, T)
                #print(history)
            else:
              
                print("\n 迭代次数 %d"%s ,"\t 缺水:",policy[State.shortWater].name,
                                          "\t 健康:",policy[State.health].name,
                                         "\t 溢水:",policy[State.overflow].name,
                                         "\t 凋亡:",policy[State.apoptosis].name)
                history = self.runPolicy(policy, T)
                
            #已经有了一条轨迹了
            for t in range(0,T-1):
                R = self.getTotalReward(t, T, history)
                self.updateQ(t, history, R)
                
            rand = random.random()
            
            if rand < self.epsilon: #随机策略执行
                bRandom = True
            else:
                bRandom = False
                
                for state in self.S:
                    maxR = self.Q[state, self.A[0]]
                    for action in self.A:
                        
                        r = self.Q[state,action]

                        if r>=maxR:
                            policy[state] = action
                            maxR = r
        return policy
               
                        

                

    
    def __init__(self):
        
        self.S = [State.shortWater, State.health, State.overflow, State.apoptosis]
        self.A = [Action.water, Action.noWater]
        self.Q ={}
        self.count ={}
        self.policy ={}
        self.maxIter =5
        self.epsilon = 0.2


    
if  __name__ == "__main__":
    
     agent = Agent()
     agent.learn()
    

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

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

相关文章

非关系型数据库Redis的安装【Linux】及常用命令

前言 Redis&#xff08;Remote Dictionary Server&#xff09;是一种开源的内存数据库管理系统&#xff0c;它以键值存储方式来存储数据&#xff0c;并且支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。Redis最初由Salvatore Sanfilippo开发&#xff0c…

Java配置47-Spring Eureka 未授权访问漏洞修复

文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老&#xff0c;是 1.5.4.RELEASE…

React使用富文本CKEditor 5,上传图片并可设置大小

上传图片 基础使用&#xff08;标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片&#xff09; 官网查看&#xff1a;https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…

【window系统】win10家庭版没有hyper-V的选项 问题解决办法

目录 事件起因环境和工具操作过程参考内容结束语 事件起因 在给我的新电脑安装docker和对应的Linux环境时 在 控制面版-程序-启用该或关闭Windows功能 时 没有找到对应网上那种教程里的Hyper-V的功能的选项&#xff0c;查找了一下&#xff0c;说是win10家庭版没有这个功能 专…

速学数据结构 | 循环队列怎么写才最高效?只需要掌握这些技巧

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一、什么是循环队列&#xff1f;二、如何实现循环队列&#xff1f;2.1 循环队列的结构2.2 循环…

SpringBoot集成MyBatis-Plus

SpringBoot集成MyBatis-Plus 文章目录 SpringBoot集成MyBatis-Plusapplication.ymlpom.xmlpojomapperserviceserviceimplconfigutilsweb 懒得打一遍&#xff0c;直接copy&#xff1a; SpringBoot集成MyBatis-Plus application.yml # 端口 server:port: 8080 # 数据源 spring:…

期中成绩怎么发布?

作为一名老师&#xff0c;期中考试结束后&#xff0c;你可能正在为如何发布成绩而烦恼。传统的纸质方式不仅耗时而且容易出错&#xff0c;那么有没有一种方式可以让学生自助查询成绩呢&#xff1f;答案是肯定的。下面就为你介绍几种实用的方法&#xff0c;让成绩发布变得轻松又…

默认路由配置

默认路由&#xff1a; 在末节路由器上使用。&#xff08;末节路由器是前往其他网络只有一条路可以走的路由器&#xff09; 默认路由被称为最后的关卡&#xff0c;也就是静态路由不可用并且动态路由也不可用&#xff0c;最后就会选择默认路由。有时在末节路由器上写静态路由时…

性能优于BERT的FLAIR:一篇文章入门Flair模型

文章目录 What is FLAIR&#xff1f;FLAIR ModelContextual String Embedding for Sequence Labelingexample FLAIR Application AreaSentiment AnalysisNamed Entity RecognitionText Classification FLAIR一、什么是FLAIR&#xff1f;二、FLAIR Library的优势是什么&#xff…

日本it培训学费 想去日本做IT,需要具备哪些技术?

日本的IT行业历史比较悠久&#xff0c;业务以上层前端业务为主&#xff0c;如设计和构建软件。日本IT公司组织庞大&#xff0c;行业内部有着严格的分工和部署&#xff0c;工作会被细分化&#xff0c;分配给个人的工作量不会太大&#xff0c;难度也不会很高&#xff0c;所以日本…

【JAVA学习笔记】59 - JUnit框架使用、本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter15/src/com/yinhai/homework JUnit测试框架 1.基本介绍 1. JUnit是一个Java语言的单元测试框架 2.多数Java的开发环境都已经集成了JUnit作为单元测试的工具 2.如何使用 创建方法后&#x…

关于msvcp120.dll丢失的解决方法详解,快速解决dll丢失问题

在计算机使用过程中&#xff0c;经常会遇到“msvcp120.dll丢失”的错误提示。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;造成相关应用程序可能无法正常启动或运行。那么&#xff0c;究竟是什么原因导致了msvcp120.dll文件的丢失呢&#xff1f;本文将详细解析msvc…

react使用react-sortable-hoc实现拖拽

react-sortable-hoc拖拽 安装 npm install react-sortable-hoc --save 代码如下&#xff08;示例&#xff09;&#xff1a; import React, { useImperativeHandle, forwardRef, memo, useState } from react;import { DrawerForm } from ant-design/pro-form;import { messag…

竖拍的视频怎么做二维码?竖版视频二维码制作技巧

为了方便视频的展示和传播&#xff0c;现在将视频生成二维码后来使用的方式越来越常见&#xff0c;很多做二维码工具都可以制作视频二维码&#xff0c;但是无法设置下载权限或者播放竖版视频。那么如果做有下载功能的视频码该如何制作&#xff0c;可能很多小伙伴都不知道怎么做…

Idea 对容器中的 Java 程序断点远程调试

第一种&#xff1a;简单粗暴型 直接在java程序中添加log.info()&#xff0c;根据需要打印信息然后打包覆盖&#xff0c;根据日志查看相关信息 第二种&#xff1a;远程调试 在IDEA右上角点击编辑配置设置相关参数在Dockerfile中加入 "-jar", "-agentlib:jdwp…

可视化协作软件有哪些?这10款神器助力团队合作!

可视化协作已经成为一个时下热门词汇&#xff0c;问题是对其并没有一个清晰的定义。有人认为它代表了一个云端环境&#xff0c;具有能够使办公室、混合办公和远程员工一起工作的功能。其他人则认为可视化协作不过是数字化白板而已。 随着这个术语变得更加流行&#xff0c;许多…

时间序列聚类的直观方法

一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验&#xff0c;同时利用直观的可视化&#xff0c;让我们看看下面的时间序列&#xff1a; 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…

Flutter 组件集录 | InheritedNotifier 内置状态管理组件

theme: cyanosis 1. 前言 在上一篇 《Flutter 知识集锦 | 监听与通知 ChangeNotifier》 中&#xff0c;我们介绍了 ChangeNotifier 对象通知监听者的能力。并通过一个简单的模拟下载进度案例&#xff0c;介绍了它的使用方式&#xff1a; | 案例演示 | 监听-通知关系 | | --- | …

多用户商城系统对比 多用户商城系统哪个好

大环境越来越好&#xff0c;企业纷纷将消费者引入自己建设的独立商城&#xff0c;如零食行业的良品铺子、三只松鼠&#xff0c;从而打造属于自己的IP形象。此时&#xff0c;挑选一款优秀的商城源码是企业的不二之选。这里将国内三大优秀的多用户商城系统进行对比&#xff0c;以…

Elasticsearch 8.X 如何生成 TB 级的测试数据 ?

1、实战问题 我只想插入大量的测试数据&#xff0c;不是想测试性能&#xff0c;有没有自动办法生成TB级别的测试数据&#xff1f;有工具&#xff1f;还是说有测试数据集之类的东西&#xff1f;——问题来源于 Elasticsearch 中文社区https://elasticsearch.cn/question/13129 2…