【动手学强化学习】03马尔可夫决策过程

马尔可夫决策过程始终贯穿强化学习,要学好强化学习,必须掌握马尔可夫决策过程的基础知识。与多臂老虎机不同,马尔可夫决策过程包含状态信息以及状态转移机制。

马尔可夫过程

当且仅当某时刻的状态只取决于上个时刻的状态时,一个随机过程被称为具有马尔可夫性质。
P ( S t + 1 ∣ S t ) = P ( S t + 1 ∣ S 1 , S 2 , . . . , S t ) P(S_{t+1}|S_{t}) = P(S_{t+1}|S_{1}, S_{2},...,S_{t}) P(St+1St)=P(St+1S1,S2,...,St)

而具有马尔可夫性质的随机过程就称为马尔可夫过程,我们通常用一个元组表示 < S , P > <S, P> <S,P> S S S 是状态集合 { s 1 , s 2 , s 3 , . . . } \{s_1, s_2, s_3, ...\} {s1,s2,s3,...} P P P 是状态转移矩阵,表明状态之间相互转移的概率。
P = [ P ( s 1 ∣ s 1 ) ⋯ P ( s n ∣ s 1 ) ⋮ ⋱ ⋮ P ( s 1 ∣ s n ) ⋯ P ( s n ∣ s n ) ] \mathcal{P} = \begin{bmatrix} P(s_1 | s_1) & \cdots & P(s_n | s_1) \\ \vdots & \ddots & \vdots \\ P(s_1 | s_n) & \cdots & P(s_n | s_n) \end{bmatrix} P= P(s1s1)P(s1sn)P(sns1)P(snsn)
在这里插入图片描述

例如对于上面这个随机过程我们就可以表示为:

S = [0, 1, 2, 3, 4, 5]
P = [[0.9, 0.1, 0, 0, 0, 0],[0.5, 0, 0.5, 0, 0, 0],[0, 0, 0, 0.6, 0, 0.4],[0, 0, 0, 0, 0.3, 0.7],[0, 0.2, 0.3, 0.5, 0, 0],[0, 0, 0, 0, 0, 1]]
P = np.array(P)

马尔可夫奖励过程

在马尔可夫过程的基础上加入奖励函数 r r r 和折扣因子 γ \gamma γ,就可以得到马尔可夫奖励过程,我们通常用 ( S , P , r , γ ) (\mathcal{S}, \mathcal{P}, r, \gamma) (S,P,r,γ) 表示。

在一个马尔可夫奖励过程中, 从 t 时刻状态 S t S_t St 开始,到终止状态时,衰减奖励之和记作回报 G t G_t Gt,即
G t = R t + γ G t + 1 G_t = R_t + \gamma G_{t+1} Gt=Rt+γGt+1
在这里插入图片描述
比如我们选择 s 5 s_5 s5 为起点,设置 γ = 0.5 \gamma=0.5 γ=0.5,选择的路径是 s 5 → s 2 → s 3 → s 4 → s 6 s_5 \rightarrow s_2 \rightarrow s_3 \rightarrow s_4 \rightarrow s_6 s5s2s3s4s6。则在这个过程中 s 5 s_5 s5 的回报 G 1 = 1 + 0.5 ∗ − 2 + 0.25 ∗ − 2 + 0.125 ∗ 10 + 0.0625 ∗ 0 = 0.75 G_1 = 1 + 0.5 * -2 + 0.25 * -2 + 0.125*10+0.0625*0=0.75 G1=1+0.52+0.252+0.12510+0.06250=0.75

P = [[0.9, 0.1, 0, 0, 0, 0],[0.5, 0, 0.5, 0, 0, 0],[0, 0, 0, 0.6, 0, 0.4],[0, 0, 0, 0, 0.3, 0.7],[0, 0.2, 0.3, 0.5, 0, 0],[0, 0, 0, 0, 0, 1]]
P = np.array(P)reward = [-1, -2, -2, 10, 1, 0]
gamma = 0.5def compute_return(start_index, chain, gamma):G = 0for i in reversed(range(start_index, len(chain))):G = gamma * G + reward[chain[i]-1]return Gchain = [5, 2, 3, 4, 6]
start_index = 0
G = compute_return(start_index, chain, gamma)
print("根据本序列计算得到回报为:%s。" % G)

