强化学习5——动态规划在强化学习中的应用

本文探讨了动态规划在强化学习中的应用,特别是策略迭代和价值迭代方法,通过实例化悬崖漫步环境来展示如何使用这些算法。算法利用环境的状态转移函数和奖励函数,避免智能体与环境的大量交互,适用于有限马尔可夫决策过程。
摘要由CSDN通过智能技术生成

动态规划在强化学习中的应用

基于动态规划的算法优良 :策略迭代价值迭代

策略迭代分为策略评估和策略提升,使用贝尔曼期望方程得到一个策略的状态价值函数;价值迭代直接使用贝尔曼最优方程进行动态规划,得到最终的最优状态价值。

基于动态规划的算法需要知道环境的状态转移函数奖励函数,不需要通过智能体与环境的大量交互中学习,直接用动态规划求解状态价值函数,只适用于有限马尔可夫决策过程,即状态空间和动作空间是离散且有限的。

悬崖漫步环境

与上一节介绍的算法题类似,要求智能体从起点出发,避开悬崖,走到终点,且智能体无法越过边界。智能体走到悬崖,或者到达目标时,结束动作并回到起点。智能体每个状态可以采取四种动作:上下左右,智能体每走一步的奖励是 −1,掉入悬崖的奖励是 −100。

image.png

我们使用代码,定义一个4×12的环境

import copy
class CliffWalkingEnv:
    def __init__(self, ncol=12,nrow=3):
        self.ncol = ncol
        self.nrow = nrow
        # 转移矩阵P[state][action] = [(p, next_state, reward, done)]包含下一个状态和奖励
        self.P=self.createP()
        
    def createP(self):
        # 初始化,每一个动作对应四个值
        P=[[[] for j in range(4) ] for i in range(self.ncol*self.nrow)]
        # 定义四种动作,一次为上下左右,坐标系原点为(0,0),定义在左上角
        # 向下、向右是正数,向左、向上为负数
        change=[[0,-1],[0,1],[-1,0],[1,0]]
        for i in range(self.nrow):
            for j in range(self.ncol):
                # 对上下左右进行遍历
                for a in range(4):
                    # 掉到悬崖或者到达终点,无法继续交互,动作的奖励为0
                    # 定义最下面的一行是悬崖,右下角为终点,其余行都是地面
                    # 左下角为起点
                    if i==self.nrow -1 and j>0:
                        # 如果为3行,那么i=2,i*self.ncol+j表示智能体所在的位置
                        # 相当于将棋盘格展开成一条线,下标为i*self.ncol+j
                        # 下一个状态还是本位置
                        P[i*self.ncol+j][a]=[(1,i*self.ncol+j,0,True)]
                        continue
                    # 其他位置
                    # max(0,j+change[a][0])是为了防止越界,防止下一个位置小于0
                    # 如果判断为越界,则取0
                    # min(self.ncol-1,max(0,j+change[a][0]))
                    # 防止数值大于self.ncol-1,如果大于self.ncol-1,则取self.ncol-1
                    nextX=min(self.ncol-1,max(0,j+change[a][0]))
                    nextY=min(self.nrow-1,max(0,i+change[a][1]))
                    nextState=nextY*self.ncol+nextX
                    reward=-1
                    done=False
                    # 下一个位置在悬崖或者终点
                    if nextY==self.nrow-1 and nextX>0:
                        done = True
                        #如果下一个位置不是终点(即是悬崖)
                        if nextX != self.ncol-1:
                            reward = -100
                    P[i*self.ncol+j][a]=[(1,nextState,reward,done)]
        return P
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值