可重现的结果使用来自r

时间:2017-04-20 11:12:01

标签: r import export netlogo

我从R运行Netlogo,我想每次运行前更新一个参数。我从每次相同的随机种子开始,我从tick零设置netlogo,使用export-world导出结果,然后运行import-world,更新一个参数,然后输出使用export-world(ticks = 1),这里给出相同的结果。但是,当在tick 1之后启动时,运行import-world,更新一个参数,然后输出use export-world(ticks = 2),这里给出的结果与直接运行2年没有更新一个参数不一样。 这是我正在使用的代码:

#Try to get quickmodel running

options( java.parameters = "-Xmx10g" )
library(rJava)
library(RNetLogo)
require(RNetLogo)

set.seed(-986131948)
nl.path     <- "C:/Program Files (x86)/NetLogo 5.2.0"

model.path  <- ".xxxx.nlogo"

my.netlogo <-"_xxxx.nlogo"
NLStart(nl.path, gui=F, nl.obj=my.netlogo) 
NLLoadModel(model.path, nl.obj=my.netlogo) 
NLCommand("setup", nl.obj=my.netlogo) 
NLCommand('export-world "setup.csv" ', nl.obj=my.netlogo) 

# here tick=0
NLCommand('Import-world "setup.csv" ', nl.obj=my.netlogo) 
NLCommand("updatedoneparamter", nl.obj=my.netlogo) 
NLCommand("go", nl.obj=my.netlogo)
ticks <- NLReport("ticks", nl.obj=my.netlogo)
print(ticks)
NLCommand('export-world "go.csv" ', nl.obj=my.netlogo) #save all the results from first year run

 #start tick =1
NLCommand('Import-world "go.csv" ', nl.obj=my.netlogo) 
#NLCommand("random-seed -986131948", nl.obj=my.netlogo)
NLCommand("updatedoneparamter", nl.obj=my.netlogo) 
NLCommand("go", nl.obj=my.netlogo)
ticks <- NLReport("ticks", nl.obj=my.netlogo)
print(ticks)  # tick=2
NLCommand('export-world "go.csv" ', nl.obj=my.netlogo) 

这与运行下面的代码

的结果不一样
options( java.parameters = "-Xmx10g" )
library(rJava)
library(RNetLogo)
require(RNetLogo)

set.seed(-986131948)
nl.path     <- "C:/Program Files (x86)/NetLogo 5.2.0"

model.path  <- "_xxxx.nlogo"

my.netlogo <-"_xxxx.nlogo"
NLStart(nl.path, gui=F, nl.obj=my.netlogo) 
NLLoadModel(model.path, nl.obj=my.netlogo) 
NLCommand("setup", nl.obj=my.netlogo) 
NLCommand("updatedoneparamter", nl.obj=my.netlogo)
NLCommand(2,"go", nl.obj=my.netlogo) 

请注意,为了测试脚本,每次运行时updatedoneparamter都是相同的

有谁知道为什么我有不同的结果?因为我从相同的随机种子开始。

由于 上华

1 个答案:

答案 0 :(得分:2)

R中有相同的种子(使用set.seed),但NetLogo使用单独的随机数生成器及其独立的种子。要设置NetLogo种子,请使用NLCommand("random-seed 0", nl.obj=my.netlogo)。可以找到random-seed的NetLogo文档here

编辑: 在设置NetLogo随机种子之前,我一开始并没有注意到您正在运行setupgo。这将导致您在出口世界时出现不同的世界条件(以及不同的结果)。要获得完全可重现的结果,您应在加载NetLogo模型后立即设置随机种子,然后再运行setupgo或任何其他过程。