强化学习复现笔记(2)策略迭代

news2024/12/22 18:43:21

摘要: 上一节的压缩映射在实际迭代时可以分成两种方法,分别称作值迭代和策略迭代。本文用走迷宫的例子(将1维迷宫扩展到2维)讲这两种迭代。对应第一节参考链接[2]的前4章。

拆分压缩映射

  上一节的压缩映射 v = f ( v ) v=f(v) v=f(v),展开写就是
v ( s ) = max ⁡ π ∑ a π ( a ∣ s ) q ( s , a ) = max ⁡ a q ( s , a ) = max ⁡ a [ r ( s , a ) + γ v ( s ′ ) ] = max ⁡ [ r ( s , L ) + γ v ( s L ) , r ( s , R ) + γ v ( s R ) ] \begin{aligned} v(s) =& \max_\pi\sum_a\pi(a|s)q(s,a) \\ =& \max_a q(s,a) \\ =& \max_a[r(s,a)+\gamma v(s')] \\ =& \max[r(s,L)+\gamma v(s_L), r(s,R)+\gamma v(s_R)] \end{aligned} v(s)====πmaxaπ(as)q(s,a)amaxq(s,a)amax[r(s,a)+γv(s)]max[r(s,L)+γv(sL),r(s,R)+γv(sR)]
中实际上每次迭代都隐含了两步,这两步按执行的先后顺序分为值迭代和策略迭代,之前例子是值迭代,因为过于简单看不出区别(一步迭代就找到了最优策略),这次换个复杂的例子。这个式子中的 v ( s L ) v(s_L) v(sL) v ( s R ) v(s_R) v(sR) 分别表示当前状态左右两侧状态的价值函数,与策略有关,但策略又与状态价值函数有关,所以按照先更新价值函数还是先更新策略的不同分为两种迭代方法,值迭代和策略迭代。
  值迭代 指先找出使 q ( s , a ) q(s,a) q(s,a) 最大时的 π \pi π,再迭代一步 v = f ( v ) v=f(v) v=f(v) 称作值迭代。走迷宫时, q ( s , a ) q(s,a) q(s,a) 建立成一个Q表,每次迭代中,找出表中Q值最大的动作作为 f ( v ) f(v) f(v),然后求 v = f ( v ) v=f(v) v=f(v)
  策略迭代 与值迭代相反,先迭代一步 v = f ( v ) v=f(v) v=f(v),再找出使 q ( s , a ) q(s,a) q(s,a) 最大时的 π \pi π,称作策略迭代。
  这里有个问题,使 q ( s , a ) q(s,a) q(s,a) 最大时的 π \pi π 应该是个定值,那么如果最优策略 π \pi π 是个随机变量,是不是就迭代不到最优策略?

走迷宫的例子

  每个格子处有右上左下和不动5种状态,一开始的策略是每个状态都保持不动。策略编号0~5分别表示不动和右上左下。下图的迷宫中有一个终点和多个陷阱,回合奖励分别为 1 1 1 − 10 -10 10。目标为从左上角出发走到终点。
在这里插入图片描述

策略迭代

收敛后每个格子的状态价值函数如下图所示。
在这里插入图片描述
收敛后每个格子的策略如下图所示。
在这里插入图片描述

值迭代

附代码

策略迭代

import numpy as np

strategy = np.zeros([5, 5], dtype=int)
gamma = 0.8
MAZE_TRAP = [(1, 1), (1, 2), (2, 2), (3, 1), (3, 3), (4, 1)]  # 陷阱
MAZE_TERM = (3, 2)  # 终点

# 找出一个数组中的最大值索引,如果有多个最大值,就从中随机取一个
def Argmax_Rand(x: list) -> int:
    bestv = -1e12
    samevaluei = np.zeros(len(x), dtype=int)
    samecnt = 0
    for n in range(len(x)):
        if x[n] < bestv:
            continue
        elif x[n] > bestv:
            bestv = x[n]
            samecnt = 0
        samevaluei[samecnt] = n
        samecnt += 1
    return samevaluei[np.random.randint(samecnt)]

# 返回与一个网格`grid`相邻的第`adjacent`处方位的网格
def Find_Adjacent(grid: tuple, adjacent: int) -> tuple:
    ans = list(grid)
    if adjacent == 1:
        ans[1] += 1
    elif adjacent == 2:
        ans[0] -= 1
    elif adjacent == 3:
        ans[1] -= 1
    elif adjacent == 4:
        ans[0] += 1
    ans[0] = 0 if ans[0] < 0 else ans[0]
    ans[0] = 4 if ans[0] > 4 else ans[0]
    ans[1] = 0 if ans[1] < 0 else ans[1]
    ans[1] = 4 if ans[1] > 4 else ans[1]
    return tuple(ans)

# 迭代函数
def fx(x):
    y = np.zeros([5, 5])
    for m in range(5):  # 行
        for n in range(5):  # 列
            adjacent = Find_Adjacent((m, n), strategy[m, n])
            actionValue = gamma * x[adjacent]
            if adjacent in MAZE_TRAP:
                actionValue += -10
            elif adjacent == MAZE_TERM:
                actionValue += 1
            y[m, n] = actionValue
    return y

# 对每个格子进行策略改善
# grid: 当前格子
# value: 当前策略下的价值函数矩阵
# return: 当前格子的新策略
def Policy_Imporvement(grid: tuple, value):
    actionValues = []
    for m in range(5):  # 5个策略
        adjacent = Find_Adjacent(grid, m)
        actionValue = gamma * value[adjacent]
        if adjacent in MAZE_TRAP:
            actionValue += -10
        elif adjacent == MAZE_TERM:
            actionValue += 1
        actionValues.append(actionValue)
    return Argmax_Rand(actionValues)

# 主函数
vold = np.zeros([5, 5])
cntPolicyIter = 0
cntValueIters = []
while 1:
    # 策略评估(policy evaluation, PE)
    cntValueIter = 0
    while 1:
        vnew = fx(vold)
        err = sum(sum(vnew - vold))**2
        if err < 1e-6:  # 状态价值函数收敛时退出
            break
        vold = vnew
        cntValueIter += 1  # 策略评估的迭代步数
    pass
    # 策略改善(policy improvement, PI)
    strategyOld = strategy.copy()
    for m in range(5):  # 行
        for n in range(5):  # 列
            strategy[m, n] = Policy_Imporvement((m, n), vnew)  # 更新策略
    err = sum(sum(strategyOld - strategy))**2
    if err < 1e-6:  # 策略收敛时退出
        break
    cntPolicyIter += 1
    cntValueIters.append(cntValueIter)
print(cntPolicyIter)
print(cntValueIters)

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

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

相关文章

打造科学新高地|2023开放原子全球开源峰会科学智能分论坛圆满举行

6 月 11 日&#xff0c;以“AI 框架助力科学智能&#xff0c;打造科学新高地”为主题的 2023 开放原子全球开源峰会科学智能分论坛在北京圆满举行。北京航空航天大学计算机学院党委书记、教授李建欣参加并致辞&#xff1b;华为昇思 MindSpore 架构师倪宁曦、研究员徐旭升&#…

const用于C++引用(注意事项)

const用于C引用 存在的问题解决方法原理 存在的问题 左值是可以被引用的数据对象&#xff0c;可以通过地址访问它们&#xff0c;例如&#xff1a;变量、数组元素、结构体成员、引用和解引用的指针。 非左值包括字面常量&#xff08;用双引号包含的字符串除外&#xff09;和包含…

公司普通启动VR/AR软件开发虚拟场景游戏

随着元宇宙技术的不断革新&#xff0c;VR作为一种新兴技术&#xff0c;正在迅速普及。VR软件开发技术将用户沉浸到虚拟世界中&#xff0c;让人们可以身临其境地体验一些事物&#xff0c;如元宇宙游戏、商圈、展会、旅游等。而VR虚拟场景的开发&#xff0c;则是实现这一目标的重…

WRF进阶:使用ERA5-land数据驱动WRF/WRF撰写Vtable文件添加气象场

想用WRF模拟地气交换过程&#xff0c;对于WRF的地表数据&#xff0c;尤其是土壤温湿度数据要求便会很大&#xff0c;传统使用ERA5-singledata数据精度也许不足以满足需求&#xff0c;为此&#xff0c;本文尝试使用ERA5-land数据替换驱动WRF。 数据下载 ERA5-land的数据下载与…

2023 届 Java 岗高频面试题盘点,老司机也未必全会

2023&#xff0c;可谓是招聘面试最难季。不少大厂&#xff0c;如腾讯、字节的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言。今天不谈其它&#xff0c;就说说我作为面试官面试的那些事儿。 从某电商项…

【笔试强训选择题】Day25.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

不愧是阿里大牛珍藏的“redis深度笔记(全彩版)”这细节讲解,神了

前言 说到 Redis 相信对于我们这些程序员来说太熟悉了&#xff0c;Redis 凭借着自己超高的超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持&#xff0c;很快就在国内的互联网市场占据了一席之地&#xff0c;得到了广大用户的一致好评&#xff0c;随着国内外使用 …

反射---getattr,hasattr,setattr,delattr加插播enumerate

什么是反射&#xff1f; 用字符串数据类型的变量名来访问这个变量的值 反射的方法&#xff1a;getattr&#xff0c;hasattr&#xff0c;setattr&#xff0c;delattr 类&#xff1a;(通过类名反射类名空间里面的内容的) 类&#xff1a;静态属性&#xff0c;类方法&#xff0c;静…

Vue中如何进行代码高亮与语法着色?

Vue中如何进行代码高亮与语法着色&#xff1f; 在Vue的开发过程中&#xff0c;我们经常需要展示代码片段或者进行代码高亮与语法着色。Vue提供了多种方式来实现代码高亮与语法着色&#xff0c;本文将为你详细介绍这些方法。 1. 使用prism.js进行代码高亮与语法着色 prism.js是…

mybatis的一级缓存和二级缓存

目录 1、简介 2、Mybatis缓存 3、一级缓存 3.1、初体验测试 3.2、一级缓存失效的四种情况 4、二级缓存 4.1、使用步骤 4.2、结论 5、缓存原理 1、简介 什么是缓存 [ Cache ]&#xff1f; 存在内存中的临时数据。将用户经常查询的数据放在缓存&#xff08;内存&…

gomod在项目中的作用

Part1gomod在golang项目中的作用 1介绍 gomod是Go语言中一个非常重要的工具&#xff0c;它在Golang项目的开发过程中扮演着关键的角色。gomod是模块依赖管理工具&#xff0c;可以帮助开发者更好地管理和组织项目的依赖关系&#xff0c;提供了便捷的方式来管理和升级依赖项。 2为…

gtk实现spice剪切板

重要的函数&#xff1a; void spice_main_channel_clipboard_selection_grab(SpiceMainChannel *channel, guint selection, guint32 *types, int ntypes); 抓取剪切板 void spice_main_channel_clipboard_selection_release(SpiceMainChannel *channel, guint selection); 剪…

软件项目管理需要具备哪些能力?

作为一名软件项目管理者&#xff0c;在处理许多事情时需要不断提高个人在数据分析处理、项目业务流程管理等各个领域的能力。当然作为过来人&#xff0c;我也很清楚很多软件项目管理新人也较为疑惑如何提高自己的能力和专业水平&#xff0c;以便提高工作效率。那我也想与大家唠…

【论文阅读笔记】Local Model Poisoning Attacks to Byzantine-Robust Federated Learning

个人阅读笔记&#xff0c;如有错误欢迎指出&#xff01; 会议&#xff1a; Usenix 2020 [1911.11815] Local Model Poisoning Attacks to Byzantine-Robust Federated Learning (arxiv.org) 问题&#xff1a; 模型攻击对拜占庭鲁棒性联邦学习的攻击效果尚未清楚 创新点&…

SpringBatch从入门到实战(六):ItemReader

一&#xff1a;ListItemReader 用于简单的开发测试。 Bean public ItemReader<String> listItemReader() {return new ListItemReader<>(Arrays.asList("a", "b", "c")); }二&#xff1a;FlatFileItemReader 1.1 完全映射 当文件…

万物云原生下的服务进化 | 京东云技术团队

导读&#xff1a; 在万物云原生下的环境下&#xff0c;Java的市场份额也因耗资源、启动慢等缺点&#xff0c;导致在云原生环境里被放大而降低&#xff0c;通过这篇文章&#xff0c;读者可以更好地了解如何在云原生环境下通过升级相关版本和使用GraalVM打出原生镜像到方式&…

Linux之特殊权限

目录 Linux之特殊权限 SUID 定义 案例 原因 查找真个系统的SUID/SGID文件 SGID 定义&#xff1a; Sticky Bit 案例 设置文件和目录的特殊权限 方法一 使用 chmod命令 方法二 使用数字形式的权限模式 设置新建文件或目录的默认权限 设置修改文件的扩展性 设置文件…

MySQL连接查询——外连接

内连接查询顺序 首先看student和exam表的内容&#xff1a; 然后执行如下内连接查询&#xff1a; explain select a.*,b.* from student a inner join exam b on a.uidb.uid;查询计划如下 由于a表记录数量少为小表做全表扫描&#xff08;rows为6&#xff09;&#xff0c;然后到…

微信小程序标签知识点总结

View 标签 <scroll-view class"scroll_list" scroll-x"true"> 标签 设置 scroll-x/y是可以设置 滚动模式到底是x方向还是Y方向 &#xff08; 需要调整样式&#xff0c;请参考如下 .scroll_list{ border: 1px solid red; width: 240px; white-sp…

算法学习day21

文章目录 530.二叉搜索树的最小绝对差递归 501.二叉搜索树中的众数递归 236.二叉树的最近公共祖先递归 总结 530.二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值…