You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MATLAB强化学习stepfunction内将R值追加到矩阵RR

问题修复方案

核心问题原因

你遇到的追加失败是两个直接原因导致的:

  • 每次调用myStepfunction时,都会在内部执行RR = [];把存储数组清空,自然无法累积历史R值
  • MATLAB函数拥有独立的工作区,默认情况下内部变量不会和外部工作区互通,每次函数执行结束后内部的RR变量会直接销毁,结果无法留存

可行修复方案(推荐优先级从高到低)

方案1:使用LoggedSignals存储累积奖励(最适配强化学习自定义环境场景)

LoggedSignals是强化学习step函数专门用来跨调用传递数据的载体,修改步骤如下:

  1. 先修改你的myResetFunction,在初始化LoggedSignals时新增字段存储奖励数组:
LoggedSignals.RR = [];

每次环境重置时会自动清空历史奖励,符合回合制训练的逻辑。
2. 调整step函数的代码,删除内部的RR = [];行,追加逻辑改为操作LoggedSignals的RR字段:

% 删掉原来的 RR = []; 行
Ball_Target = 10;
Ball_Distance = Ballfunction(SimplePendulum);
R =  -abs(Ball_Distance -Ball_Target);
LoggedSignals.RR = [LoggedSignals.RR, R]; % 直接在LoggedSignals的RR字段追加

你后面需要调用所有历史奖励时,直接取LoggedSignals.RR即可。

方案2:用持久化变量存储

如果不需要随环境重置清空奖励,可以用persistent关键字定义持久化变量,变量会在多次函数调用之间保留值:

% 在step函数最开头加这一行
persistent RR
if isempty(RR) % 首次调用时初始化
    RR = [];
end

注意:更换训练回合时需要执行clear myStepfunction手动清空持久化变量,否则会把所有回合的奖励都累积到一起。

方案3:外部累积奖励

把R作为输出参数返回,在调用step函数的外层循环里做追加:

  1. 先修改step函数的输出定义,新增R的输出:
function [NextObservation, Reward, IsDone, LoggedSignals, R] = myStepfunction(Action,LoggedSignals,SimplePendulum)
  1. 外层训练循环里自行累积:
RR = [];
for episode = 1:maxEpisode
    % 重置环境
    while ~IsDone
        [NextObservation, Reward, IsDone, LoggedSignals, R] = myStepfunction(Action,LoggedSignals,SimplePendulum);
        RR = [RR, R]; % 外部追加
    end
end

附加代码优化点

  • 你当前的函数定义行换行不合法,MATLAB中函数定义行如果要换行需要在行尾加...,否则会报错
  • 你代码中Reward = +max(R);没有意义,因为R是标量,直接写Reward = R;即可

内容的提问来源于stack exchange,提问作者wanwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:06:05