RL - 强化学习 马尔可夫决策过程 (MDP) 转换 马尔可夫奖励过程 (MRP)

news2025/1/12 10:11:46

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://blog.csdn.net/caroline_wendy/article/details/131097165

马尔可夫决策过程(Markov Decision Process,MDP)和马尔可夫奖励过程(Markov Reward Process,MRP)之间存在一种转换关系。下面我将详细介绍这个转换过程。

马尔可夫决策过程(MDP)是一种数学模型,用于描述一个决策过程中的随机性和不确定性。MDP由5个元素组成:状态集合(S),动作集合(A),状态转移概率函数(P),奖励函数(R),以及折扣因子(γ)。

然而,马尔可夫决策过程并不直接包含奖励信息,而是通过引入马尔可夫奖励过程(MRP)来处理奖励。马尔可夫奖励过程是马尔可夫决策过程的一个子集,不包含动作集合和策略。

下面是将MDP转换为MRP的步骤:

  1. 状态集合(S)和动作集合(A)不变:在转换过程中,状态集合和动作集合保持不变。
  2. 状态转移概率函数(P):对于每个状态 s 和动作 a 的组合,计算该组合下的状态转移概率。这可以通过对所有可能的下一个状态 s’ 的概率进行求和来完成。即对于每个 s 和 a,计算 P(s’|s, a)。
  3. 奖励函数(R):为每个状态 s 和动作 a 的组合计算奖励。这可以通过对所有可能的下一个状态 s’ 的奖励进行加权平均来完成。即对于每个 s 和 a,计算 R(s, a, s’) = Σ P(s’|s, a) * R(s, a, s’)。
  4. 折扣因子(γ):将原始MDP中的折扣因子 γ 保持不变。

经过这个转换过程,我们从MDP转换为了MRP,即马尔可夫奖励过程。在MRP中,我们不再考虑动作和策略,而是仅关注状态转移概率和奖励函数。这使得我们可以更加专注于对奖励过程的建模和分析。

需要注意的是,从MRP转换回MDP是不可能的,因为MRP中没有动作和策略的概念。因此,从MDP到MRP的转换是可逆的,但反过来是不可逆的。


马尔可夫决策过程(Markov Decision Process,MDP),在马尔可夫奖励过程(Markov Reward Process,MRP)的基础上,引入动作(Action),即 < S , A , P , r , γ > <\mathcal{S},\mathcal{A},\mathcal{P},r,\gamma> <S,A,P,r,γ>

即引入动作集合 A \mathcal{A} A,奖励reward由 r ( s ) r(s) r(s) 转换为 r ( s , a ) r(s,a) r(s,a) ,状态转移概率由 P ( s ′ ∣ s ) \mathcal{P}(s'|s) P(ss) 转换为 P ( s ′ ∣ s , a ) \mathcal{P}(s'|s,a) P(ss,a),都增加动作 a a a。同时,引入策略 π \pi π 的概念。

策略 π \pi π 包括2类,确定性策略(Deterministic Policy)和随机性策略(Stochastic Policy)。确定性策略即状态转移链,即一个状态确定到另一个状态,也可以理解为概率为1,其他都是0。随机性策略即状态转移概率,即状态 s 1 s_{1} s1 [ s 1 , s 2 , s 3 , . . . ] [s_{1}, s_{2}, s_{3},...] [s1,s2,s3,...]的概率,更为普适。

