NetLogo 监视小部件显示在没有发生任何事情时发生变化

NetLogo monitor widget display changes when nothing is happening

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

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

当我将监视器小部件添加到 UI 时,使用 mean [xcor] of turtles 这样的记者,然后 运行 setup,监视器中的值略有变化不断地。它可能前一秒显示 0.2305090322262271,后一秒显示 0.2305090322262268,然后不断显示另一个类似的数字。

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

这是由以下几种因素共同造成的:

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

所以监视器不断地重新运行它的 mean [xcor] of turtles 报告者,但是 turtles 代理集以随机顺序给海龟,所以 mean [xcor] of turtles 的浮点数不准确=13=] 由于顺序不同,每次累积的方式都会略有不同。最终结果是您看到监视器小部件中闪烁的数字略有不同,但什么也没有发生。

您会在 sum [xcor] of turtlesvariance [xcor] of turtles 中看到同样的问题 - 任何时候您将代理集中的一堆浮点数减少为单个值。您还可以看到 运行 直接在命令中心重复使用您的记者代码的问题,根本没有监视器小部件。

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

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