我进行了两个一般流程的模拟,(1)环境变化,(2)代理做他们的事情。
我仔细地设计了它,这样环境和代理行为就完全独立了。这一点很重要,因为我希望能够模拟一个实验,在这个实验中,环境在运行过程中以重复的模式演化,但是代理变量会发生变化。
我知道我可以使用“具有局部随机性”来运行环境,但只有当我能够跨时间保持两个随机种子时,这才有效。我看不出有什么明显的办法。
我考虑的一个想法是用一个“环境种子”列表初始化环境,它将是一个包含1000个新种子的列表,然后每次我调用时--局部随机性--从列表中获取下一个种子(希望我最终不会意外耗尽)。不幸的是,除了硬编码之外,我不知道如何保持该列表跨运行。
我需要两个随机数发生器,基于不同的种子,我需要能够切换代码中任何给定调用所使用的一个。
非常感谢你的任何想法!
发布于 2014-03-11 14:23:26
如果不编写一个扩展,它比内置到NetLogo中的原语所提供的对RNG状态的控制更多,那么完全不可能做到这一点。(要查看RNG状态的保存和恢复情况,您可以查看export-world和import-world用于进行保存和恢复的代码。)
但我认为你的environment-seeds想法是一个很好的解决办法。您可以将种子存储在文件中,并使用file-read提取它们。或者,您可以使用一个单独的RNG动态生成它们,就像在https://github.com/NetLogo/NetLogo/wiki/Extensions上列出的Adam的RNG扩展提供的那样;这样您就不用担心耗尽了。实际上,可能有一种聪明的方法,可以将每个种子作为先前种子的函数生成,而不涉及该扩展。用前面的种子初始化(当然是在with-local-randomness中)之后,让下一个种子成为由RNG生成的第一个数字如何?
发布于 2014-03-11 02:08:58
您并不真正想要一个随机环境:您需要一个碰巧是随机生成的可重复的环境。
因此,我建议您首先编写环境模拟,按照所需的最大步骤数运行它,同时记录每个步骤的环境状态(以一种格式并使用您设计的方法)。
然后,在实际的实验中,在录制的环境的回放过程中运行代理模拟(使用您设计的方法)。
但是,请注意,每次使用ASK (例如“询问补丁更新记录的值”)时,您都使用随机数生成器,这将影响代理的随机流--但这听起来是可以的。
如果你能接受这一点(假设这给了你在“重复性”方面你想要的东西),那么你就可以了。
https://stackoverflow.com/questions/22308648
复制相似问题