在马尔可夫奖励过程中,一个状态的期望回报被称为这个状态的价值。所有状态的价值就组成了价值函数 V ( s ) V(s) V(s)
V ( s ) = r ( s ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s ) V ( s ′ ) V(s) = r(s) + \gamma\sum_{s'\in S}{p(s'|s)V(s')} V(s)=r(s)+γsSp(ss)V(s)
其中, r ( s ) r(s) r(s) 是即时奖励, p ( s ′ ∣ s ) p(s'|s) p(ss) 为状态转移概率。

上式就是马尔可夫奖励过程中非常有名的贝尔曼方程。相信大家已经看出来了,这个方程具有解析解。
V = R + γ P V \mathcal{V} = \mathcal{R} + \gamma \mathcal{P} \mathcal{V} V=R+γPV

( I − γ P ) V = R (I - \gamma \mathcal{P}) \mathcal{V} = \mathcal{R} (IγP)V=R

V = ( I − γ P ) − 1 R \mathcal{V} = (I - \gamma \mathcal{P})^{-1} \mathcal{R} V=(IγP)1R

def compute(P, reward, gamma, status_num):rewards = np.array(reward).reshape((-1, 1))value = np.dot(np.linalg.inv(np.eye(status_num, status_num)-gamma * P), rewards)return valuev = compute(P, reward, gamma, 6)
print("MRP中每个状态价值分别为\n", v)

马尔可夫决策过程

马尔可夫过程和马尔可夫奖励过程都是自发改变的随机过程;而如果有一个外界的“刺激”来共同改变这个随机过程,就有了马尔可夫决策过程

我们将这个来自外界的刺激称为智能体的动作,在马尔可夫奖励过程(MRP)的基础上加入动作,就得到了马尔可夫决策过程(MDP),记作 ( S , A , P , r , γ ) (\mathcal{S}, \mathcal{A}, \mathcal{P}, r, \gamma) (S,A,P,r,γ)
在这里插入图片描述

在马尔可夫决策过程中,通常存在一个智能体来执行动作。智能体根据当前状态选择动作;MDP 根据奖励函数和状态转移函数得到和并反馈给智能体。智能体的目标是最大化得到的累计奖励。智能体根据当前状态从动作的集合中选择一个动作的函数,被称为策略。

智能体的策略通常用 π \pi π 来表示。 π ( a ∣ s ) \pi(a|s) π(as) 表示在输入状态 s s s 下采取动作 a a a 的概率。和 MRP 相似,MDP也定义了类似的价值函数。

在 MDP 中基于策略 π \pi π 的状态价值函数 V π ( s ) V^\pi(s) Vπ(s) 定义为从状态 s s s 出发遵循策略 π \pi π 能获得的期望回报。
V π ( s ) = E π [ G t ∣ S t = s ] V^\pi(s) = \mathbb{E}_\pi \left[ G_t \mid S_t = s \right] Vπ(s)=Eπ[GtSt=s]
在 MDP 中,由于动作的存在,我们额外定义一个动作价值函数 Q π ( s , a ) Q\pi(s, a) Qπ(s,a)
V π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] V^\pi(s, a) = \mathbb{E}_\pi \left[ G_t \mid S_t = s, A_t = a \right] Vπ(s,a)=Eπ[GtSt=s,At=a]

状态的价值等于在该状态下基于策略采取所有动作的概率与相应的价值相乘再求和的结果。
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) V π ( s , a ) V^\pi(s) = \sum_{a \in A}\pi(a|s)V^\pi(s,a) Vπ(s)=aAπ(as)Vπ(s,a)