马尔可夫决策过程( < S , A , P , r , γ > <\mathcal{S},\mathcal{A},\mathcal{P},r,\gamma> <S,A,P,r,γ>) + 策略 π \pi π = 马尔可夫奖励过程( < S , P , r , γ > <\mathcal{S},\mathcal{P},r,\gamma> <S,P,r,γ>

MRP的状态转移概率矩阵,转换公式如下:
P ( s ′ ∣ s ) = ∑ a ∈ A   π ( a ∣ s )   P ( s ′ ∣ s , a ) P(s'|s)=\sum_{a\in A} \ \pi(a|s) \ P(s'|s,a) P(ss)=aA π(as) P(ss,a)
MRP的状态奖励列表,转换公式如下:
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)
这样,就可以使用 MRP 的贝尔曼方程(Bellman Equation),计算 MDP 的在策略 π \pi π 状态价值 V π ( s ′ ) V^{\pi}(s') Vπ(s),贝尔曼方程(Bellman Equation)如下:

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

有了状态价值 V π ( s ′ ) V^{\pi}(s') Vπ(s),即可以计算动作价值 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a),即在状态 s s s 时,执行 a a a 动作的价值,在某个状态,尽量使用价值最高的动作,类似自动驾驶中,碰见某类情况,使用最优的动作进行处理,因为动作价值最高。

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)

示例如下:

MDP

源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/6/7
"""

import numpy as np

def compute(P, rewards, gamma, states_num):
  """
  利用 贝尔曼方程 解析状态价值
  """
  rewards = np.array(rewards).reshape((-1, 1))  # 转换成列向量
  value = np.dot(np.linalg.inv(np.eye(states_num, states_num) - gamma * P), rewards)
  return value


def main():
    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

    # 策略1,随机策略
    # 第1行: "s1-s1": 0.5, "s1-s2": 0.5
    # 第2行: "s2-s1": 0.5, "s2-s3": 0.5
    # 第3行: "s3-s4": 0.5, "s3-s5": 0.5
    # 第4行:"s4-s5": 0.5, "s4-概率前往": 0.5 * ["s4-概率前往-s2": 0.2, "s4-概率前往-s3": 0.4, "s4-概率前往-s4": 0.4]
    # 第5行:终点
    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奖励:
    # 第1个值: 0.5 * -1 + 0.5 * 0 = -0.5
    # 第2个值:0.5 * -1 + 0.5 * -2 = -1.5
    # 第3个值:0.5 * -2 + 0.5 * 0 = -1.0
    # 第4个值:0.5 * 10 + 1 * 0.5 = 5.5
    # 第5个值:final = 0
    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)


if __name__ == '__main__':
    main()

输出 s 1 ∼ s 6 s_{1} \sim s_{6} s1s6 的状态价值 V π ( s ′ ) V^{\pi}(s') Vπ(s) 如下:

 [[-1.22555411]
 [-1.67666232]
 [ 0.51890482]
 [ 6.0756193 ]
 [ 0.        ]]

状态动作价值 Q π ( s 4 , 概率前往 ) Q^{\pi} (s_{4},概率前往) Qπ(s4,概率前往) 是:
Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) 2.152 = 1 + 0.5 ∗ [ 0.2 ∗ ( − 1.68 ) + 0.4 ∗ 0.52 + 0.4 ∗ 6.08 ] Q^{\pi}(s,a)=r(s,a) + \gamma \sum_{s' \in S}P(s'|s,a)V^{\pi}(s') \\ 2.152 = 1+0.5*[0.2*(-1.68)+0.4*0.52+0.4*6.08] Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)2.152=1+0.5[0.2(1.68)+0.40.52+0.46.08]

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

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

相关文章

FluxMQ 规则引擎 《一》

规则引擎介绍 演示环境 http://demo.fluxmq.com:50000/ 账号&#xff1a;fluxmq密码&#xff1a;fluxmq 简介 FluxMQ Rule Engine (以下简称规则引擎) 用于配置FluxMQ 消息流与设备事件的处理、响应规则。规则引擎不仅提供了清晰、灵活的 “配置式” 的业务集成方案&#xff0…

(二)CSharp-关于内存分配的总结和疑惑(未解决)

同时看了好几本书&#xff0c;对变量的内存分配概念总是稀里糊涂的。所以干脆专门写一篇文章来对C#内存分配进行研究和总结。 1、值类型和引用类型 对值类型&#xff1a; 值类型实例通常存在线程的堆栈里。即所有值类型的非成员数据都放在线程的堆栈里。如果值类型是类的数据…

4.使用Express跨域资源共享(继上一章)

4.5、CORS跨域资源共享 1.接口的跨域问题 刚才编写的GET和POST接口&#xff0c;存在一个很严重的问题&#xff1a;不支持跨域请求。 解决接口跨域问题的方案主要有两种&#xff1a; ①CORS&#xff08;主流的解决方案&#xff0c;推荐使用&#xff09; ②JSONP&#xff08…

Windows软件架构概念

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来聊聊Windows软件架构的概念。 Shaw和Garlan在他们划时代的著作中以如下方式讨论了软件的体系结构&#xff1a;从第一个程序被划分成模块开始&#xff0c;软件系统就有了体系结构。现在&#xff0c…

PostgreSQL部署出现只有超级用户能创建扩展

最近在Windows Server服务器上部署PostgreSQL12遇到了一个问题,部署完成时,任务问题都没有,也可以远程连接。但是在给数据库添加扩展时出现了如下所述的问题: 执行sql命令create extension "uuid-ossp"出现问题如下:create extension “uuid-ossp” 错误: 创建扩…

文心一言 VS 讯飞星火 VS chatgpt (34)-- 算法导论5.3 1题

一、Marceau 教授不同意引理 5.5 证明中使用的循环不变式。他对第1次送代之前循环不变式是否为真提出质疑。他的理由是&#xff0c;我们可以很容易宣称一个空数组不包含0排列。因此一个空的子数组包含一个0排列的概率应是 0&#xff0c;从而第 1次选代之前循环不变式无效。请重…

Python3+Selenium2完整的自动化测试实现之旅(三):Selenium-webdriver提供的元素定位方法

目录 前言 前端技术名词解释 Selenium-webdriver定位元素 一、 通过id定位 二、通过name定位 三、通过class定位 四、 通过tag定位 五、 通过link定位 六、通过partial_link定位 七、 通过Xpath定位 八、通过CSS定位 总结 前言 本篇以实例介绍selenium下的webdriv…

mysql数据库备份文件回复的方法

备份数据表的恢复 前提配置 关闭防火墙 systemctl stop firewalld iptables -F setenforce 0 安装了mysql数据库 以下列库表为例 先有一个数据库mydb&#xff0c;包含两个数据表customer,timestamps; 其中customer数据表包含数据如下&#xff1a; 备份数据表的回复 第一步…

回溯算法之深度优先搜索

目录 放牌 员工的重要性 图像渲染 岛屿的周长 被围绕的区域 岛屿的数量 岛屿的最大面积 电话号码的字母组合 二进制手表 组合总和 活字印刷 N皇后 深度优先搜索&#xff08;Depth First Search&#xff09;------ 一条道走到黑 放牌 假如有编号为1~3的3张扑克牌…

cpython编译与运行

一.配置环境 python 本身不能运行 cpython 的语法&#xff0c;需要 编译 后引用 需要 gcc 编译器 和 cython 编译器 gcc编译器 把 c语言 编译成扩展模块 Cython 编译器是一种源到源的编译器 python 语法编译成 c语法 1.安装gcc 编译器 gcc 编译器可以下载 Visual Studio 或者…

Android系统的启动流程(一):进入Zygote进程的初始化

Android系统的启动流程 概要 本篇文章主要是从Android系统启动电源开始介绍到程序运行到Java框架层并且完成Zygote进程的启动为止。下面先给出一张简单的概要图&#xff0c;本篇文章将会从源码进行分析Android的部分启动流程&#xff0c;这里的源码来自于AndroidCodeSearch,截…

基于RK3588的人工智能边缘计算大算力网关

智能运维系统从下至上分为终端层、边缘层、平台层和应用层&#xff0c;如图 1 所示。终端层 是整个系统的神经末梢&#xff0c;负责现场数据的采集&#xff0c;除摄像机外&#xff0c;还包括各类传感器、控制器 等物联网设备。边缘层汇总各个现场终端送来的非结构化视频数据和…

BERT(Transformer Encoder)详解和TensorFlow实现(附源码)

文章目录 一、BERT简介1. 模型2. 训练2.1 Masked Language Model2.2 Next Sentence Prediction2.3 BERT的输出 3. 微调 二、源码1. 加载BERT模型2. 加载预处理模型3. 加载BERT4. 构建BERT微调模型5. 训练6. 推理 一、BERT简介 1. 模型 BERT的全称为Bidirectional Encoder Repr…

java.time 时区详解

from: https://blog.zhjh.top/archives/MFTOJ-jorm4ISK9KXEYFE LocalDateTime 类是不包含时区信息的&#xff0c;可以通过 atZone 方法来设置 ZoneId&#xff0c;返回 ZonedDateTime 类实例&#xff0c;通过 atOffset 方法来设置 ZoneOffset&#xff0c;返回 OffsetDateTime 类…

攻防世界-web-supersqli

1. 题目描述&#xff1a; 2. 思路分析 这里尝试按照基本思路进行验证&#xff0c;先确定注入点&#xff0c;然后通过union查询依次确认数据库名&#xff0c;表名&#xff0c;字段名&#xff0c;最终获取到我们想要的字段信息。 这里只有一个输入框&#xff0c;所以注入点肯定…

【犀牛书】JavaScript 类型、值、变量章节读书笔记

本文为对《JavaScript权威指南》第三章&#xff1a;类型、值、变量精读的读书笔记&#xff0c;对重点进行了记录以及在一些地方添加了自己的理解。 JavaScript类型可以分为两类&#xff1a;原始类型和对象类型。Javascript的原始类型包括数值、文本字符串&#xff08;也称字符串…

驱动操作控制LED灯

控制LED灯&#xff1a; 驱动如何操作寄存器 rgb_led灯的寄存器是物理地址&#xff0c;在linux内核启动之后&#xff0c; 在使用地址的时候&#xff0c;操作的全是虚拟地址。需要将物理地址 转化为虚拟地址。在驱动代码中操作的虚拟地址就相当于 操作实际的物理地址。 物理地址&…

2023年5月榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年5月飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站UP主。 飞…

Git—版本管理工具

作用&#xff1a;分布式版本控制 一句话&#xff1a;在开发的过程中用于管理对文件、目录或工程等内容的修改历史&#xff0c;方便查看历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术 官网下载安装&#xff1a;https://git-scm.com/ 命令大全&#xff1a;https://g…

OceanBase 4.1 全面测评及部署流程,看这篇就够了【建议收藏】

背景 测试 OceanBase 对比 MySQL&#xff0c;TiDB 的性能表现&#xff0c;数据存储压缩&#xff0c;探索多点内部项目一个数据库场景落地 Oceanbase&#xff08;MySQL->OceanBase&#xff09;。 单机测试 准备 OBD 方式部署单机 文件准备 wget https://obbusiness-pri…