使用多个随机种子来保持代理和环境分离

时间:2014-03-10 18:44:58

标签: netlogo

我有一个模拟,它以两个一般流程进行,(1)环境变化,(2)代理人做他们的事情。

我仔细设计了这个,以便环境和代理行为完全独立。这很重要,因为我希望能够模拟一个实验,在这个实验中,环境在运行中以重复模式发展,但代理变量会发生变化。

我知道我可以使用" with-local-randomness"来运行环境,但这只有在我可以保持两个随机种子的时候才有效。我没有看到明显的方法。

我考虑的一个想法是使用列表" environment-seeds"来初始化环境。这将是一个包含1000个新种子的列表,然后每次我用本地随机性调用时,都会从列表中获取下一个种子(希望我不会意外地用完)。不幸的是,除了硬编码之外,我不知道如何在列表中保留列表。

tl; dr我需要两个有两个随机数生成器,基于不同的种子,我需要能够在代码中切换哪一个用于任何给定的调用。

非常感谢任何想法!!

2 个答案:

答案 0 :(得分:1)

你真的不想要一个随机环境:你想要一个碰巧随机生成的可重复环境。

所以,我建议你先编写你的环境模拟,运行它以获得所需的最大步数,同时记录每个步骤的环境状态(采用一种格式并使用你设计的方法)。

然后,对于您的实际实验,您可以在录制环境的播放上运行代理模拟(使用您设计的方法)。

但请注意,每次使用ASK时(例如“询问补丁[从记录值更新]”)您使用的是随机数生成器,这会影响您的代理随机流 - 但它听起来这样就行了。

如果你能接受(假设你给出了你想要的“可重复性”),那么,你去吧。

答案 1 :(得分:0)

除非你编写一个extension,使你能够更好地控制RNG状态,而不是NetLogo中内置的原语所提供的,否则不可能完全按照自己的意愿行事。 (要查看保存和恢复RNG状态的外观,您可以查看export-worldimport-world用来执行此操作的代码。)

但我认为您的environment-seeds想法是一个很好的解决方法。您可以将种子存储在一个文件中,并使用file-read将它们拉出来。或者,您可以使用单独的RNG动态生成它们,由Adam MacKenzie的RNG扩展提供,列于https://github.com/NetLogo/NetLogo/wiki/Extensions;那你就不用担心用完了。实际上,可能有一种聪明的方法来生成每个种子作为前一种子的函数而不涉及该扩展。如何使下一个种子成为RNG在使用之前的种子进行初始化(当然在with-local-randomness内)后生成的第一个数字?