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

news2024/11/27 15:56:37

前言:

      在现实的学习任务中,环境 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()
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

紫光同创FPGA编写的8画面分割器演示

适用于板卡型号&#xff1a; 紫光同创PGL50H开发平台&#xff08;盘古50K开发板&#xff09; 图(1) 盘古50K开发板 TOP 层逻辑框 图(2) TOP层逻辑框 video_copy_ux 将输入的一路RGB888信号复制成8份&#xff0c;每份画面内容相同&#xff0c;各路颜色有些差异&#xff1a; 第…

C++ 之Google benchmark测试与分析

0. 简介 作为一个程序而言&#xff0c;benchmark是非常关键的一个衡量指标&#xff0c;无论是程序算法的指标还是程序运行性能的指标&#xff0c;这些我们都可以去完成衡量。对于性能衡量而言google benchmark无疑是一个比较好的选择 1. google benchmark安装 1.1 下载地址 …

矢量图形设计软件:Illustrator 2024(AI)中文激活版

Illustrator 2024是一款强大的矢量图形设计软件&#xff0c;它具备丰富的绘图和设计工具&#xff0c;用户可以通过画笔、铅笔、形状、路径等工具创建各种矢量图形和插图设计。新版本还增强了智能功能&#xff0c;可以自动从图像或调色板中提取颜色并应用到设计中&#xff0c;同…

云工作流 CloudFlow 重磅发布,流程式开发让云上应用构建更简单

为了让企业和开发者更快速、便捷地进行云上开发&#xff0c;阿里云重磅发布云工作流&#xff08;CloudFlow&#xff09;&#xff0c;它是一款强大的面向开发者的流程编排开发工具&#xff0c;全托管、高并发、高可用&#xff0c;帮助用户简化和自动化复杂的云上业务流程和工作流…

数据结构 - ArrayList - 动态修改的数组

目录 实现一个通用的顺序表 总结 包装类 装箱 / 装包 和 拆箱 / 拆包 ArrayList 与 顺序表 ArrayList基础功能演示 add 和 addAll &#xff0c;添加元素功能 ArrayList的扩容机制 来看一下&#xff0c;下面的代码是否存在缺陷 模拟实现 ArrayList add 功能 add ind…

Linux安装配置awscli命令行接口工具及其从aws上传下载数据

官网技术文档有全面介绍&#xff1a;安装或更新 AWS CLI 的最新版本 - AWS Command Line Interface在系统上安装 AWS CLI。https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructionsawscli常用命令参考&…

红海云签约澳森集团,为钢铁行业人力资源数字化转型注入新动能

辛集市澳森特钢集团有限公司&#xff08;以下简称“澳森集团”&#xff09;是集钢铁冶炼、轧钢及钢材深加工、新型建材、国际贸易、房地产开发、酒店餐饮、热力供应于一体的大型钢铁联合企业&#xff0c;是华北地区最具品牌影响力和核心竞争力的综合性大型企业集团。 近日&…

LBS营销|基于位置信息的营销策略

LBS营销&#xff08;Location-Based Services Marketing&#xff09;是一种基于位置信息的营销策略&#xff0c;它利用移动设备和位置数据来为消费者提供与其当前位置相关的个性化信息和服务。LBS营销通过分析用户的地理位置&#xff0c;向他们提供特定地点或地理区域的有关信息…

虚拟数字人技术篇

1. 虚拟数字人概念解析 虚拟数字人它是由三个部分组成:虚拟、数字、人。 虚拟:存在于非物理世界,多模态存在于各种介质;数字:数字化,可复制多个分身,多技术综合体;人:具备拟人化的外表和行为交互的能力。具体说明如下: 虚拟: 通常是指它是存在于非物理世界,可以是…

基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python 计算机竞赛

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

Docker安装matomo

Docker安装matomo 文章目录 Docker安装matomo1.安装Docker2.matomo安装 1.安装Docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2.matomo安装 #拉取matomo镜像 docker pull matomo#启动matomo容器 docker run -d --name matomo -p 8093:80 -v /do…

喜讯!苏州箱讯获评苏州市软件和信息服务业 “头雁”培育企业

近日&#xff0c;由中国电子信息产业发展研究院、中国工业经济联合会、国家智能制造专家委员会、国家产业基础专家委员会、江苏省工业和信息化厅、江苏省国有资产监督管理委员会、苏州市人民政府共同主办的2023第三届中控中国大会在苏州太湖国际会议中心举办。 本届大会以“生态…

erp 技术的发展趋势和方向有哪些?

近日&#xff0c;亿欧智库重磅发布了《2022中国制造业ERP研究报告》。亿欧通过桌面研究及行业专家访谈&#xff0c;对ERP在制造业领域的应用情况进行分析&#xff0c;洞察ERP针对制造业不同场景的服务模式&#xff0c;研讨制造业ERP的未来发展趋势&#xff0c;旨在帮助制造业企…

OPCUA 行业配套标准:机器人

OPC UA 定义了对象&#xff0c;对象类型&#xff0c;结构化组织能力和定义对象之间关系的能力&#xff0c;利用这些基础和衍生类型及对象&#xff0c;用户还可以搭建出更复杂的类型&#xff0c;关系和对象。 如果不同的厂商或者用户定义的信息模型不同&#xff0c;将会影响系统…

springboot+vue基于JAVA的企业内部人员绩效量化管理系统的设计与实现【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

时间复杂度的计算技巧-算法模型中的时间复杂度如何计算,有哪些技巧呢

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下时间复杂度的计算技巧-算法模型中的时间复杂度如何计算&#xff0c;有哪些技巧呢&#xff0c;算法的时间复杂度是评估算法性能和效率的一种方式&#xff0c;它表示算法需要执行多少次基本操作才能完成其任务&#x…

【数据库】关系数据库管理系统 (RDBMS) 中事务处理的四个特性ACID

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 数据库事务是指一组数据库操作&#xff08;例如插入、更新、删除等&#xff09;&#xff0c;被视为一个单独的逻辑操作单元&#xff0c;并且要么全部执行成功&#xff0c;要么全部不执行&…

Eolink Apikit 如何对所有 API 异常请求实时监控 ?

API 监控适合业务在互联网上&#xff0c;并且用户来自多个不同的地区&#xff0c;且对API的要求较高的场合&#xff0c;用于解决以下的问题&#xff1a; 发现由于网络中断或者是API响应异常等导致的服务不可用 及时对异常的API进行告警 记录监控的日志&#xff0c;方便排查 …

基于Jaccard相似度的推荐算法---示例

目录 数据展示推荐算法的分类基于相似度基于流行度/上下文/社交网络 Jaccard相似度分析数据的特点可以考虑的方法计算方法优缺点计算用户之间的Jaccard相似度获取与给定最相似的10个用户对1713353的用户推荐10本书 数据展示 import pandas as pd import numpy as np# 读取CSV文…

vue+elementUI 设置el-descriptions固定长度并对齐

问题描述 对于elementUI组件&#xff0c;el-descriptions 在以类似列表的形式排列的时候&#xff0c;上下无法对齐的问题。 问题解决 在el-descriptions 标签中&#xff0c;添加属性&#xff1a; :contentStyle"content_style" 控制其内容栏长度 <el-descripti…