参数变化:固定,但运行的种子不同

Posted

技术标签:

【中文标题】参数变化:固定,但运行的种子不同【英文标题】:Parameter Variation: Fixed, but different seeds for runs 【发布时间】:2020-08-27 10:01:31 【问题描述】:

所以我用许多概率参数进行了参数变化实验。我使用随机种子,这会产生各种不同的结果,这基本上是我想要的。在我的案例中,一项实验包含 200 次运行。

但是,在随机建模中使用相同的种子进行相同的运行是一种很好的做法,即当我运行两个实验,每次运行 200 次时,我希望每个实验的第一次运行使用相同的种子,第二次运行使用相同的种子(但与第一次运行不同)运行每个实验,第三次......等等直到 200。这意味着我可以将两个实验相互比较,因为它们使用了相同的种子。

我怎样才能做到这一点是 Anylogic?当我使用随机种子选项时,每次运行都会得到不同的种子。当我使用固定种子时,每次都会得到相同的结果,因为从概率参数中选择的值总是相同的。 这可以通过在参数变化实验的“随机性”属性中使用“自定义生成器”来实现吗?或者这可以与复制选项一起使用吗?

非常感谢,如果您需要更多详细信息,请告诉我。

【问题讨论】:

【参考方案1】:

在参数变化实验中 --> 'Before simulation run' 下的 Java Actions 你可以为每个复制手动设置种子,

例如root.getDefaultRandomGenerator().setSeed(listOfSeeds.get(getCurrentReplication()));

listOfSeeds 是您的 ParametersVariation 中的一个集合,您可以在界面中或在“初始实验设置”中生成它,该集合存储每次复制的所有种子。

【讨论】:

谢谢,这听起来真的很有用,我理解它背后的原因。但是,我收到“种子”无法解析或不是字段的错误(对于命令root.seed = listOfSeeds.get(getCurrentReplication()); 我该怎么办? 哦,真的。我将种子作为变量保存在 main 中,以便稍后在每次运行时查看它。我更正了上面的代码,直接在 ParametersVariation 实验中设置种子。 非常感谢!我在你的代码中用getCurrentIteration 替换了getCurrentReplication,因为getCurrentReplication 我所有的结果都是一样的(即只有一个种子)。此外,我使用数组变量而不是集合,并使用 variable[getCurrentIteration()] 来检索当前迭代。您认为使用数组变量和getCurrentIteration 可以达到相同的目标吗?非常感谢!! :) 取决于您的实现。数组根本不重要。迭代更棘手。例如,假设您有一个要从 0 变为 1 的参数。比您有 2 次迭代,您将在设置为 0 和设置为 1 上运行不同的种子。复制重复每个设置(例如,100 次)。因此,您进行 200 次模拟运行,0 次运行 100 次,1 次运行 100 次。通常,您希望确保这 100 次运行在两种设置之间是相似的。但是,如果您将复制建模为迭代,您将获得相同的结果。 是的,我明白了。我认为在我的情况下这并不重要,因为我只想确保两个独立的实验使用相同的种子。所以我运行一个实验 200 次,回到 Anylogic,更改一些参数,然后我运行另一个实验 200 次。我认为通过我的实现,我可以确保这两个实验使用相同的种子。【参考方案2】:

这符合您的要求吗?

https://help.anylogic.com/index.jsp?topic=%2Fcom.anylogic.help%2Fhtml%2Fstochastic%2FCustom_RNG.html

...或随机建模下的任何其他条目

https://help.anylogic.com/index.jsp?nav=%2F0_17

【讨论】:

谢谢,我以前看过那些,但找不到解决问题的方法...

以上是关于参数变化:固定,但运行的种子不同的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TensorFlow 获得稳定的结果,设置随机种子

SVM sklearn 上的随机种子产生不同的结果

R tuneRF 不稳定,如何优化?

VB中randomize的作用

Rails 固定装置与种子

为每次运行代码设置不同的种子