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

news2025/1/12 6:06:34

前言: 

     在已知模型的环境里面学习,称为有模型学习(model-based learning).

    此刻,下列参数是已知的:

     p_{x\rightarrow x^{'}}^{a}:   在状态x 下面,执行动作a ,转移到状态 x^{'} 的概率

     R_{x\rightarrow x^{'}}^a: 在状态x 下面,执行动作a ,转移到 x^{'} 的奖赏

     

 有模型强化学习的应用案例
          棋类游戏:有模型强化学习算法(例如MCTS)被广泛应用于棋类游戏,例如围棋、国际象棋等。AlphaGo和AlphaZero就是使用MCTS的典型例子。

          路径规划:有模型强化学习算法(例如动态规划)可以用于路径规划问题,例如机器人导航、无人机路径规划等。

            资源调度:有模型强化学习算法可以用于优化资源调度问题,例如数据中心的任务调度、物流配送的路径规划等


目录:

  1.     策略评估
  2.     Bellman Equation
  3.      基于 T步累积奖赏的策略评估算法 例子       


一  策略评估

            模型已知时,对于任意策略\pi,能估算出该策略带来的期望累积奖赏。

            假设:

            状态值函数:   V^{\pi}(x):    从状态x 出发,使用策略\pi,带来的累积奖赏

            状态-动作值函数 Q^{\pi}(x,a): 从状态x 出发,执行动作a,再使用策略\pi,带来的累积奖赏

          由定义:

         状态值函数为:

           V_{T}^{\pi}(x)=E_{\pi}[\frac{1}{T}\sum_{t=1}^Tr_t|x_0=x]: T 步累积奖赏

           V_{\gamma}^{T}(x)=E_{\pi}[\frac{1}{T}\sum_{t=0}^T \gamma^tr_{t+1}|x_0=x] :\gamma 折扣累积奖赏,\gamma \in (0,1]

   

         状态-动作值函数

         Q_{T}^{\pi}(x,a)=E_{\pi}[\frac{1}{T}\sum_{t=1}^Tr_t|x_0=x,a_0=a] T 步累积奖赏

          Q_{\gamma}^{T}(x,a)=E_{\pi}[\frac{1}{T}\sum_{t=0}^T \gamma^tr_{t+1}|x_0=x,a_0=a] \gamma 折扣累积奖赏

      由于MDP具有马尔可夫性,即现在决定未来,将来和过去无关,我们很容易找到值函数的递归关系(Bellman 等式)

                V_{T}^{\pi}(x)=E_{\pi}[\frac{1}{T}\sum_{t=1}^T r_t|x_0=x]   

                            =E_{\pi}[\frac{1}{T}r_1+\frac{T-1}{T}\frac{1}{T-1}\sum_{t=2}^T r_t|x_0=x]

                           =\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}E_{\pi}[\frac{1}{T-1}\sum_{t=1}^{T-1}r_t|x_0=x^{'}])

                          =\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^{'}))             

  

     2.2  r折扣累积奖赏

   这是一种动态规划方案,从V_{0}^{\pi} 出发,通过一次迭代就能计算出每个状态的单步累积奖赏

V_{1}^{\pi}

  

有了状态值函数V后,可以直接计算出状态-动作值函数:

由于算法可能会迭代很多次,可以设置一个阀值,当执行一次迭代后

函数值小于\delta,停止迭代

    max_{x \in X}|V(x)-V^{'}(x)|<\delta


二   Bellman Equation(贝尔曼方程)

   

      

     

   2.1 Summing all future rewards and discounting them would lead to our return G

         G_t= R_{t+1}+\gamma R_{t+2}+r^2 R_{t+3}+..., \gamma \in (0,1)

   2.2 state-value function

         给定策略 \pi时,基于 state s 的条件期望函数,公式表示为:

         v_{\pi}=E(G_t|S_t=s)

          State-value function can be broken into:

      


三   基于 T步累积奖赏的策略评估算法 例子

    代码里面的行为函数采用的是Stochastic

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

@author: chengxf2
"""
import numpy as np
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 __init__(self):
        
        #状态空间
        self.X = [State.shortWater, State.health,State.overflow, State.apoptosis]   
        #动作空间
        self.A = [Action.water,Action.noWater]   

 
        self.Q ={}

        #从状态x出发,执行动作a,转移到新的状态x',得到的奖赏 r为已知道
        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.apoptosis,-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]]
        
    def GetX(self):
        #获取状态空间
        return self.X

    def GetAction(self):
        #获取动作空间
        return self.A
    
    def GetQTabel(self):
        
        return self.Q
    
    

class LearningAgent():
    
    def GetStrategy(self):   
        #策略,处于不同的状态下面,采用不同的action
        stragegy ={}
        stragegy[State.shortWater] = {Action.water:1.0, Action.noWater:0.0}
        stragegy[State.health] =    {Action.water:0.9, Action.noWater:0.1}
        stragegy[State.overflow] = {Action.water:0.1, Action.noWater:0.9}
        stragegy[State.apoptosis] = {Action.water:0.0, Action.noWater:0.0}
        
        return 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 GetAccRwd(self,state,stragegy,t,V):
        #AccumulatedRewards
        #处于x状态下面,使用策略,带来的累积奖赏
        reward_x  =0.0

        for action in self.A:
            #当前状态处于x,按照策略PI,选择action 的概率,正常为1个,也可以是多个(按照概率选取对应的概率)
            p_xa = stragegy[state][action] # 使用策略选择action 的概率
          
            #任意x' in  X, s下个状态
            QTabel= self.QTabel[state]
            reward =0.0
            #print("\n ---Q----\n",QTabel)
            for Q in QTabel:
                 #print(Q, action)
                 if Q[0] == action:
                     #新的状态x'
                     newstate = Q[2] 
                     #当前状态x,执行动作a,转移到新的状态s的概率
                     p_a_xs =   Q[1]
                     #当前状态x,执行动作a,转移到新的状态s,得到的奖赏
                     r_a_xs = Q[-1]
                     reward += p_a_xs*((1.0/t)*r_a_xs + (1.0-1/t)*V[newstate])
                     
                     #print("\n 当前状态 ",x, "\t 转移状态 ",s, "\t 奖赏 ",r_a_xs,"\t 转移概率 ",p_a_xs ,"\t reward",reward)
           
            reward_x +=p_xa*reward
            
        return reward_x
                     

    def learn(self,T):
        
        stragegy =  self.GetStrategy()
        for  t  in range(1,T+1):
             #获得当前的累积奖赏
             for x in self.X:
                 self.curV[x] = self.GetAccRwd(x,stragegy,t,self.V)
             if (T+1) == t:
                 break
             else:
                 self.V = self.curV
    
        for x in self.X:
            print("\n 状态 ",x, "\t 奖赏 ",self.V[x])


        
        
        
    
    



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

参考:

https://www.cnblogs.com/CJT-blog/p/10281396.html

1. 有模型强化学习概念理解_哔哩哔哩_bilibili

1.强化学习简介_哔哩哔哩_bilibili

16 强化学习 - 16.3 有模型学习 - 《周志华《机器学习》学习笔记》 - 书栈网 · BookStack

1 强化学习基础-Bellman Equation - 知乎

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

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

相关文章

儿童玩具跨境电商/TEMU平台要求北美CPC认证欧洲CE认证

儿童玩具跨境电商/TEMU平台要求北美CPC认证欧洲CE认证 最近Temu严格抽查一份关于儿童用品合规的通知。通知指出&#xff0c;为了保障Temu平台消费者的合法权益&#xff0c;以及保障儿童类商品在目的国的正常销售及合规要求&#xff0c;对于以12岁及以下儿童为主要使用对象的产…

智信SMS客户端操作手册

登录系统 登录前需查看用户协议输入账号和密码&#xff0c;点击登录即可 首页介绍 登录成功之后&#xff0c;进入操作页面。 操作页面包括&#xff1a;设置、导入手机号、发送短信三大块功能。 如图&#xff1a; 导入手机号 点击首页中的导入按钮&#xff0c;即可导入手机…

微信小程序中使用GIF

前言 最近在微信小程序开发时遇到了一个非常复杂的动画&#xff0c;如果要手搓的话需要用canvas一点点弄&#xff0c;比较麻烦&#xff0c;于是打算做一个gif来实现动画效果 根据需求&#xff0c;动画只需播放一次即可&#xff0c;并且设置了一个重播按钮&#xff0c;点击即可重…

mysql-面试题

1. 这里我们可以看出有两种情况&#xff0c;要么活跃&#xff0c;要么不活跃&#xff0c;我的思路是统计出不活跃的&#xff0c; 并计算出他们所占比例&#xff0c;再用1减去他们所占比例&#xff0c;就可以得到留存率。大致思路就这样&#xff0c;具体代码后面补。下面代码为老…

TrafficWatch 数据包嗅探器工具

TrafficWatch 是一种数据包嗅探器工具&#xff0c;允许您监视和分析 PCAP 文件中的网络流量。它提供了对各种网络协议的深入了解&#xff0c;并可以帮助进行网络故障排除、安全分析等。 针对 ARP、ICMP、TCP、UDP、DNS、DHCP、HTTP、SNMP、LLMNR 和 NetBIOS 的特定于协议的数据…

PMI-ACP(103:17-56)

巩固复习&#xff1a;SCRUM Scrum是目前敏捷项目管理的经典框架&#xff0c;在2020年最新版的《Scrum指南》中&#xff0c;Scrum之父对迭代目标和完成的定义进行了更为清晰的阐释。 在Scrum里比较重要的是Sprint冲刺。一个Sprint长度一般是2&#xff5e;4周&#xff0c;固定&…

【C/C++】C++中重载、重写和隐藏的区别

重载 函数重载满足条件&#xff1a; 同一个作用域下函数名称相同函数参数类型不同 或者 个数不同 或者 顺序不同 注意: 函数的返回值不可以作为函数重载的条件。 #include<bits/stdc.h>using namespace std;class A {void fun() {};void fun(int i) {};void fun(int …

pytest自动化测试框架Allure功能特性介绍

前言 Allure框架是一个灵活的轻量级多语言测试报告工具&#xff0c;它不仅以web的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息 从dev/qa的角度来看&#xff0c;Allure报告简化了常见缺陷的统计&#xff1a;失…

C# list<T>去重

文章目录 C# list<T>去重值类型去重List<object>object is intobject is decimalobject is charobject is boolobject is string List<int>List<string> 引用类型去重 C# list去重 值类型去重 List object is int //object is intList<object&g…

【华为数通HCIP | 网络工程师】821-BGP高频题、易错题(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️ 零…

如何进行有效的成本控制?

如何进行有效的成本控制&#xff1f; 接下来我会通过一些例子为大家深入浅出的讲讲生产制造业是如何进行成本控制的&#xff0c;下面用到的图片和系统都来自简道云的生产管理系统 这也是我们公司目前正在用的生产管理系统&#xff0c;是我们团队自己搭建的&#xff0c;在这里…

经典二叉树试题(一)

文章目录 一、相同的树1、题目介绍2、思路讲解3、代码演示 二、对称二叉树1、题目介绍2、思路讲解3、代码演示 三、二叉树的最大深度1、题目介绍2、思路讲解3、代码演示 四、左子树之和1、题目介绍2、思路讲解3、代码演示 五、平衡二叉树1、题目介绍2、思路讲解3、代码演示 六、…

使用C++的QT框架实现五子棋

最近有点无聊正好想玩五子棋&#xff0c;那就实现一下这个游戏吧&#xff0c;网上的五子棋逻辑又长又复杂&#xff0c;我这个逻辑还是蛮简单的&#xff0c;展示如下 这是一个简单的五子棋&#xff0c;今天就了解一下这个游戏的思路&#xff0c;使用的是QT框架&#xff0c;只要思…

企业寄件平台一站式管理教程

企业寄件管理平台的诞生&#xff0c;有两大影响因素&#xff1a; 1、企业寄件管理在企业管理体系中越发重要 随着互联网和快递业的发展&#xff0c;企业对外业务开始依托网络、快递。因公寄件在企业中已经是常事&#xff0c;这几年疫情的影响下&#xff0c;越发明显。寄合同、…

活动回顾|OpenTiny 参与线下大会:共创开源未来,助力低代码技术创新

前言 10月下旬 OpenTiny 社区有幸参与了中国开源年会 COSCon’23及华为云开发者日南京站活动。中国开源年会 COSCon’23活动于2023年10月28日至29日在成都菁蓉汇举行&#xff0c;以“科技向善”为指引&#xff0c;旨在推动开源技术和社区的发展&#xff0c;加强产学研合作&…

基于单片机的无线报警系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、整体设计方案二、 系统的总体方案论证与设计2.1系统的功能要求2.2 系统的技术要求2.3 系统的方案论证及设计2.3.…

PHP进销存ERP系统源码

PHP进销存ERP系统源码 系统介绍&#xff1a; 扫描入库库存预警仓库管理商品管理供应商管理。 1、电脑端手机端&#xff0c;手机实时共享&#xff0c;手机端一目了然。 2、多商户Saas营销版 无限开商户&#xff0c;用户前端自行注册&#xff0c;后台管理员审核开通 3、管理…

更快更准 | YOLOv3算法超详细解析(包括诞生背景+论文解析+技术原理等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv3是一种基于深度学习的目标检测算法&#xff0c;它可以快速而准确地在图像中检测出多个目标。它是由Joseph Redmon和Ali Farhadi在2018年提出的&#xff0c;是YOLO&#xff08;You Only Look Once&#xff09;系列算法…

写了上千篇文章总结出来的高质量文章内容要点

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f34a; 1. 确定文章主题&#x1f34a; 2. 确定目标读者&#x1f34a; 3. 研究资料和信息&#x1f34a; 4. 制定写作计划&#x1f34a; 5. 确定文章结构&#x1f389; 5.1引言&#x1f389; 5.2主体&#x1f389; 5.…