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

前言:

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

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

: 在状态x 下面,执行动作a ,转移到状态 的概率

: 在状态x 下面,执行动作a ,转移到 的奖赏

有模型强化学习的应用案例

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

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

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


目录:

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

一 策略评估

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

假设:

状态值函数: : 从状态x 出发,使用策略,带来的累积奖赏

状态-动作值函数 : 从状态x 出发,执行动作a,再使用策略,带来的累积奖赏

由定义:

状态值函数为:

: T 步累积奖赏

: 折扣累积奖赏,

状态-动作值函数

T 步累积奖赏

折扣累积奖赏

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

2.2 r折扣累积奖赏

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

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

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

函数值小于,停止迭代


二 Bellman Equation(贝尔曼方程)

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

2.2state-value function

给定策略 时,基于 state 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 - 知乎

相关推荐
西岸行者9 小时前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意10 小时前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码11 小时前
嵌入式学习路线
学习
毛小茛13 小时前
计算机系统概论——校验码
学习
babe小鑫13 小时前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms14 小时前
ROS2知识大白话
笔记·学习·ros2
在这habit之下14 小时前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。14 小时前
2026.2.25监控学习
学习
im_AMBER14 小时前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J14 小时前
从“Hello World“ 开始 C++
c语言·c++·学习