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

时间:2019-04-03 17:06:23

标签: netlogo

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

to setup
  clear-all
  create-turtles 1000 [ 
    fd 100
  ]
end

当我使用mean [xcor] of turtles之类的报告器将监视器小部件添加到UI时,然后运行setup,监视器中的值会不断变化。它可能会先显示0.2305090322262271,然后再显示0.2305090322262268,然后再显示另一个相似的数字。

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

幸运的是,修复非常简单:

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