如何在MATLAB强化学习stepfunction内将R值追加到矩阵RR
问题修复方案
核心问题原因
你遇到的追加失败是两个直接原因导致的:
- 每次调用
myStepfunction时,都会在内部执行RR = [];把存储数组清空,自然无法累积历史R值 - MATLAB函数拥有独立的工作区,默认情况下内部变量不会和外部工作区互通,每次函数执行结束后内部的RR变量会直接销毁,结果无法留存
可行修复方案(推荐优先级从高到低)
方案1:使用LoggedSignals存储累积奖励(最适配强化学习自定义环境场景)
LoggedSignals是强化学习step函数专门用来跨调用传递数据的载体,修改步骤如下:
- 先修改你的
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函数的外层循环里做追加:
- 先修改step函数的输出定义,新增R的输出:
function [NextObservation, Reward, IsDone, LoggedSignals, R] = myStepfunction(Action,LoggedSignals,SimplePendulum)
- 外层训练循环里自行累积:
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
相关产品推荐
相关产品推荐

