[PyTorch][chapter 60][强化学习-2-有模型学习2]

news2024/11/28 3:44:55

前言:

   前面我们讲了一下策略评估的原理,以及例子.

   强化学习核心是找到最优的策略,这里

   重点讲解两个知识点:

    策略改进

   策略迭代与值迭代

   最后以下面环境E 为例,给出Python 代码

目录:

     1:  策略改进

      2:  策略迭代与值迭代

      3: 策略迭代代码实现  Python 代码


一  策略改进

      理想的策略应该能够最大化累积奖赏:

       \pi^{*}= arg max_{\pi} \sum_{x \in X} V^{\pi}(x)

     最优策略对应的值函数V^{*}称为最优值函数

      \forall x\in X: V^{*}(x)= V^{\pi^*}(x)

状态值函数(Bellman 等式):

 动作求和

 V_{T}^{\pi}=\sum_{a \in A}\pi(x,a)\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(\frac{1}{T}R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}V_{T-1}^{\pi}(x^{'}))......16.9

 V_{\gamma}^{\pi}=\sum_{a \in A}\pi(x,a)\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(R_{x \rightarrow x^{'}}^a+\gamma V_{\gamma}^{\pi}(x^{'}))......16.9

状态-动作值函数

状态值函数(Bellman 等式): 动作求和

 Q_{T}^{\pi}(x,a)=\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(\frac{1}{T}R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}V_{T-1}^{\pi}(x^{'}))...16.10

 V_{\gamma}^{\pi}(x,a)=\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(R_{x \rightarrow x^{'}}^a+\gamma V_{\gamma}^{\pi}(x^{'}))...16.10

   由于最优值的累计奖赏已经最大,可以对前面的Bellman 等式做改动,

 即使对动作求和  改为取最优

    最优

 V_{T}^{\pi}=max_{a \in A}\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(\frac{1}{T}R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}V_{T-1}^{*}(x^{'}))....16.13

 V_{\gamma}^{\pi}=\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(R_{x \rightarrow x^{'}}^a+\gamma V_{\gamma}^{*}(x^{'}))...16.13

V^{*}(x)=max_{a\in A}Q^{\pi^{*}}(x,a)....16.14  带入16.10

Q_{T}^{*}(x,a)=\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(\frac{1}{T}R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}max_{a^{'} \in A}Q_{T-1}^{*}(x^{'},a^{'}))...16.10

 V_{\gamma}^{\pi}(x,a)=\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(R_{x \rightarrow x^{'}}^a+\gamma max_{a^{'} \in A} Q_{\gamma}^{*}(x^{'},a^{'}))...16.10

      最优Bellman 等式揭示了非最优策略的改进方式:

      将策略选择的动作改变为当前的最优动作。这样改进能使策略更好

   策略为\pi^{'},改变动作的条件为: Q^{\pi}(x,\pi^{'}(x)) \geq V^{\pi}(x)

带入16.10,可以得到递推不等式

    V^{\pi}(x)\leq Q^{\pi}(x,\pi^{'}(x))

             =\sum_{x^{'} \in X}P_{x\rightarrow x^{'}}^{\pi^{'}(x)}(R_{x\rightarrow x^{'}}^{\pi^{'}(x)}+\gamma V^{\pi}(x^{'}))

             =\sum_{x^{'} \in X}P_{x\rightarrow x^{'}}^{\pi^{'}(x)}(R_{x\rightarrow x^{'}}^{\pi^{'}(x)}+\gamma Q^{\pi}(x^{'},\pi^{'}(x^{'})))

             =V^{\pi^{*}}(x)    16.16


二  策略迭代与值迭代

可以看出:策略迭代法在每次改进策略后都要对策略进行重新评估,因此比较耗时。

由公式16.16  V^{\pi}(x)\leq Q^{\pi}(x,\pi^{'}(x))\leq V^{\pi^{*}}(x) 策略改进 与值函数的改进是一致的

由公式16.13可得  

V_{T}(x)=max_{a \in A}\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(\frac{1}{T}R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}V_{T-1}^{*}(x^{'}))

 V_{\gamma}^{\pi}=max_{a\in A}\sum_{x^{'}\in X}P_{x\rightarrow x^{'}}^a(R_{x \rightarrow x^{'}}^a+\gamma V_{\gamma}^{*}(x^{'}))

于是可得值迭代(value iteration)算法.


三  策略迭代代码实现


# -*- coding: utf-8 -*-
"""
Created on Wed Nov  1 19:34:00 2023

@author: cxf
"""

# -*- coding: utf-8 -*-
"""
Created on Mon Oct 30 15:38:17 2023

@author: chengxf2
"""
import numpy as np
from enum import Enum
import copy



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

class Action(Enum):
    
    #动作空间A
    water = 1 #浇水
    noWater = 2 #不浇水
    
class Env():
    
    def __init__(self):
        
        #状态空间
        self.X = [State.shortWater, State.health,State.overflow, State.apoptosis]   
        #动作空间
        self.A = [Action.water,Action.noWater]   
        
        #从状态x出发,执行动作a,转移到新的状态x',得到的奖赏 r为已知道
        self.Q ={}
        self.Q[State.shortWater] =          [[Action.water,0.5,   State.shortWater,-1],
                                             [Action.water,0.5,   State.health,1],
                                             [Action.noWater,0.4, State.shortWater,-1],
                                             [Action.noWater,0.6, State.overflow,-100]]


        self.Q[State.health] =                [[Action.water,0.6,  State.health,1],
                                              [Action.water,0.4,   State.overflow,-1],
                                              [Action.noWater,0.6, State.shortWater,-1],
                                              [Action.noWater,0.4, State.health,1]]


        self.Q[State.overflow] =                [[Action.water,0.6,   State.overflow,-1],
                                                 [Action.water,0.4,   State.apoptosis,-100],
                                                 [Action.noWater,0.6, State.health,1],
                                                 [Action.noWater,0.4, State.overflow,-1]]


        self.Q[State.apoptosis] =[[Action.water,1, State.apoptosis,-100],
                                [Action.noWater,1, State.apoptosis,-100]]
        
        self.curV ={} #前面的累积奖赏,t时刻的累积奖赏
        self.V ={} #累积奖赏,t-1时刻的累积奖赏
        for x in self.X:    
             self.V[x] =0
             self.curV[x]=0
             
        
    def GetX(self):
        #获取状态空间
        return self.X

    def GetAction(self):
        #获取动作空间
        return self.A
    
    def GetQTabel(self):
        #获取状态转移概率
        return self.Q
    
    

class LearningAgent():
    
    def initStrategy(self):   
        #初始化策略
        stragegy ={}
        stragegy[State.shortWater] = Action.water
        stragegy[State.health] =    Action.water
        stragegy[State.overflow] = Action.water
        stragegy[State.apoptosis] = Action.water
        
        self.stragegy = stragegy
    
    def __init__(self):
          
          env = Env()
          self.X = env.GetX()
          self.A = env.GetAction()
          self.QTabel = env.GetQTabel()
          
          self.curV ={} #前面的累积奖赏
          self.V ={} #累积奖赏
          for x in self.X:    
              self.V[x] =0
              self.curV[x]=0
              
    def  evaluation(self,T):
         #策略评估
         
         for t in range(1,T):
             #当前策略下面的累积奖赏
             
             
             for  state in self.X: #状态空间
                     reward = 0.0
                     action = self.stragegy[state]
                     QTabel= self.QTabel[state]
                     
                     for Q in QTabel:
                         if action == Q[0]:#在状态x 下面执行了动作a,转移到了新的状态,得到的r
                             newstate = Q[2] 
                             p_a_ss =   Q[1]
                             r_a_ss =   Q[-1]
                             #print("\n p_a_ss",p_a_ss, "\t r_a_ss ",r_a_ss)
                             reward += p_a_ss*((1.0/t)*r_a_ss + (1.0-1/t)*self.V[newstate])
                             
                     self.curV[state] = reward               
             if (T+1)== t:
                 break
             else:
                 self.V = self.curV
         
              
         
     
     
    def  improve(self,T):
         #策略改进
         stragegy ={}
         for  state in self.X:
             
             QTabel= self.QTabel[state]
             max_reward = -float('inf') 
             
             #计算每种Q(state, action)
             for action in self.A:
                 
                     reward = 0.0
                     for Q in QTabel:
                         if action == Q[0]:#在状态x 下面执行了动作a,转移到了新的状态,得到的r
                             newstate = Q[2] 
                             p_a_ss =   Q[1]
                             r_a_ss =   Q[-1]
                             #print("\n p_a_ss",p_a_ss, "\t r_a_ss ",r_a_ss)
                             reward += p_a_ss*((1.0/T)*r_a_ss + (1.0-1/T)*self.V[newstate])
                             
                     if reward> max_reward:
                         max_reward = reward
                         stragegy[state] = action
                         #print("\n state ",state, "\t action ",action, "\t reward %4.2f"%reward)
         return stragegy
                     
                     
             
         
        


              
 
    
    def compare(self,dict1, dict2):
        #策略比较
        
        for key in dict1:
            if dict1[key] != dict2.get(key):
               return False
         
        return True
                     

    def learn(self,T):
        
        #随机初始化策略
        self.initStrategy()
     
        n = 0
        while True:
              self.evaluation(T-1) #策略评估
              n = n+1
         
              
             
                  
              print("\n 迭代次数 %d"%n ,State.shortWater.name, "\t 奖赏: %4.2f "%self.V[State.shortWater],
                    State.health.name, "\t 奖赏: %4.2f "%self.V[State.health],
                    State.overflow.name, "\t 奖赏: %4.2f "%self.V[State.overflow],
                    State.apoptosis.name, "\t 奖赏: %4.2f "%self.V[State.apoptosis],)
              
              
              
              strategyN =self.improve(T) #策略改进
              #print("\n ---cur---\n",self.stragegy,"\n ---new-- \n ",strategyN )
              if self.compare(self.stragegy,strategyN):
                  
               
                  print("\n ----- 最终策略 -----\n ")
                  
                  for state in self.X:
                      print("\n state ",state, "\t action: ",self.stragegy[state])
                  
                  break
              else:
                 
                  for state in self.X:
                      self.stragegy[state] = strategyN[state]
              
              
              

    
    



if __name__ == "__main__":
    T =10
    agent = LearningAgent()
    agent.learn(T)

参考:

机器学习.周志华《16 强化学习 》_51CTO博客_机器学习 周志华

CSDN

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

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

相关文章

FSCTF2023-MISC部分WP

FSCTF2023-MISC部分WP 前言:MISC:[FSCTF 2023]Simple Encryption:[FSCTF 2023]萧河:[FSCTF 2023]base套:[FSCTF 2023]行不行啊细狗:[FSCTF 2023]为什么不换换思路捏:[FSCTF 2023]小试牛刀:[FSCT…

Redis内存满的最佳解决方案

文章目录 前言造成内存满原因数据量过大键过期机制不合理内存碎片内存泄漏大量短期数据存储 解决方案1.增加内存2.设置过期时间2.1.在set命令中指定过期时间(秒):2.2.在set命令中指定过期时间(毫秒):2.3.使用expire命令为已有key设置过期时间(秒):2.4.使用pexpire命令为已有key…

Git复制代码

目录 一、常用下载代码 1.登录Git克隆SSH​编辑 2.新建文件然后右键点击Git Bash Here 3.git clone Paste 二. 本地下载 1.从本地进入页面 2.生成代码——>导入——>生成代码后下载 3.解压道相应位置 一、常用下载代码 1.登录Git克隆SSH 2.新建文件然后右键点击…

大厂面试题-什么是拆包和粘包?怎么解决?

目录 问题分析 问题解答 问题分析 拆包和粘包是在网络编程中比较常见的现象。 因为TCP协议底层是面向流的传输,所以数据在传输的过程中会被分割成一个个的数据包(如图) 接收端在接收数据时需要重新组装数据包,但是TCP协议不保证数据包与应用层的数据…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网:电信网络、有线电视网络、计算机网络 概念:把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义:计算机网络是将地理位置不同的独立计算机系统,通过传输介质链接起来&#xff0c…

JS中null和undefined的区别

首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。 undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null主要…

Python基础(11)-- numpy.argpartition函数

1.前言 在深挖自己研究领域的代码过程中,发现np.argpartition函数出现在核心代码部分,并且出现的频率很高,对于我理解这段代码也有很大的帮助,决定彻底搞懂,话不多说,Let’s go! 2.函数解析 …

企业级API资产如何管理

在当今数字化时代,API已成为企业开发和创新的重要工具,如何高效地管理和调度这些资产成为了企业发展的重要课题。API资产管理的出现,为企业解决了这一难题,通过合理管理和利用API资产,企业可以更好地推动业务发展&…

vue工程化开发和脚手架

工程化开发和脚手架 1.开发Vue的两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。 工程化开…

漏洞复现--XXL-JOB默认accessToken身份绕过漏洞

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

视频剪辑合并攻略:随机封面,高效合并,轻松改标题

随着社交媒体的兴起,视频内容已经成为人们获取信息、娱乐和交流的重要方式。视频剪辑作为视频制作的关键步骤之一,不仅需要掌握技术,还需具备一定的创意和审美能力。在本文中,我们将分享云炫AI智剪实用的视频剪辑合并攻略&#xf…

甘特图组件DHTMLX Gantt用例 - 如何拆分任务和里程碑项目路线图

创建一致且引人注意的视觉样式是任何项目管理应用程序的重要要求,这就是为什么我们会在这个系列中继续探索DHTMLX Gantt图库的自定义。在本文中我们将考虑一个新的甘特图定制场景,DHTMLX Gantt组件如何创建一个项目路线图。 DHTMLX Gantt正式版下载 用…

【VR开发】【Unity】【VRTK】3-VR项目设置

任何VR避不开的步骤 如何设置VR项目,无论是PC VR还是安卓VR,我在不同的系列教程中都说过了,不过作为任何一个VR开发教程都难以避免的一环,本篇作为VRTK的开发教程还是对VR项目设置交代一下。 准备好你的硬件 头盔必须是6DoF的,推荐Oculus Quest系列,Rift系列,HTC和Pi…

什么样的耳机适合跑步?适合跑步佩戴的无线耳机推荐

​无论是在烈日炎炎的夏天,还是在寒风刺骨的冬天里健身运动,只要打开音乐就能沉浸其中。运动耳机不仅佩戴稳固舒适,还能提供高品质音质表现。无论在哪里,无论何时,只要打开音乐,你就可以找到你的节奏&#…

双十一买电视盒子什么牌子好?拆机达人强推目前性能最好的电视盒子

我这几年拆过的电视盒子已经有40多款了,最近看到网友们在讨论双十一电视盒子怎么挑选,就我拆机的经验来说,有些产品在硬件上存在问题的确较多,不知道双十一买电视盒子什么牌子好,可以参考我整理的目前性能最好的电视盒…

【2023-10-31】某钩招聘网站加密参数分析

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…

JavaScript引擎和运行时

什么是一个JavaScript引擎 JS引擎 执行JS代码的程序 例如比较出名的就是GOOGLE的V8引擎,当然其他浏览器也有各自的引擎 JS引擎一般会有两部分组成,一个是调用栈,一个是堆; 调用栈就是我们代码实际执行的地方,而堆是…

云DR数据、应用程序和硬件的紧急备份恢复

云很方便,但是需要做好紧急备份恢复工作。 什么是云容灾(Cloud DR)? 云灾难恢复或简称云 DR 是指数据、应用程序和硬件的紧急备份策略,与传统方法不同,它依赖于云中的存储。 发生故障时,受影响的数据、应用程序和其他资源可以一键从云端恢复,以便尽快恢复业务。 服务提…

BIOS开发笔记 - CMOS

CMOS原来指的是一种生产电子电路的工艺,在PC上一般指的是RTC电路单元,因为早期它是由这种工艺生产出来的,所以又把RTC称作了CMOS。 RTC(Real Time Clock)即实时时钟,用于保存记录时间和日期,也可以用来做定时开机功能。RTC靠一组独立的电源给它供电,这样设计的目的就是…