2

我想从我的 Repast 模型中删除所有随机化,以便我可以自信地重构功能不变。但是,我无法通过RandomHelper.setSeed(1)在顶部使用设置种子来删除随机化myBuilder.build(),并确保1在初始化时在 GUI 中将我的“默认随机种子”参数种子设置为。

因此,我尝试从样本 JZombies 模型中删除随机化,并遇到了同样的问题。再次,我设置RandomHelper.setSeed(1)在顶部JZombiesBuilder.build(),并确保默认随机种子设置为1. 有时输出是相同的,有时不是。

在这两种情况下,我都使用文本接收器来记录聚合代理计数和聚合代理属性的恒定数量的滴答作为我的数据。我发现使用 Windows 的FC&的输出文件存在差异FCIV

我需要进行哪些更改以确保确定性行为?

编辑:

在 JZombies 演示模型中,我还通过将RandomHelper.setSeed(1);每个类的构造函数放在顶部来获得确定性行为。在我的实际模型中做同样的事情会使第一步始终相同。与第二次打勾仍然存在差异。我认为问题是随机调度,现在?

4

1 回答 1

2

你不应该设置你的随机种子两次,所以我会从RandomHelper.setSeed(1)你的构建器(和其他地方)中删除调用开始。您提到的 GUI 随机种子是通过 JZombies_Demo.rs/parameters.xml 文件设置的。

关于你的实际问题。如果您对代码中的所有随机元素使用 RandomHelper 调用,您应该会看到可重现的结果。如果不是,这可能表明存在一些无法解释的随机性,例如,使用了非 RandomHelper 调用或类似遍历 HashMap 的东西。例如,当您使用 for 循环在 DefaultContext 上进行迭代时,迭代发生在 HashSet 上,但当使用 Context.getObjects() 方法时,内部迭代是在 LinkedHashMap 上进行的,因此确保了可重复性。

于 2020-05-30T19:13:14.883 回答