深入理解强化学习——马尔可夫决策过程:贝尔曼期望方程-[举例与代码实现]

news2024/9/25 14:39:57

分类目录:《深入理解强化学习》总目录


在文章《深入理解强化学习——马尔可夫决策过程:贝尔曼期望方程-[基础知识]》中我们讲到了贝尔曼期望方程,本文就举一个贝尔曼期望方程的具体例子,并给出相应代码实现。

下图是一个马尔可夫决策过程的简单例子,其中每个深色圆圈代表一个状态,一共有 s 1 ∼ s 5 s_1\sim s_5 s1s5共5个状态。黑色实线箭头代表可以采取的动作,浅色小圆圈代表动作,需要注意的是,并非在每个状态都能采取所有动作,例如在状态 s 1 s_1 s1,智能体只能采取“保持 s 1 s_1 s1”和“前往 s 2 s_2 s2”这两个动作,无法采取其他动作。
马尔可夫决策过程的一个简单例子
每个浅色小圆圈旁的数字代表在某个状态下采取某个动作能获得的奖励。虚线箭头代表采取动作后可能转移到的状态,箭头边上的数字代表转移概率,如果没有数字则表示转移概率为1。例如,在 s 2 s_2 s2下, 如果采取动作“前往 s 3 s_3 s3”,就能得到奖励 − 2 -2 2,并且转移到 s 3 s_3 s3;在 s 4 s_4 s4下,如果采取“概率前往”,就能得到奖励 1 1 1,并且会分别以概率 0.2 , 0.4 , 0.4 0.2, 0.4, 0.4 0.2,0.4,0.4转移到 s 2 s_2 s2, s 3 s_3 s3 s 4 s_4 s4

下面我们编写代码来表示上图中的马尔可夫决策过程,并定义两个策略。第一个策略是一个完全随机策略,即在每个状态下,智能体会以同样的概率选取它可能采取的动作。例如,在 s 1 s_1 s1下,智能体会以 0.5 0.5 0.5 0.5 0.5 0.5的概率选取动作“保持 s 1 s_1 s1”和“前往 s 2 s_2 s2”。第二个策略是一个提前设定的一个策略:

S = ["s1", "s2", "s3", "s4", "s5"]  # 状态集合
A = ["保持s1", "前往s1", "前往s2", "前往s3", "前往s4", "前往s5", "概率前往"]  # 动作集合
# 状态转移函数
P = {
    "s1-保持s1-s1": 1.0,
    "s1-前往s2-s2": 1.0,
    "s2-前往s1-s1": 1.0,
    "s2-前往s3-s3": 1.0,
    "s3-前往s4-s4": 1.0,
    "s3-前往s5-s5": 1.0,
    "s4-前往s5-s5": 1.0,
    "s4-概率前往-s2": 0.2,
    "s4-概率前往-s3": 0.4,
    "s4-概率前往-s4": 0.4,
}
# 奖励函数
R = {
    "s1-保持s1": -1,
    "s1-前往s2": 0,
    "s2-前往s1": -1,
    "s2-前往s3": -2,
    "s3-前往s4": -2,
    "s3-前往s5": 0,
    "s4-前往s5": 10,
    "s4-概率前往": 1,
}
gamma = 0.5  # 折扣因子
MDP = (S, A, P, R, gamma)

# 策略1,随机策略
Pi_1 = {
    "s1-保持s1": 0.5,
    "s1-前往s2": 0.5,
    "s2-前往s1": 0.5,
    "s2-前往s3": 0.5,
    "s3-前往s4": 0.5,
    "s3-前往s5": 0.5,
    "s4-前往s5": 0.5,
    "s4-概率前往": 0.5,
}
# 策略2
Pi_2 = {
    "s1-保持s1": 0.6,
    "s1-前往s2": 0.4,
    "s2-前往s1": 0.3,
    "s2-前往s3": 0.7,
    "s3-前往s4": 0.5,
    "s3-前往s5": 0.5,
    "s4-前往s5": 0.1,
    "s4-概率前往": 0.9,
}


# 把输入的两个字符串通过“-”连接,便于使用上述定义的P、R变量
def join(str1, str2):
    return str1 + '-' + str2

接下来我们想要计算该马尔可夫决策过程下,一个策略 π \pi π的状态价值函数。我们现在有的工具是马尔可奖励过程的解析解方法。于是,一个很自然的想法是:给定一个马尔可夫决策过程和一个策略,我们是否可以将其转化为一个马尔可夫奖励过程?答案是肯定的。我们可以将策略的动作选择进行边缘化(Marginalization),就可以得到没有动作的马尔可夫奖励过程了。具体来说,对于某一个状态,我们根据策略所有动作的概率进行加权,得到的奖励和就可以认为是一个马尔可夫奖励过程在该状态下的奖励,即:
r ‘ ’ ( s ) = ∑ a ∈ A π ( a ∣ s ) r ( s , a ) r_‘’(s)=\sum_{a\in A}\pi(a|s)r(s, a) r(s)=aAπ(as)r(s,a)

