强化学习数学原理(三)——值迭代

news2025/7/13 12:30:39

一、值迭代过程

v=\max_\pi(r_\pi+\gamma P_\pi v)

        上面是贝尔曼最优公式,之前我们说过,f(v)=v,贝尔曼公式是满足contraction mapping theorem的,能够求解除它最优的策略和最优的state value,我们需要通过一个最优v*,这个v*来计算状态pi*,而vk通过迭代,就可以求出唯一的这个v*,而这个算法就叫做值迭代。V(s)是状态s的最优价值,R是在状态s时执行动作a可获得的,y是折扣因子(衰减系数),还有状态概率矩阵P

1.1 初始化状态价值函数

        我们说过,这个函数有两个未知量。v与pi,因此要计算最优策略,我们就需要先假设一个初始值。选择一个初始值先来表示每个状态的价值。假设我们就可以设置所有价值V(s)都为0

1.2 迭代更新价值函数

        使用贝尔曼最优方程更新状态价值函数,对于与每个状态s,计算改状态下所有可能的动作a下的期望值,然后选择最大值作为新的状态价值函数。Vk是第k次迭代时s的状态,他会更新为k+1,直到k+1是最优时刻为止,具体的更新公式为:

v_{k+1}=f(v_k)=\max_\pi(r_\pi+\gamma P_\pi v_k)

        这上面就包含了所说了两个步骤

        第一步 ploicy update:\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k)

        第二部 value update:v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}}v_k

        每次更新一个pik+1之后代入,就可以得到迭代后的vk+1,但是这里有个点,迭代过程中,左侧他是vk+1,所以他并不是我们所说的state value,他是一个值,

1.2.1 Ploicy update

\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k)

        我们把上面的公式具体的拆成每个状态对应的element,得到

\pi_{k+1}(s)=\arg\max_{\pi}\sum_{a}\pi(a|s)\underbrace{\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_{k}(s^{\prime})\right)}_{q_{k}(s,a)}

        vk是已知的(假设了v0,假设现在就是v0,求pi1),那么qk(s,a)  (q1)是已知的,最优策略,就会选取qk最大时的action,其他行动为0,这样就只与q(s,a)相关,那么pik+1就知道了,就是pik+1(s)最大的一个