同时,和MRP类似,状态 s s s 下采取动作 a a a 的价值为
V π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) V π ( s ′ ) V^\pi(s, a) = r(s, a) + \gamma\sum_{s'\in S}{p(s'|s, a)V^\pi(s')} Vπ(s,a)=r(s,a)+γsSp(ss,a)Vπ(s)

蒙特卡洛方法

蒙特卡洛方法(Monte-Carlo methods)也被称为统计模拟方法,是一种基于概率统计的数值计算方法。运用蒙特卡洛方法时,我们通常使用重复随机抽样,然后运用概率统计方法来从抽样结果中归纳出我们想求的目标的数值估计。一个简单的例子是用蒙特卡洛方法来计算圆的面积。例如,如图所示的正方形内部随机产生若干个点,细数落在圆中点的个数,圆的面积与正方形面积之比就等于圆中点的个数与正方形中点的个数之比。
在这里插入图片描述
在这里插入图片描述

对于MDP问题应用以上算法:

在这里插入图片描述

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
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)
def sample(MDP, Pi, timestep_max, number):''' 采样函数,策略Pi,限制最长时间步timestep_max,总共采样序列数number '''S, A, P, R, gamma = MDPepisodes = []for _ in range(number):episode = []timestep = 0s = S[np.random.randint(4)]  # 随机选择一个除s5以外的状态s作为起点# 当前状态为终止状态或者时间步太长时,一次采样结束while s != "s5" and timestep <= timestep_max:timestep += 1rand, temp = np.random.rand(), 0# 在状态s下根据策略选择动作for a_opt in A:temp += Pi.get(join(s, a_opt), 0)if temp > rand:a = a_optr = R.get(join(s, a), 0)breakrand, temp = np.random.rand(), 0# 根据状态转移概率得到下一个状态s_nextfor s_opt in S:temp += P.get(join(join(s, a), s_opt), 0)if temp > rand:s_next = s_optbreakepisode.append((s, a, r, s_next))  # 把(s,a,r,s_next)元组放入序列中s = s_next  # s_next变成当前状态,开始接下来的循环episodes.append(episode)return episodes# 采样5次,每个序列最长不超过20步
episodes = sample(MDP, Pi_1, 20, 5)
print('第一条序列\n', episodes[0])
print('第二条序列\n', episodes[1])
print('第五条序列\n', episodes[4])
# 对所有采样序列计算所有状态的价值
def MC(episodes, V, N, gamma):for episode in episodes:G = 0for i in range(len(episode) - 1, -1, -1):  #一个序列从后往前计算(s, a, r, s_next) = episode[i]G = r + gamma * GN[s] = N[s] + 1V[s] = V[s] + (G - V[s]) / N[s]timestep_max = 20
# 采样1000次,可以自行修改
episodes = sample(MDP, Pi_1, timestep_max, 1000)
gamma = 0.5
V = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}
N = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}
MC(episodes, V, N, gamma)
print("使用蒙特卡洛方法计算MDP的状态价值为\n", V)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ学习—day2—安装

目录 普通Linux安装 安装RabbitMQ 1、下载 2、安装 3. Web管理界面及授权操作 Docker 安装 强力推荐学docker&#xff0c;使用docker安装 普通Linux安装 安装RabbitMQ 1、下载 官网下载地址&#xff1a;https://www.rabbitmq.com/download.html(opens new window) 这…

SQL Server的安装和简单使用

目录 一、SQL Server 1.1、简介 1.2、安装包 二、安装SQL Server 2.1、双击安装包 2.2、选择自己想要安装的位置 2.3、点击安装 2.4、安装完成之后会出现以下页面&#xff0c;按照序号依次点击 2.5、不用管密钥&#xff0c;点击下一步 2.6、选择【我接受】 2.7、是否…

前缀和(Prefix Sum)算法笔记C++

前缀和(Prefix Sum)算法介绍 前缀和是一种预处理技术, 用于快速计算数组中任意子区间的元素之和. 它通过一次遍历创建一个辅助数组来存储从数组起始位置到当前索引位置所有元素的累加和, 从而使得后续查询操作的时间复杂度降低至 O ( 1 ) O(1) O(1). 定义 对于给定的数组 n…

ffmpeg学习:ubuntu下编译Android版ffmpeg-kit

文章目录 前言一. 配置环境1.1 虚拟机版本1.2 安装Android环境1.2.1 Android SDK安装1.2.2 Android NDK安装 1.3 编译前的准备工作1.3.1 libtasn1-1安装1.3.2 meson安装1.3.3 harfbuzz下载 二. 编译ffmpeg-kit三. 总结 前言 ffmpeg-kit是一款跨多个平台的&#xff0c;用于在应…

Vue 中报错 TypeError: crypto$2.getRandomValues is not a function

问题 在新建的项目中&#xff0c;使用的是 npm init vue 创建项目后&#xff0c;执行命令 npm i &#xff0c;然后去 npm run dev 这个时候报错 TypeError: crypto$2.getRandomValues is not a function 起初是以为搞错了&#xff0c;然后再删掉 node_modules 和 package-lo…

‌OpenAI GPT-4.5技术详解与未来展望

