如何在与 matlab 中的 simevents 集成的强化学习模拟中维护随机数

问题描述 投票:0回答:1

亲爱的 Stack Overflow 社区,

我目前正在使用 matlab 对集成到 simevents 系统中的强化学习代理进行建模。我的模型能够运行,但是实体服务器块“任务”中应该有一个随机数生成器。如果我拔掉 RL 代理并仅运行 simevents 模型,随机数会按预期随机生成,但是如果我使用 RL 代理运行完整模型,结果总是给出相同的值,而且根本不是随机的。我知道 matlab rng 是确定性的并且取决于预定义的种子,您认为我应该如何继续为我的模型获得实际的随机数?我提供了我的模型的一些屏幕截图,以便您熟悉它。

Simulink 模型

这是我目前拥有的代码行:

% 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
  • 之前我尝试过设置 rng('shuffle') 但还没有得到结果。
  • 其他尝试是利用 simevents 的统一随机生成器块,但将它们从信号转换为实体服务器使用的实体是一个问题
  • 我还尝试使用类似于此方法的修改种子在实体服务器内插入统一随机数的模式:Matlab Answers

如果我需要提供任何进一步的信息,以便更清楚地了解我的问题,请告诉我。 预先感谢您。

matlab simulink reinforcement-learning multi-agent-reinforcement-learning simevents
1个回答
0
投票

将强化学习代理 (RL) 与 SimEvents 模型集成时,如果 RNG 管理不当,MATLAB 的 RNG 的确定性可能会导致非随机行为。

如果您想在使用 RL 代理时保持 SimEvents 模型的随机性,我建议您这样做:

  • 为 SimEvents 模型和 RL 代理使用单独的随机数流。 MATLAB 允许您通过
    RandStream
    创建多个独立的随机数流。

它应该看起来像这样:

% Create a separate random stream for SimEvents
simEventsRng = RandStream('mt19937ar','Seed','shuffle'); % 'shuffle' initializes based on the current time

% Generate random numbers using the separate stream
rng1 = randi(simEventsRng, [0, 100]);
rng2 = randi(simEventsRng, [1, 2]);

% Your decision logic based on rng1 and rng2 remains the same
if (rng1 > 10 && rng1 <= 100) && (rng2 == 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)
    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)
    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)
    entity.Part.Nj = 3600; % [Cycles]
    entity.Ops.FH = entity.Ops.FH + 10; % [hours]
    entity.Ops.IntervalFH = entity.Ops.IntervalFH + 10; % [hours]
end
  • 在 RL 训练的每个模拟步骤或每个片段开始时重新初始化 RNG。您可以使用
    rng('shuffle')
    来完成此操作。既然你已经说过你已经这样做了,那么上面的方法可能会更有效。
  • 您还可以使用 SimEvents 的内置随机数生成器块作为另一种解决方案。这可能具有挑战性,因为正如您所指出的,即将信号输出转换为实体。您可以使用
    entity
    函数将信号转换为实体来弥补这一差距。
  • 如果所有其他方法都失败了,即使这是一个简单的步骤,我也会确保模型或 RL 代理的其他部分不会意外重置 RNG;我会调试并验证您的解决方案,将其归因于随机计算机错误。

只需仔细检查我编写的代码是否符合您的环境。

© www.soinside.com 2019 - 2024. All rights reserved.