\left.\pi_{k+1}(a|s)=\left\{\begin{array}{ll}1&a=a_k^*(s)\\0&a\neq a_k^*(s)\end{array}\right.\right.

1.2.2 Value update

        对于其elementwise form v_{k+1}(s)=\sum_a\pi_{k+1}(a|s)\underbrace{\left(\sum_rp(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_k(s^{\prime})\right)}_{q_k(s,a)}

        按照迭代顺序写出每一个值,从1.2.1,我们就可以知道,qk(s,a)是能求出的,注意一点,策略迭代里面,求出了最大的value对应的state,那么我们就知道这个pik+1,求出最后的结果

v_{k+1}(s)=\max_aq_k(a,s)

1.3 判断收敛性

        每次迭代后,检查状态价值函数的变化。如果状态价值变化小于某个阈值(例如 ϵ\epsilonϵ),则认为收敛,可以终止迭代。常见的收敛条件是:

\max_s|V_{k+1}(s)-V_k(s)|<\epsilon

通常  \epsilon  是一个小的正数,用于表示精度要求。如果状态价值函数的变化足够小,算法收敛。

        根据例子,给出一个python代码

import numpy as np

# 初始化参数
gamma = 0.9  # 折扣因子
epsilon = 1e-6  # 收敛阈值
max_iterations = 1000  # 最大迭代次数
S = 4  # 状态空间大小
A = 5  # 动作空间大小

# 转移概率矩阵 P(s'|s, a) - 4x5x4 的三维矩阵
P = np.zeros((S, A, S))

## 顺时针行动
# 奖励函数 R(s, a) - 4x5 的矩阵
R = np.array([[-1, 4, -1, -1, -1],
              [-1, 4, -1, -1, -1],
              [4, -1, -1, -1, -1],
              [-1, -1, -1, -1, 1]])

# 转移概率矩阵
# 动作 a=1
P[:, 0, :] = np.array([[0.8, 0.1, 0.1, 0],
                       [0.1, 0.8, 0.1, 0],
                       [0.2, 0.2, 0.6, 0],
                       [0, 0, 0, 1]])

# 动作 a=2
P[:, 1, :] = np.array([[0.6, 0.3, 0.1, 0],
                       [0.1, 0.7, 0.2, 0],
                       [0.3, 0.3, 0.4, 0],
                       [0, 0, 0, 1]])

# 动作 a=3
P[:, 2, :] = np.array([[0.7, 0.2, 0.1, 0],
                       [0.1, 0.8, 0.1, 0],
                       [0.2, 0.2, 0.6, 0],
                       [0, 0, 0, 1]])

# 动作 a=4
P[:, 3, :] = np.array([[0.5, 0.4, 0.1, 0],
                       [0.2, 0.7, 0.1, 0],
                       [0.4, 0.4, 0.2, 0],
                       [0, 0, 0, 1]])

# 动作 a=5
P[:, 4, :] = np.array([[0.9, 0.05, 0.05, 0],
                       [0.05, 0.9, 0.05, 0],
                       [0.1, 0.1, 0.8, 0],
                       [0, 0, 0, 1]])

# 初始化状态价值函数 V(s)
V = np.zeros(S)

# 记录最优策略
pi = np.zeros(S, dtype=int)

# 值迭代算法
for k in range(max_iterations):
    V_new = np.zeros(S)
    delta = 0  # 最大值变化
    
    # 遍历每个状态
    for s in range(S):
        # 对每个动作计算期望回报
        value = -float('inf')  # 当前最大回报(初始化为负无穷)
        for a in range(A):
            # 计算该动作下的期望回报
            expected_return = R[s, a] + gamma * np.sum(P[s, a, :] * V)
            value = max(value, expected_return)  # 保持最大的期望回报
        
        # 更新当前状态的价值
        V_new[s] = value
        delta = max(delta, abs(V_new[s] - V[s]))  # 计算状态价值的变化
    
    # 更新状态价值
    V = V_new
    
    # 如果变化小于 epsilon,认为收敛
    if delta < epsilon:
        break

# 根据最优状态价值函数计算最优策略
for s in range(S):
    max_value = -float('inf')
    best_action = -1
    for a in range(A):
        # 计算每个动作下的期望回报
        expected_return = R[s, a] + gamma * np.sum(P[s, a, :] * V)
        if expected_return > max_value:
            max_value = expected_return
            best_action = a
    pi[s] = best_action

# 输出结果
print("最优状态价值函数 V*(s):")
print(V)

print("最优策略 pi*(s):")
print(pi)

MATLAB实现:

% 初始化参数
gamma = 0.9;        % 折扣因子
epsilon = 1e-6;     % 收敛阈值
max_iterations = 1000; % 最大迭代次数
S = 4;              % 状态空间大小
A = 5;              % 动作空间大小

% 转移概率矩阵 P(s'|s, a) - 4x5x4 的三维矩阵
P = zeros(S, A, S);

% 奖励函数 R(s, a) - 4x5 的矩阵
R = [-1, 4, -1, -1, -1;
     -1, 4, -1, -1, -1;
      4, -1, -1, -1, -1;
     -1, -1, -1, -1, 1];

% 转移概率矩阵
% 动作 a=1
P(:, 1, :) = [0.8, 0.1, 0.1, 0; 
              0.1, 0.8, 0.1, 0; 
              0.2, 0.2, 0.6, 0; 
              0, 0, 0, 1];
          
% 动作 a=2
P(:, 2, :) = [0.6, 0.3, 0.1, 0;
              0.1, 0.7, 0.2, 0;
              0.3, 0.3, 0.4, 0;
              0, 0, 0, 1];
          
% 动作 a=3
P(:, 3, :) = [0.7, 0.2, 0.1, 0;
              0.1, 0.8, 0.1, 0;
              0.2, 0.2, 0.6, 0;
              0, 0, 0, 1];

% 动作 a=4
P(:, 4, :) = [0.5, 0.4, 0.1, 0;
              0.2, 0.7, 0.1, 0;
              0.4, 0.4, 0.2, 0;
              0, 0, 0, 1];

% 动作 a=5
P(:, 5, :) = [0.9, 0.05, 0.05, 0;
              0.05, 0.9, 0.05, 0;
              0.1, 0.1, 0.8, 0;
              0, 0, 0, 1];

% 初始化状态价值函数 V(s)
V = zeros(S, 1);

% 记录最优策略
pi = zeros(S, 1);

% 值迭代算法
for k = 1:max_iterations
    V_new = zeros(S, 1);
    delta = 0; % 最大值变化
    
    % 遍历每个状态
    for s = 1:S
        % 对每个动作计算期望回报
        value = -Inf; % 当前最大回报(初始化为负无穷)
        for a = 1:A
            % 计算该动作下的期望回报
            expected_return = R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V);
            value = max(value, expected_return); % 保持最大的期望回报
        end
        
        % 更新当前状态的价值
        V_new(s) = value;
        delta = max(delta, abs(V_new(s) - V(s))); % 计算状态价值的变化
    end
    
    % 更新状态价值
    V = V_new;
    
    % 如果变化小于 epsilon,认为收敛
    if delta < epsilon
        break;
    end
end

% 根据最优状态价值函数计算最优策略
for s = 1:S
    max_value = -Inf;
    best_action = -1;
    for a = 1:A
        % 计算每个动作下的期望回报
        expected_return = R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V');
        if expected_return > max_value
            max_value = expected_return;
            best_action = a;
        end
    end
    pi(s) = best_action;
end

% 输出结果
disp('最优状态价值函数 V*(s):');
disp(V);

disp('最优策略 pi*(s):');
disp(pi);

修改奖励与衰减系数可得到不同V

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

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

相关文章

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚&#xff0c;DeepSeek正式发布了全新的推理模型DeepSeek-R1&#xff0c;引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色&#xff0c;性能对标OpenAI的o1正式版。同时&#xff0c;DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

scratch变魔术 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch变魔术 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、py…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算

【0】基础定义 按位与运算&#xff1a;全1取1&#xff0c;其余取0。按位或运算&#xff1a;全0取0&#xff0c;其余取1。 【1】引言 前序学习进程中&#xff0c;已经对图像按位与计算进行了详细探究&#xff0c;相关文章链接如下&#xff1a; python学opencv|读取图像&…

蓝桥杯省一

四个月从c&#xff0c;cpp&#xff0c;算法一起学到省一&#xff08;考研原因没参加国赛&#xff09; 有疑问可以关注私信哦 帖子后续也会持续更新&#xff0c;分享算法竞赛&#xff08;ccpc&#xff0c;天梯赛&#xff0c;蓝桥杯&#xff0c;浙大pta&#xff09;相关知识

C++ 新特性实现 ThreadPool

序言 在之前我们实现过线程池&#xff0c;但是非常基础。答题思路就是实现一个安全的队列&#xff0c;再通过 ThreadPool 来管理队列和线程&#xff0c;对外提供一个接口放入需要执行的函数&#xff0c;但是这个函数是无参无返回值的。  参数的问题我们可以使用 bind 来封装&a…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现&#xff0c;详见下文&#xff1a; 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现&#xff0c;其形参均采用了…

本地Harbor仓库搭建流程

Harbor仓库搭建流程 本文主要介绍如何搭建harbor仓库&#xff0c;推送本地镜像供其他机器拉取构建服务 harbor文档&#xff1a;Harbor 文档 | 配置 Harbor YML 文件 - Harbor 中文 github下载离线安装包 Releases goharbor/harbor 这是harbor的GitHub下载地址&#xff0c…

环境搭建--vscode

vscode官网下载合适版本 安装vscode插件 安装 MinGW 配置环境变量 把安装目录D&#xff1a;\mingw64 配置在用户的环境变量path里即可 选择用户环境变量path 点确定保存后开启cmd输入g&#xff0c;如提示no input files 则说明Mingw64 安装成功&#xff0c;如果提示g 不是内…

30289_SC65XX功能机MMI开发笔记(ums9117)

建立窗口步骤&#xff1a; 引入图片资源 放入图片 然后跑make pprj new job8 可能会有bug,宏定义 还会有开关灯报错&#xff0c;看命令行注释掉 接着把ture改成false 然后命令行new一遍&#xff0c;编译一遍没报错后 把编译器的win文件删掉&#xff0c; 再跑一遍虚拟机命令行…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载&#xff1a;https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址&#xff1a;https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

【10.2】队列-设计循环队列

一、题目 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普…

多人-多agent协同可能会挑战维纳的反馈

在多人-多Agent协同系统中&#xff0c;维纳的经典反馈机制将面临新的挑战&#xff0c;而协同过程中的“算计”&#xff08;策略性决策与协调&#xff09;成为实现高效协作的核心。 1、非线性与动态性 维纳的反馈理论&#xff08;尤其是在控制理论中&#xff09;通常假设系统的动…

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统&#xff0c;重复开发&#xff0c;维护多套版本 多种语言栈&#xff0c;对人员技能要求高 多种开发框架&#xff0c;不同的编程…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者&#xff1a;本人是一名县级融媒体中心的工程师&#xff0c;多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展&#xff0c;文字转语音&#xff08;Te…

2025课题推荐——USBL与DVL数据融合的实时定位系统

准确的定位技术是现代海洋探测、海洋工程和水下机器人操作的基础。超短基线&#xff08;USBL&#xff09;和多普勒速度计&#xff08;DVL&#xff09;是常用的水下定位技术&#xff0c;但单一技术难以应对复杂环境。因此&#xff0c;USBL与DVL的数据融合以构建实时定位系统&…

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…

Three.js实战项目02:vue3+three.js实现汽车展厅项目

文章目录 实战项目02项目预览项目创建初始化项目模型加载与展厅灯光加载汽车模型设置灯光材质设置完整项目下载实战项目02 项目预览 完整项目效果: 项目创建 创建项目: pnpm create vue安装包: pnpm add three@0.153.0 pnpm add gsap初始化项目 修改App.js代码&#x…

1月27(信息差)

&#x1f30d;喜大普奔&#xff0c;适用于 VS Code 的 GitHub Copilot 全新免费版本正式推出&#xff0c;GitHub 全球开发者突破1.5亿 &#x1f384;Kimi深夜炸场&#xff1a;满血版多模态o1级推理模型&#xff01;OpenAI外全球首次&#xff01;Jim Fan&#xff1a;同天两款国…