一、GPT-4.5的技术突破‌ OpenAI在人工智能领域的持续创新再次引领了技术潮流。近期,OpenAI内部已经成功实现了GPT-4.5的开发,这一版本相较于前代在多个方面实现了显著的技术突破‌。 GPT-4.5在算法优化和数据处理上进行了多项创新,使得模型在对自然语言的理解上,尤其是在…

某生产制造企业积分制考核信息化项目成功案例纪实

某生产制造企业积分制考核信息化项目成功案例纪实 ——打破“大锅饭”“平均主义”问题&#xff0c;持续激励员工&#xff0c;调动员工积极性 【客户行业】生产制造行业 【问题类型】薪酬体系优化 【客户背景】 某大型钢铁集团公司是一个集科工贸、产供销于一体的国有生产…

「软件设计模式」适配器模式(Adapter)

软件设计模式深度解析&#xff1a;适配器模式&#xff08;Adapter&#xff09;&#xff08;C实现&#xff09; 一、模式概述 适配器模式&#xff08;Adapter Pattern&#xff09;是结构型设计模式中的"接口转换器"&#xff0c;它像现实世界中的电源适配器一样&#…

Windows 下安装 Python 和 Nodejs

Windows 下安装 Python 和 Nodejs 1. Windows 下安装 Python2. Windows 下安装 Nodejs 1. Windows 下安装 Python 访问 https://www.python.org/downloads/windows/&#xff0c;下载想使用的版本&#xff0c; 2. Windows 下安装 Nodejs 访问 https://nodejs.org/en/download&…

【算法与数据结构】并查集详解+题目

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…

Unity学习part1

课程为b站【Unity教程】零基础带你从小白到超神 1、脚本执行顺序 unity的脚本执行顺序不像blender的修改器那样按顺序执行&#xff0c;而是系统默认给配置一个值&#xff0c;值越小&#xff0c;执行顺序越靠前&#xff08;注意&#xff0c;这个顺序是全局生效的&#xff09; …

[矩形绘制]

矩形绘制 真题目录: 点击去查看 E 卷 200分题型 题目描述 实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除 当新绘制的矩形与之前的图形重叠时,对图形取并集当新擦除的矩形与之前的图形重叠时,对图形取差集给定一系列矩形的绘制和擦除操作,计算最终图形的面积。 …

AI 编程工具—Cursor 进阶篇 数据分析

AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…

DeepSeek帮助解决Oracle死锁问题

最近在生产上遇到一个死锁问题&#xff0c;Oracle 抛出了 ORA-000060 异常。 业务场景&#xff1a;程序按行读取一个上游系统送的文件数据&#xff08;大概有几万行&#xff09;&#xff0c;读取到数据后&#xff0c;每 500 行分配给一个线程去批量更新数据库&#xff08;使用…

小小小病毒(3)(~_~|)

一分耕耘一分收获 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 欢迎来到小小小病毒&#xff08;3&#xff09; 感谢大家的支持 还是那句话&#xff1a;上代码&#xff01; …

【devops】Github Actions Secrets | 如何在Github中设置CI的Secret供CI的yaml使用

一、Github Actions 1、ci.yml name: CIon: [ push ]jobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv3- name: Set up Gouses: actions/setup-gov4with:go-version: 1.23.0- name: Cache Go modulesuses: actions/cachev3with:path: |…

【Elasticsearch】监控与管理:集群健康检查

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

时间序列分析(四)——差分运算、延迟算子、AR(p)模型

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 一、差分运算 差分运算的定义&#xff1a;差分运算是一种将非平稳时间序列转换…

LabVIEW 中 dotnet.llb 库功能

在 LabVIEW 功能体系里&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dotnet.llb 路径下的 dotnet.llb 库意义重大。作为与 .NET 技术交互的关键库&#xff0c;它使 LabVIEW 用户能够与基于 .NET 框架开发的应用程序和组件进行交…

Hello Robot具身智能移动操作机器人Stretch 3:开源、灵巧、友好

Hello Robot机器人中国市场授权合作伙伴 欣佰特科技&#xff08;北京&#xff09;有限公司 salescnbytec.com Stretch 3 是一款由Hello Robot公司推出功能强大、设计灵活的7DOF开源移动操作机器人&#xff0c;适用于具身智能研究、科研教育和人机交互等多个领域。其强大的计算…