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
相关产品推荐
相关产品推荐

