20. 完整的蒙特卡洛强化学习算法

news/2024/5/18 22:53:27 标签: 算法, 强化学习, 蒙特卡洛

文章目录

1. 回顾

第16篇给出了强化学习算法框架,随后的第17、18篇给出了该框架下如何进行策略评估以估计出Q ( s , a ) (s,a) (s,a),第19篇给出了该框架下如何进行策略控制以改进 π ( a ∣ s ) \pi(a|s) π(as),至此就可以给出MC强化学习算法的更具体的完整描述。

2. 约定

  • 为方便描述该算法,我将尽量借用python的一些语法,重在简洁,增强可读性,不拘泥于语法细节正确与否;
  • 尽量用面向对象描述,个人认为,面向对象更适宜强化学习编程;

3. MC强化学习环境对象的表示

为了描述MC强化学习所处的环境,定义一个名为Env的类,这个类包含了reset方法和step方法,分别用来返回初始状态和返回当前状态下,执行一个行为后智能体获得的立即回报和转移后的状态。下面是这个类的框架代码:

class Env:
     def __init__(self,nS:int,nA:int):
         '''
         初始化
         args:
             ns: 状态空间长度
             nA:行为空间长度
         '''
         self.nS = nS
         self.nA = nA
         random.random.seed(0) # 初始化随机数发生器
         self.current_state = 0
         
     def reset(self)->Tuple[int,bool]'''
         重置环境的当前状态为随机状态
         return:
              状态索引号,是否为终止状态
         '''
           ...
           self.current_state = [0,nS-1]上的一个随机整数
           return random.randomint(0,self.nS)
     
     def step(self,k:int)->Tuple[float,int,bool]:
         '''
         在当前状态下,执行行为空间中索引号为k的行为(有的资料称为动作),返回立即回报(有的资料称为即时奖励)、下一个状态索引号、下一个状态是否为终止状态,该方法执行后,环境的当前状态变为下一个状态索引号
         args:
          k :当前状态下执行的行为的索引号(索引号从0开始编号)
         return:
         本次行为的立即回报,下一状态索引号
         '''
         pass

上面的代码是无模型强化学习的环境的一般框架表示,这个设计其实和gymnasium扩展库的核心抽象类Env类似(它考虑更全面,比如定义了抽象方法render,用来实现基于pygame扩展库的界面的更新,可视化智能体与环境的交互过程,这个原则上我们也能够设计出来,单需要相当大的精力去做这件事,至少我没有这个精力)。因此,在无模型强化学习中,完全可以从gymnasium.Env派生出实际的具体环境类(有兴趣,可参考本专栏中的第14篇)。之所以要在这里单独设计,是希望从宏观上把握强化学习算法的一般编程架构。

4.MC强化学习算法的表示

在MC强化学习算法,是一个智能体,用类描述如下:

class Agent:
     def __init__(self,env:Env,pi:NDArray,epsilon:float=0.5,mcSample:NDArray=None):
         '''
         env:该智能体交互的环境
         pi:智能体所采取的策略初始策略,二维数组
         epsilon:贪婪系数,(0,1)上的数
         mcSample:MC轨迹采样策略,为None时将使用和pi同样的策略。
         '''
          self.env = Env
          self.pi = pi
          self.epsilon = epsilon
          self.q = 维度为(nS,nA)的零矩阵  # q[i,j]对应Q(s_i,s_j),i,j从0开始
          if not mcSample:
             self.sample_policy = mcSample
          else
             self.sample_policy = pi
          ...

     def train(self)->NDArray:
         '''采样获得完整轨迹,并训练获得优化后的策略'''
         while True:
              episode = self.get_episode() # 获取一条完整轨迹
              使用增量式策略评估算法根据episode估计行为值函数,用估计结果直接更新self.q
              pi_old = self.pi
              根据self.q,使用\epsilon-贪婪法求更新策略pi
              if self.pi-pi_old<阈值:
                  break    
         return self.pi
         
     def get_episode(self):
         ...

5. MC方法的进一步分类

你可能已经注意到,获得完整轨迹时所使用的策略(采样策略)与要评估改进的策略可能一样,也可能不一样,这就把MC方法进一步分为两类:

  • on-policy MC(在线MC强化学习算法): 轨迹采样策略与待评估策略是同一策略
  • off-policy MC(离线MC强化学习算法):轨迹采样策略与待评估策略不是同一策略

这两大类算法各有什么优劣,下一篇再讨论。晚安。


http://www.niftyadmin.cn/n/5322021.html

相关文章

基于SpringBoot+Vue实现的二手交易系统

系统介绍 校园二手交易网站是一种专门针对有二手物品交易需求用户的二手交易的网站。它的设计和开发主要是为了满足用户之间的二手物品交易需求&#xff0c;方便大家在线买卖二手物品。近年来&#xff0c;随着互联网技术的发展&#xff0c;人们越来越喜欢在线购物&#xff0c;…

使用代理IP池实现多线程爬虫的方法

目录 前言 代理IP的概念和作用 为什么使用代理IP池 代理IP池的实现步骤 代码实现 注意事项 总结 前言 随着互联网的发展&#xff0c;爬虫技术在各个领域中被广泛应用。然而&#xff0c;目标网站对爬虫的限制也日益严格&#xff0c;例如限制单个IP的请求频率。为了解决这…

Python入门知识点分享——(十五)自定义函数

函数是一段事先组织好可重复使用的代码块&#xff0c;用于执行特定的任务。函数可以接受输入参数&#xff0c;并返回一个结果&#xff0c;从而提高应用的模块性和代码的重复利用率。先前我们已经介绍了Python中的内置函数&#xff0c;现在我们要学习创建自定义函数&#xff0c;…

LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

题目描述&#xff1a; 解题思路&#xff1a; 创建两个栈&#xff0c;一个用于入数据&#xff0c;一个用于出数据。分别是pushST和popST; 1.如果是入数据就直接入进pushST 2.如果是出数据&#xff0c;先检查popST中有无数据&#xff0c;如果有数据&#xff0c;就直接出。如果没…

数据结构:顺序栈(含完整代码,可复制)

要编写一个顺序栈的代码&#xff0c;首先要了解栈的特点。它是先进后出&#xff08;或后进先出&#xff09;的顺序进出元素。 1.初始化栈函数 这个函数比较简单&#xff0c;首先要先建立一个结构体&#xff0c;包含最大空间和栈顶位置。而初始化就是让让栈顶的位置为0。 void…

asp.net core项目发布到 iis上

我们都知道与传统asp.net 项目比较&#xff0c;ASP.NET Core则完全不同&#xff0c;它并不是运行在IIS的工作进程中&#xff0c;而是独立运行的。它运行于控制台应用程序之中&#xff0c;控制台中则运行了Kestrel Web服务器组件。Kestrel作为一款.NET Web服务器的实现&#xff…

UCB Data100:数据科学的原理和技巧:第十三章到第十五章

十三、梯度下降 原文&#xff1a;Gradient Descent 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 学习成果 优化复杂模型 识别直接微积分或几何论证无法帮助解决损失函数的情况 应用梯度下降进行数值优化 到目前为止&#xff0c;我们已经非常熟悉选择模型和相应损…

天津python培训学校 Python有怎样的前景?

很多人以为Python之所以变得火热的原因是人工智能和大数据的兴起&#xff0c;这并非是全部的原因&#xff0c;Python是一门很适合人工智能领域的编程语言&#xff0c;人工智能目前虽然还处于前期阶段&#xff0c;但是对人工智能方面的人才确在不断增加&#xff0c;能够提供的岗…