同理,我们计算采取动作的概率与使 s s s转移到的 s ′ s' s概率的乘积,再将这些乘积相加,其和就是一个马尔可夫奖励过程的状态从转移至的概率:
P ′ ( s ′ ∣ s ) = ∑ s ∈ A π ( a ∣ s ) P ( s ′ ∣ s , a ) P'(s'|s)=\sum_{s\in A}\pi(a|s)P(s'|s, a) P(ss)=sAπ(as)P(ss,a)

于是,我们构建得到了一个马尔可夫奖励过程 ( S , P ′ , r ′ , γ ) (S, P', r', \gamma) (S,P,r,γ)。根据价值函数的定义可以发现,转化前的马尔可夫决策过程的状态价值函数和转化后的马尔可夫奖励过程的价值函数是一样的。于是我们可以用马尔可夫奖励过程中计算价值函数的解析解来计算这个马尔可夫决策过程中该策略的状态价值函数。

下面的代码计算用随机策略(也就是代码中的Pi_1)时的状态价值函数。为了简单起见,我们直接给出转化后的马尔可夫将来过程的状态转移矩阵和奖励函数:

gamma = 0.5
# 转化后的MRP的状态转移矩阵
P_from_mdp_to_mrp = [
    [0.5, 0.5, 0.0, 0.0, 0.0],
    [0.5, 0.0, 0.5, 0.0, 0.0],
    [0.0, 0.0, 0.0, 0.5, 0.5],
    [0.0, 0.1, 0.2, 0.2, 0.5],
    [0.0, 0.0, 0.0, 0.0, 1.0],
]
P_from_mdp_to_mrp = np.array(P_from_mdp_to_mrp)
R_from_mdp_to_mrp = [-0.5, -1.5, -1.0, 5.5, 0]

V = compute(P_from_mdp_to_mrp, R_from_mdp_to_mrp, gamma, 5)
print("MDP中每个状态价值分别为\n", V)

输出:

MDP中每个状态价值分别为
 [[-1.22555411]
 [-1.67666232]
 [ 0.51890482]
 [ 6.0756193 ]
 [ 0.        ]]

知道了状态价值函数 V π ( s ) V_\pi(s) Vπ(s)后,我们可以根据以下公式计算得到动作价值函数 Q π ( s , a ) Q_\pi(s, a) Qπ(s,a)。例如 ( s 4 , 概率前往 ) (s_4, \text{概率前往}) (s4,概率前往)的动作价值为 1 + 0.5 × [ 0.2 × ( − 1.68 ) + 0.4 × 0.52 + 0.4 × 6.08 ] = 2.152 1+0.5\times[0.2\times(-1.68)+0.4\times0.52+0.4\times6.08]=2.152 1+0.5×[0.2×(1.68)+0.4×0.52+0.4×6.08]=2.152
Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) Q_\pi(s, a)=r(s, a)+\gamma\sum_{s'\in S}P(s'|s, a)V_\pi(s') Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)

这个 MRP 解析解的方法在状态动作集合比较大的时候不是很适用,那有没有其他的方法呢?第 4 章将介绍用动态规划算法来计算得到价值函数。3.5 节将介绍用蒙特卡洛方法来近似估计这个价值函数,用蒙特卡洛方法的好处在于我们不需要知道 MDP 的状态转移函数和奖励函数,它可以得到一个近似值,并且采样数越多越准确。

参考文献:
[1] 张伟楠, 沈键, 俞勇. 动手学强化学习[M]. 人民邮电出版社, 2022.
[2] Richard S. Sutton, Andrew G. Barto. 强化学习(第2版)[M]. 电子工业出版社, 2019
[3] Maxim Lapan. 深度强化学习实践(原书第2版)[M]. 北京华章图文信息有限公司, 2021
[4] 王琦, 杨毅远, 江季. Easy RL:强化学习教程 [M]. 人民邮电出版社, 2022

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

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

相关文章

Harmony OS4开发入门

代码地址: https://gitee.com/BruceLeeAdmin/harmonyos/tree/master 项目目录介绍 ArkTS介绍 简单案例: State times: number 0/*数据类型:stringnumberany: 不确定类型,可以是任意类型*/State msg: string "hello"…

正点原子linux应用编程——提高篇1

在之前的入门篇学习中,都是直接在Ubuntu中进行验证的,对于嵌入式Linux系统来说,也是可以直接移植的,只需要使用嵌入式硬件平台对应的交叉编译工具编译应用程序即可运行。 在嵌入式Linux系统中,编写的应用程序通常需要…

uniapp使用vue3和ts开发小程序获取用户城市定位

这个组件的功能:可以重新定位获取到用户的具体位置,这个是通过getLocation这个api和高德地图的api获取到的,getLocation这个api需要在微信公众平台后台>开发管理> 接口管理里面申请才能使用的,不然无法使用哦,这…

数学老师怎么和家长沟通

作为一名数学老师,与家长建立良好的沟通关系是非常重要的。以下是我个人认为可以帮助与家长有效沟通的建议: 建立良好的第一印象 第一次与家长接触时,要尽可能展现出你的专业素养和热情。在交流中,要表达出你对孩子的关心和重视&…

Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件,是用来代替原来的Android.mk文件的。在Android7.0以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。在Android7.0开始,Google引入了ninja和kat…

接口文档自动生成工具:详细教程和实用技巧

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点: 自动生成接口文档: 不用手写,一键点击就可以自动 生成文档,当有更新时,点击一下就可以自动同步接口文档;代…

小程序静默授权获取unionid

文章目录 导文文章重点 导文 小程序静默授权获取unionid 文章重点 用wx.login(Object object)放到app.js里面 wx.login({success (res) {console.log(123);if (res.code) {//发起网络请求// wx.request({// url: https://example.com/onLogin,// data: {// code: res.…

ERRO报错

无法下载nginx 如下解决: 查看是否有epel 源 安装epel源 安装第三方 yum -y install epel-release.noarch NGINX端口被占用 解决: 编译安装的NGINX配置文件在/usr/local/ngin/conf 修改端口

AI - Navmesh 寻路

用cocos2dx引擎简单实现了一下navmesh的多边形划分,然后基于划分多边形的a*寻路。以及路径拐点优化算法 用cocos主要是方便使用一些渲染接口和定时器。重点是实现的原理。 首先画了一个带有孔洞的多边形 //多边形的顶点数据Vec2(100, 100),Vec2(300, 200),Vec2(50…

程序员的软件开发帮手,低代码当仁不让

目录 一、低代码是什么? 二、低代码的能力表现 1.提供可视化开发 2.预构建的组件和模板 3.集成的开发和测试工具 4.跨平台兼容性 5.可伸缩性和可扩展性: 跟随互联网信息技术快速发展的脚步,各行各业都在积极拥抱数字化转型。在这个过程中&…

详解STL库—map和set

目录 一、关联式容器 二、键值对 SGI-STL中关于键值对的定义: 三、set 3.1 set的介绍 3.2 set的使用 1.set的模板参数列表​编辑 2. set的构造 3. set的迭代器 4. set的容量 5. set修改操作 6. set的使用举例 四、map 4.1map的介绍 4.2 map的使用 1…

国产操作系统-银河麒麟V10

一、介绍 银河麒麟操作系统隶属于麒麟软件,麒麟软件是专业从事国产操作系统研发和产业化的企业,面向通用和专用领域打造安全创新的国产操作系统产品和相应解决方案,旗下拥有银河麒麟、中标麒麟、星光麒麟三大产品品牌。 麒麟软件官方网站地…

【攻防世界-misc】glance-50

1.得到一个动图 2.使用GIF动态图片分解,多帧动态图分解成多张静态图片_图片工具网页版,将图片定格组合, 由此得到flag值,拼写提交。

卡码网语言基础课 | 15. 链表的基础操作Ⅲ

目录 一、 插入链表的过程 二、 删除链表的过程 三、 打印链表 3.1 判断节点是否处于链尾 3.2 打印链表 3.3 循环体结束,遍历打印 题目: 请编写一个程序,实现以下链表操作:构建一个单向链表,链表中包含一组整数…

c++没有返回值的返回值

上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度 int search(int n) { 00007FF66DB723E0 mov dword ptr [rsp8],e…

【Linux系统编程】进程概念详解(什么是进程?如何查看进程?)

目录 一、前言 二、 什么是进程? 💦引出进程 💦进程的基本概念 💦理解进程 ⭐描述进程--PCB(进程控制块) ⭐组织进程 三、查看进程 💦 通过 ps 命令查看进程 💦 通过 l…

事件代理?

1.什么是事件代理? 事件代理也叫事件委托,只指定一个事件处理程序,就可以管理某一类型得事件。 可以简单理解为,事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是:减少事件得执行,减少浏…

2023/11/28JAVAweb学习

查找哪个进程占用了该端口号 跳过某一个阶段

欧拉公式推导

欧拉恒等式 函数推导过程(幂级数展开的方式近似,后面用到了三角函数展开的方式) 从导数中推导的方程,对于该函数当x0时为1即初值,导数为自身; 设,当x 0时, 因为函数是收敛的所以会越来越精确(引用自MIT公开课&#xf…

激光器温度,波长变化

940,波长变化0.3nm/C