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

一、值迭代过程

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025蓝桥杯JAVA编程题练习Day1

1.刑侦科推理试题 题目描述 有以下10道单选题&#xff0c;编程求这10道题的答案。 这道题的答案是&#xff1a; A. A B. B C. C D. D 第5题的答案是&#xff1a; A. C B. D C. A D. B 以下选项中哪一题的答案与其他三项不同&#xff1a; A. 第3题 B. 第6题 C. 第2题 D.…

内存泄漏的通用排查方法

本文聊一聊如何系统性地分析查找内存泄漏的具体方法&#xff0c;但不会具体到哪种语言和具体业务代码逻辑中&#xff0c;而是会从 Linux 系统上通用的一些分析方法来入手。这样&#xff0c;不论你使用什么开发语言&#xff0c;不论你在开发什么&#xff0c;它总能给你提供一些帮…

定时器按键tim_key模版

低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内&#xff0c;会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…

MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件

背景 在安装软件时&#xff0c;遇到“无法打开 ‘xxx’&#xff0c;因为 Apple 无法检查其是否包含恶意软件” 的提示&#xff0c;许多用户可能会感到困惑&#xff0c;不知道该如何处理。遇到这个问题时&#xff0c;按以下步骤操作即可解决。 首先&#xff0c;这个警告提示的出…

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…

柔性数组与c/c++程序中内存区域的划分

1.柔性数组 1.1柔性数组的定义 柔性数组是指在结构体中定义的&#xff0c;其大小在编译时未确定&#xff0c;而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下&#xff1a; struct D {int a;int arry1[0]; };struct F {int a;int arry2[]; };…

Vivado生成X1或X4位宽mcs文件并固化到flash

1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型&#xff0c;相关配置步骤可参考下图。 注意&#xff1a;Flash数据传输位宽如果需要选择X4位宽&am…

云原生:构建现代化应用的基石

一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…

力扣动态规划-12【算法学习day.106】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

day7手机拍照装备

对焦对不上&#xff1a;1、光太暗&#xff1b;2、离太近&#xff1b;3、颜色太单一没有区分点 滤镜可以后期P 渐变灰滤镜&#xff1a;均衡色彩&#xff0c;暗的地方亮一些&#xff0c;亮的地方暗一些 中灰滤镜&#xff1a;减少光差 手机支架&#xff1a;最基本70cm即可 手…

解锁微服务:五大进阶业务场景深度剖析

目录 医疗行业&#xff1a;智能诊疗的加速引擎 电商领域&#xff1a;数据依赖的破局之道 金融行业&#xff1a;运维可观测性的提升之路 物流行业&#xff1a;智慧物流的创新架构 综合业务&#xff1a;服务依赖的优化策略 医疗行业&#xff1a;智能诊疗的加速引擎 在医疗行业迈…

LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]

LosslessScaling 链接&#xff1a;https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"

51单片机开发:点阵屏显示数字

实验目标&#xff1a;在8x8的点阵屏上显示数字0。 点阵屏的原理图如下图所示&#xff0c;点阵屏的列接在P0端口&#xff0c;行接在74HC595扩展的DP端口上。 扩展口的使用详见&#xff1a;51单片机开发&#xff1a;IO扩展(串转并)实验-CSDN博客 要让点阵屏显示数字&#xff0…

ESP32-CAM实验集(WebServer)

WebServer 效果图 已连接 web端 platformio.ini ; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library stor…

代码随想录算法【Day34】

Day34 62.不同路径 思路 第一种&#xff1a;深搜 -> 超时 第二种&#xff1a;动态规划 第三种&#xff1a;数论 动态规划代码如下&#xff1a; class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n,…

WGCLOUD运维工具从入门到精通 - 如何设置主题背景

需要升级到WGCLOUD的v3.5.7或者以上版本&#xff0c;才会支持自定义设置主题背景色 WGCLOUD下载&#xff1a;www.wgstart.com 我们登录后&#xff0c;在右上角点击如下的小图标&#xff0c;就可以设置主题背景色了&#xff0c;包括&#xff1a;经典白&#xff08;默认&#x…

【shell工具】编写一个批量扫描IP地址的shell脚本

批量扫描某个网段中的主机&#xff08;并发&#xff09; 创建目录编写脚本文件 mkdir /root/ip_scan_shell/ touch /root/ip_scan_shell/online_server.txt touch /root/ip_scan_shell/offline_server.txt touch /root/ip_scan_shell/ip_scan.sh写入下面shell到脚本文件中…

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…

搭建 docxify 静态博客教程

首先&#xff0c;安装 node 环境安装 docxify &#xff0c;参考官网&#xff1a;https://docsify.js.org/#/zh-cn/ npm i docsify-cli -g新建docs文件夹专门用来放文章&#xff0c;初始化命令 docsify init ./docs就会生成如下两个文件&#xff0c;index.html 入口文件&#…

TiDB 常用命令

TiDB 常用命令 TiDB 是一款开源分布式数据库&#xff0c;在大数据、高并发场景下表现出色。作为开发者或数据库管理员&#xff0c;熟练掌握 TiDB 的常用命令&#xff0c;对于日常操作和维护非常重要。今天就来简单总结一下 TiDB 的常用命令&#xff0c;帮你提高工作效率。 1. …