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

前言:

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

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

   重点讲解两个知识点:

    策略改进

   策略迭代与值迭代

   最后以下面环境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.mfbz.cn/a/115388.html

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

相关文章

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库,它使用图形模型来存储数据,并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库,本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…

防止重复提交请求

前景提要: ts 简易封装 axios,统一 API 实现在 config 中配置开关拦截器 axios 实现请求 loading 效果 用一个数组保存当前请求的 url,此时还未响应。如果再次发起同样请求,比对 url 发现已经存在数组中,则拦截请求&a…

【PyQt学习篇 · ⑨】:QWidget -控件交互

文章目录 是否可用是否显示/隐藏是否编辑是否为活跃窗口关闭综合案例信息提示状态提示工具提示“这是什么”提示 焦点控制单个控件角度父控件角度 是否可用 setEnabled(bool):该函数用于设置QWidget控件的可用性,参数bool为True表示该控件为可用状态&…

Spring底层原理(六)

Spring底层原理(六) 本章内容 介绍AOP的实现方式、JDK代理的模拟实现与源码 AOP的实现方式 使用代理模式 jdk动态代理cglib动态代理 使用aspectj的编译器,该编译器会直接对字节码进行修改,可以实现静态方法增强 使用javaagent,在jvm option中指定-…

FlinkCDC系列:通过skipped.operations参数选择性处理新增、更新、删除数据

在flinkCDC源数据配置,通过debezium.skipped.operations参数控制,配置需要过滤的 oplog 操作。操作包括 c 表示插入,u 表示更新,d 表示删除。默认情况下,不跳过任何操作,以逗号分隔。配置多个操作&#xff…

概念解析 | 神经网络中的位置编码(Positional Encoding)

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…

Zygote进程通信为什么用Socket而不是Binder?

Zygote进程是Android系统中的一个特殊进程,它在系统启动时被创建,并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源,以提高应用启动的速度。 在Android系统中,常用的进程通信方式有以下几种: Intent…

ABAP简单的队列设置QRFC

场景:用job的方式在接口里启用job,如果接口调用比较频繁,存在同一时间启动相同job的情况,会导致锁表锁程序这种情况。 查阅job函数,发现在JOB_CLOSE函数里自带了类似队列的参数,但是因为是接口&#xff0c…

文件夹还在,里面文件没了?问题这样解决

文件夹还在但文件无故消失怎么办?文件的消失对于我们来说可能是个令人沮丧且困惑的问题。有时候,我们可能会发现文件夹依然存在,但其中的文件却消失了。在这篇文章中,我们将探讨为什么电脑文件会无故消失的原因,并提供…

这个超实用的门禁技巧,让办公楼安全更简单高效!

门禁监控是现代社会中不可或缺的一部分,用于确保安全和管理进出某个区域的人员。随着科技的不断发展,门禁监控已经远离了传统的机械锁和钥匙,变得更加智能化和高效。 客户案例 企业办公大楼 无锡某大型企业在其办公大楼内部部署了泛地缘科技…

ChatGLM3设置角色和工具调用的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

SpringMVC简单介绍与使用

目录 一、SpringMVC介绍 二、SpringMVC作用 三、SpringMVC核心组件 四、SpringMVC快速体验 一、SpringMVC介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff…

Node.js 中解析 HTML 的方法介绍

在 Web 开发中,解析 HTML 是一个常见的任务,特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式,可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 Node.js 中解析 HTML。 基本概念 HTML 解析…

MySQL第三讲·SQL boy的CRUD操作

你好,我是安然无虞。 文章目录 增删查改:如何操作表中的数据?添加数据插入数据记录插入查询结果 删除数据修改数据查询数据select|where|group by|havingfromorder bylimit 增删查改:如何操作表…

第G7周:Semi-Supervised GAN 理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章:365天深度学习训练营-第G7周:Semi-Supervised GAN 理论与实战(训练营内部成员可读) 🍖 原作者:K同学啊|接…

【蓝桥杯选拔赛真题44】python小蓝晨跑 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python小蓝晨跑 一、题目要求 1、编程实现 2、输入输出 二、算法分析

作为一个初学者,该如何入门大模型?

在生成式 AI 盛行的当下,你是否被这种技术所折服,例如输入一段简简单单的文字,转眼之间,一幅精美的图片,又或者是文笔流畅的文字就展现在你的面前。 相信很多人有这种想法,认为生成式 AI 深不可测&#xf…

系列十五、idea全局配置

一、全局Maven配置 IDEA启动页面>Customize>All settings>Build,Execution,Deployment>Build Tools>Maven 二、全局编码配置 IDEA启动页面>Customize>All settings>Editor>File Encodings 三、全局激活DevTools配置 IDEA启动页面>Customize>A…

ASTM F963-23美国玩具安全新标准发布

新标准发布 2023年10月13日,美国材料与试验协会(ASTM)发布了新版玩具安全标准ASTM F963-23。 主要更新内容 与ASTM F963-17相比,此次更新包括:单独描述了基材重金属元素的豁免情况,更新了邻苯二甲酸酯的管控…

表格冻结第二行

在网上找了一圈也没找到说明白的。 像这样的表格下面会有很多行,往下翻的时候会忘记第二行显示的什么内容。 需求:将第二行进行冻结 实现: 1,选中第一和第二行,下拉,点击冻结 2,会显示冻结至…