[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 Enumclass 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 = -100if nextState is State.shortWater:r =-1elif nextState is State.health:r = 1elif nextState is State.overflow:r= -1else:r = -100return rdef 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,rdef __init__(self):self.X = Noneclass Agent():def initPolicy(self):self.Q ={}self.count ={}brandom = True #使用随机策略for state in self.S:for action in self.A:self. Q[state, action] = 0self.count[state,action]= 0randProb= [0.5,0.5]return self.Q, self.count, randProb,brandomdef randomPolicy(self,randProb,T):A = self.Aenv = 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 = nextStatereturn historydef 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 = nextStatereturn historydef getTotalReward(self, t,T, history):denominator =T -ttotalR = 0.0for i in range(t,T):#列表下标为0 开始,所以不需要t+1r= history[i][2]totalR +=rreturn totalR/denominatordef 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+1def learn(self):Q,count,randProb,bRandom =self.initPolicy()T =10policy ={}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 = Trueelse:bRandom = Falsefor 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] = actionmaxR = rreturn policydef __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 =5self.epsilon = 0.2if  __name__ == "__main__":agent = Agent()agent.learn()

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分享|查询\下载“省市县乡村“五级矢量数据网

查询和下载"省市县乡村"五级行政区划 背景信息 在更新完CTAmap1.12版本之后&#xff0c;我想继续完善这个系列的数据&#xff0c;把时间范围往前更新是基础&#xff0c;但如何展现多年的数据是个值得解决的问题。 如何展现多个年份的行政区划&#xff1f;我的思考是…

为机器学习算法准备数据(Machine Learning 研习之八)

本文还是同样建立在前两篇的基础之上的&#xff01; 属性组合实验 希望前面的部分能让您了解探索数据并获得洞察力的几种方法。您发现了一些数据怪癖&#xff0c;您可能希望在将数据提供给机器学习算法之前对其进行清理&#xff0c;并且发现了属性之间有趣的相关性&#xff0c…

InnoDB中Buffer Pool详解

1. 概念及特点 Buffer Pool 是 MySQL 中 InnoDB 存储引擎用来缓存表数据和索引数据的内存区域。这个内存区域被用来存储磁盘上的数据页的副本&#xff0c;这样常用的数据可以在内存中快速被访问&#xff0c;而不必每次都从磁盘中读取。 以下是 Buffer Pool 的一些重要特点&a…

Redis安装Linux

1、下载安装包 wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2、安装 mkdir /usr/local/redis cp redis-3.0.0.tar.gz /usr/local/redis cd /usr/local/redis tar -zxvf redis-3.0.0.tar.gz cd /usr/local/redis/redis-3.0.0 make PREFIX/usr/local/red…

有趣的数学 sign是什么函数

在数学中&#xff0c;函数sign指的是符号函数&#xff0c;它的定义如下&#xff1a;对于任意实数x&#xff0c;若x>0&#xff0c;则sign(x)1&#xff1b;若x0&#xff0c;则sign(x)0&#xff1b;若x<0&#xff0c;则sign(x)-1&#xff1b;简单来说&#xff0c;sign函数就…

redis五种数据类型

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。 1.String&#…

下载git步骤

文章目录 导文1.软件下载2.git安装3.测试git 导文 下载git的详细步骤 1.软件下载 可以自己去网上下载&#xff0c;根据自己电脑的系统类型是多少位的&#xff0c;去下载对应的安装包。 下载地址&#xff1a;Git - Downloads 根据自己的 操作系统进行选择&#xff0c;按需选择…

中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验

智慧公厕是利用先进的技术和创新的解决方案来改进公厕的设施和管理。借助物联网、互联网、5G/4G通信、人工智能、大数据、云计算等新兴技术的集成&#xff0c;智慧公厕具备了一系列令人惊叹的应用功能。从监测公厕内部人体活动状态、人体存在状态&#xff0c;到空气质量情况、环…

想学计算机编程从什么学起?零基础如何自学计算机编程?中文编程开发语言工具箱之渐变标签组构件

想学计算机编程从什么学起&#xff1f;零基础如何自学计算机编程&#xff1f; 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;…

c语言 简单认识 指针和结构体

指针 代码 #include <stdio.h>int main(){int a 10;//指针类型需要与变量的类型相同&#xff0c;且后面需要添加一个*符号&#xff08;注意这里不是乘法运算&#xff09;表示是对于类型的指针int * p &a; //这里的&并不是进行按位与运算&#xff0c;而是取…

如何记录每天的工作日程?电脑手机通用的日程管理软件

在工作时间有限&#xff0c;但工作任务愈加繁多的现在职场中&#xff0c;要求每一个职场人士做好高效日程管理。通过高效管理日程&#xff0c;我们可以更好地组织和安排任务&#xff0c;合理分配时间和优先级&#xff0c;这有助于我们更专注地进行工作&#xff0c;减少时间的浪…

51单片机锅炉监控系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机锅炉监控系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a;讲解视频2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 51单片机锅炉监控系统仿…