在 NetLogo 中定义常量

Defining constants in NetLogo

在 NetLogo 中定义常量有哪些可用选项(如果有)?我正在考虑在代码 中而不是在界面中定义常量 。这些值不打算作为通过界面的输入从 用户 接收。

在 NetLogo 中定义常量有哪些可用选项(如果有)?我正在考虑在代码 中而不是在界面中定义常量 。这些值不打算作为通过界面的输入从 用户 接收。

目标如下:

  1. 在代码中的一处定义常量,并在需要的地方使用它。这将使人们能够在一个地方调整值。

  2. 防止在代码的其他地方意外修改常量值。

我正在考虑创建类似于数学常量 epi 的东西,它们被嵌入到 NetLogo 中,但在单个模型级别。

  1. 是否可以创建这样的常量?

  2. 是否有不止一种方法来定义这样的常量?如果是,可用的选项是什么以及相关的优缺点?

我想到了两种方式:

(1) 使用设置时指定的全局变量

例如:

globals [
  a-cool-number
  a-number-that-I-don't-like
]

to setup
  clear-all
  
  set a-cool-number 7
  set a-number-that-I-don't-like 44
  
  create-turtles 1
end

to go
  ask turtles [
    show word "The best number is " a-cool-number
    show word "The same is not true for " a-number-that-I-don't-like
  ]
end

优点:有效。

缺点:您声明的全局变量越多,通过阅读代码来接近您的模型就越不容易(尽管使用注释通过说明它们是只有常量会有所帮助)。此外,理论上这些变量可能会被代理或您意外修改(尽管我认为这是一个遥远的风险,如果这些变量确实只在设置时指定并且再也不会指定的话)。

(2) 使用报告程序

例如:

to setup
  clear-all
  
  create-turtles 1
end

to go
  ask turtles [
    show word "The best number is " a-cool-number
    show word "The same is not true for " a-number-that-I-don't-like
  ]
end


to-report a-cool-number
  report 7
end

to-report a-number-that-I-don't-like
  report 44
end

优点:有效。此外,你的常量值不可能被代理人无意中修改,甚至你自己也不会(当然,除非你直接去更改报告程序中的代码)。

缺点:None我现在能想到的。


总而言之,鉴于您提出问题的方式,我认为记者程序是您的最佳选择。

Matteo 的回答很好,我也会用记者。但我想再添加一种有点“偷偷摸摸”的方法。您可以创建小部件、输入、滑块或选择器,然后将禁用背景透明度的标签小部件放置在顶部以“隐藏”它们。小部件按照它们添加到模型中的顺序显示,因此标签小部件最后绘制在其他全局变量小部件的顶部。

这让您拥有一个全局变量,您可以在没有明显支持小部件的代码中使用该变量。您给它的任何值都将与模型一起保存,因此将是“常量”。

我唯一会使用此技术的情况是,如果我真的不想让任何人出于某种原因查看模型代码以查看常量值的来源。我什至想不出 that 有多少用途,但是嘿,我只是想让人们知道这种可能性。

此方法的一大缺点是您可以通过命令中心或其他代码更改值而不会注意到它,因为该值是隐藏的。

这是一张图片,希望能说明问题。我没有完全隐藏输入小部件,我在标签中留下了文字只是为了让图片不是一个大的空白区域。