随机发生器使用快速启动并行仿真的种子

28日视图(30天)
我要进行蒙特卡罗模拟,模拟仿真软件模型数千倍。万博1manbetx模型是由块SimEvent-toolbox和一些标准块。
我用一个仿真软件功能万博1manbetx块调用matlab函数块。在这里我试着模拟传感器的分解在一年的服务机(模型的其余部分)。
matlab函数:
函数[outputPort、日志]= failureRate(时间、λnSensors)
持续的failedCount失败
如果isempty(失败)
失败= false (1、nSensors);
failedCount = 0;
rng (“洗牌”)
结束
%故障率函数,随机变量
failRate = @ (t, lam) 1 - exp (- t * lam);
兰德(r = 1, nSensors);
nBroken = 0;
%检查传感器是否休息
如果任何(r < failRate(时间,λ))
tmp =失败;
失败= max(失败,r < failRate(时间、λ));
如果failedCount <总和(失败)
failedCount =总和(失败);
nBroken =(失败- tmp)之和;
结束
结束
如果(失败)
%所有传感器坏了
outputPort = 2;
日志= (nBroken、时间);
其他的
%一些传感器仍然工作
outputPort = 1;
日志=(0、时间);
结束
结束
每次调用这个函数一个实体进入一个“实体服务器”块,这将决定哪些路径会(传感器失败路径或不是)。
我可以运行这个模型使用一个正常的循环使用快速重启但只要我试着使用快速并行计算随机化成为反复重启。
我试过了:
i = 1: n
思敏(i) = Sim万博1manbetxulink.SimulationInput (“SensorFailure”);
思敏(i) =思敏(我).setPreSimFcn (@ (x)提高(“洗牌”));
结束
但它不工作时快速重启actiaved使用parsim命令。我也试过和没有parsim“SetupFnc”选项(和所有这三个的不同组合。
= parsim(思敏,
“ShowSimulationManager”,“关闭”,
“ShowProgress”,“上”,
“TransferBaseWorkspaceVariables”,“上”,
“UseFastRestart”,“上”,
“SetupFcn”@ ()rng(兰迪(9999999)),
“StopOnError”,“上”);
我也试着用parfor循环但只要快速重启将重复随机化很活跃。
parfori = 1: n
rng (“洗牌”)%尝试与洗牌和兰迪(10000)
= sim卡(“SensorFailure”,“FastRestart”,“上”);
数据我{}= out.sensorfailed (out.sensorfailed (: 1) > 0, 2);
如果国防部(我,10)= = 0
disp(我)
结束
结束
因为我想运行成千上万的模拟和problably事情需要重做一次模拟的结果分析了任何增长时间值得一些时间调查!
我试着用rng(“洗牌”)和rng(兰迪(100000))对于所有可能的情况因为我明白“洗牌”并不适合并行计算。我也尝试过这些命令在仿真软件模型的回调(初始化并开始回调)万博1manbetx

接受的答案

Niklas拉尔森
Niklas拉尔森 2021年9月13日
一段时间后,我设法找到一个解决方案,解决了我的问题!
通过添加一个输入参数输入的matlab函数和喂养一个常数value-block:
函数[outputPort、日志]= failureRate(时间、λnSensors、种子)
持续的failedCount失败
如果isempty(失败)
失败= false (1、nSensors);
failedCount = 0;
rng(种子)%发起与种子从常数块以外的功能。
结束
%故障率函数,随机变量
failRate = @ (t, lam) 1 - exp (- t * lam);
兰德(r = 1, nSensors);
nBroken = 0;
如果任何(r < failRate(时间,λ))
tmp =失败;
失败= max(失败,r < failRate(时间、λ));
日志= (0,0);
如果failedCount <总和(失败)
failedCount =总和(失败);
nBroken =(失败- tmp)之和;
结束
结束
如果(失败)
%所有传感器坏了
outputPort = 2;
日志= (nBroken、时间);
其他的
%仍然工作
outputPort = 1;
日志= (nBroken > 0,时间);
结束
结束
然后为每个模拟SimulationInput-object随机种子值如下:
seedBlockPath =“SensorFailure /子系统/仿真软件功万博1manbetx能/种子”;
i = 1: n
%设置为每个模拟随机种子
思敏(i) = Sim万博1manbetxulink.SimulationInput (“SensorFailure”);
r =兰迪(99999);
思敏(i) =思敏(我).setBlockParameter (seedBlockPath,“价值”num2str (r));
结束
= parsim(思敏,
“ShowSimulationManager”,“关闭”,
“ShowProgress”,“上”,
“TransferBaseWorkspaceVariables”,“上”,
“UseFastRestart”,“上”,
“StopOnError”,“上”);
13个评论
Niklas拉尔森
Niklas拉尔森 2021年9月27日
我想这也会工作,如果像你说的,中间的dt多方很小。我不认为这是对我的情况。
无论如何,非常感谢你的时间和专业知识!

登录置评。

答案(1)

Abdolkarim穆罕默
Abdolkarim穆罕默 2021年9月10日
编辑:Abdolkarim穆罕默 2021年9月10日
我不知道解决你的问题,我只是想说,我面临一个问题与SimEvents parsim () R2020a快速重启前一段时间,我写在这里。
他们说这是一个错误报告。
但在R2021a问题依然存在。也许你的问题与这个bug。
1评论
Edric埃利斯
Edric埃利斯 2021年9月13日
这个bug报告表明在R2020b问题是固定的。如果你能复制你的问题在R2020b(或更高版本),然后别的必须出错,请联系MathWorks支持复制步骤。万博1manbetx

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的