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

Matlab中RL与SimEvents集成仿真的随机数维护方案咨询

解决SimEvents集成RL智能体时随机数无变化的问题

我用Matlab搭建了集成强化学习(RL)智能体的SimEvents系统模型,模型能正常运行,但实体服务器块“mission”里的随机数生成有异常:单独运行SimEvents模型时,随机数符合预期;但集成RL智能体运行完整模型时,每次结果完全一致,没有随机性。我了解Matlab的rng具有确定性,依赖预设种子,此前尝试过rng('shuffle')、使用SimEvents随机生成块、参考官方方案修改种子等方法均未解决问题,现寻求可行的随机数实现方案,现有代码如下:

% Generate rng1 as a uniform random number between 0 and 100
rng1 = randi([0, 100]);

% Generate rng2 as a random number between 1 and 2
rng2 = randi([1, 2]);

% Determine the type of mission based on each Probability
if (rng1 > 10 && rng1 <= 100) && (rng2 == 1)
    % General Purpose mission with load 1
    entity.Part.Nj = 10; % [Cycles]
    entity.Ops.FH = entity.Ops.FH + 2; % [hours]
    entity.Ops.IntervalFH = entity.Ops.IntervalFH + 2; % [hours]
elseif (rng1 > 10 && rng1 <= 100) && (rng2 == 2)
    % General Purpose mission with load 2
    entity.Part.Nj = 100; % [Cycles]
    entity.Ops.FH = entity.Ops.FH + 4; % [hours]
    entity.Ops.IntervalFH = entity.Ops.IntervalFH + 4; % [hours]
elseif (rng1 <= 10) && (rng2 == 1)
    % Combat Mission with load 1
    entity.Part.Nj = 1080; % [Cycles]
    entity.Ops.FH = entity.Ops.FH + 6; % [hours]
    entity.Ops.IntervalFH = entity.Ops.IntervalFH + 6; % [hours]
elseif (rng1 <= 10) && (rng2 == 2)
    % Combat Mission with load 2
    entity.Part.Nj = 3600; % [Cycles]
    entity.Ops.FH = entity.Ops.FH + 10; % [hours]
    entity.Ops.IntervalFH = entity.Ops.IntervalFH + 10; % [hours]
end

可行解决方案

1. 训练循环中动态设置独立种子

在RL训练的主循环里,每次迭代前用动态变化的值(比如迭代数、毫秒级时间戳)作为rng种子,避免每次训练初始种子一致:

for episode = 1:numEpisodes
    % 用迭代数+当前时间毫秒值作为种子,保证每次唯一
    rng(episode + floor(now*86400000));
    % 运行包含SimEvents模型的RL环境
    experience = sim(env);
end

2. 为SimEvents分配独立随机流

创建专属的随机流给SimEvents的随机操作,和RL智能体的随机流隔离,避免互相干扰:

% 在SimEvents模型初始化阶段创建独立随机流
simStream = RandStream('mt19937ar','Seed',sum(100*clock));

% 实体服务器块中使用该流生成随机数
rng1 = randi(simStream, [0, 100]);
rng2 = randi(simStream, [1, 2]);

3. 正确配置SimEvents内置随机块

如果之前用内置块失败,按以下步骤调整:

  • 添加两个Uniform Random Number块,分别设置范围为[0,100]和[1,2]
  • 用Entity Signal块将随机数传递到实体服务器块
  • 在服务器块的代码中读取信号值,替代原有的randi生成逻辑
  • 确保随机块的“Seed”设置为“Auto”,或在每次运行前通过脚本动态修改种子

4. 关闭RL智能体的确定性探索模式

部分RL智能体默认开启确定性探索,会固定种子导致随机数无变化,手动关闭该选项:

% 创建DQN智能体时关闭确定性探索
agent = rlDQNAgent(obsInfo, actInfo, 'UseDeterministicExploration', false);

% 或在环境重置函数中取消固定种子设置
function env = resetFunction(env, useDeterministic)
    if ~useDeterministic
        rng(shuffle);
    end
    % 其他重置逻辑
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:18:19