没有任何反应时,NetLogo监视器小部件显示发生更改

Jas*_*per 4 netlogo

我有一个NetLogo模型,简化为:

to setup
  clear-all
  create-turtles 1000 [ 
    fd 100
  ]
end
Run Code Online (Sandbox Code Playgroud)

当我将UI监视器小部件添加到UI中时,带有一个类似Report的报表器,mean [xcor] of turtles然后运行setup,该监视器中的值就会不断变化。它可能会显示0.2305090322262271一个瞬间,然后显示下一个瞬间0.2305090322262268,然后再显示另一个相似的数字。

是什么让监视器小部件像这样闪烁或闪烁?我该如何预防?

Jas*_*per 6

这是由以下因素共同引起的:

  1. NetLogo使用浮点数,这会产生较小的精度问题。请参阅《 NetLogo编程指南》中的浮点精度https : //ccl.northwestern.edu/netlogo/docs/programming.html#math
  2. 诸如这样的代理集turtles总是以随机顺序返回。
  3. 监控器会不断地重新运行其报告程序计算,即使您没有使用永久性按钮或通过命令中心运行任何模型代码时也是如此。

因此,监控程序会不断地重新运行其mean [xcor] of turtles报告程序,但是turtles代理集以随机顺序提供给海龟,因此mean由于顺序的不同,每次的浮点不准确度都会以略有不同的方式累积。最终结果是,在什么都没有发生的情况下,您看到的监视器控件中闪烁的数字略有不同。

您可能会遇到相同的问题,sum [xcor] of turtles或者variance [xcor] of turtles-每次将代理集的浮点数减少为单个值时,都会遇到相同的问题。您还可以看到直接在命令中心重复运行报告程序代码的问题,而根本没有监视器小部件。

修复非常简单:

  • 排序你的号码,你计算前: mean sort [xcor] of turtlessum sort [xcor] of turtlesvariance sort [xcor] of turtles。如果数字顺序相同,则浮点精度仍然会很小,但每次都相同,因此您不会看到值发生变化。这可能是最好的解决方案,但是如果您的代理集非常大,它可能会很慢。
  • Decimal places将显示器的设置更改为您不会注意到变化值的数字。由于结果的差异应该很小,因此通常是可能的。