如何生成 table 将 turtle-own 变量链接到报价并在 24 个报价后更新此值
How to generate a table which links a turtle-own variable to ticks and updates this value after after 24 ticks
我是 Netlogo 的新手,但我想建立一个模型,其中代理(汽车 driver)在一天中的每个小时跟踪某个 turtle-own 变量(效用)。我 link 将报价调整为小时,所以一天有 24 个报价。
我打算整合两件事:
- 首先,这个想法是代理人在一天中的特定时间跟踪某个动作的效用(在我的模型中,这将是代理通过收费获得的效用),然后使用这个 utility-value 用于未来的 charge-or-not-charge 决定。我最初的方法是创建一个 table,其中每一行代表一个小时(总共应该有 24 行),列代表观察到的 turtle-own 变量(在本例中:效用)。
- 其次,列中的值应该在每天更新后更新(假设我们已经为星期一 01:00 am(打勾#1)存储了一个 utility-value,然后在一天后这个utility-value 应该由星期二 01:00 获得的 utility-value 更新(打勾 #25)。在这里,我将使用 foreach 来替换旧值通过新的。
turtle-own [utility]
to setup
__clear-all-and-reset-ticks
;; set the start date to January 1, 2020 and link the ticks to one hour
set start-time time:create "2020/01/01 00:00"
set current-time time:anchor-to-ticks start-time 1.0 "hour"
time:anchor-schedule start-time 1.0 "hour"
end
to setup-turtles
ask turtles [
set utility 0
]
end
to go
ask turtles [
set utility utility + 1 ; just a placeholder for now - I'm still working on the true utility-function
]
end
但是我很难实施第一步,因为我不能每小时 link 到 turtle-own 变量 "utility"。
感谢任何帮助!
如果你只想让乌龟存储 24 个效用值(每小时 1 个),那么效用可以是一个列表而不是单个数字。您可以使用 item
访问适当的小时值,因此您可能有一些东西:
let hours ticks mod 24
let new-value 1 + item hours utility
replace-item hours utility new-value
请注意,您需要在列表中包含值才能访问它们。例如,当您的列表只有 5 个值时引用 item 9
将产生错误。此外,NetLogo 是 0 索引的。这意味着列表中的第一个值是通过 item 0
而不是 item 1
.
访问的
正如您提到的您是 NetLogo 新手的一些观察结果。您不太可能需要此模型的时间延长。如果您基本上使用一小时的恒定时间步长,那么只需按正常方式使用 tick
即可。即使您在构建以某种方式引用实时的更复杂模型时最终需要使用时间扩展,您也可以在那时添加它。您还提到了 foreach
- 该原语用于循环遍历列表,您不需要这样做。听起来您会循环遍历效用值列表以表示时间的变化 - 如果是这样,请不要这样做。查看 NetLogo 库中的一些示例模型并尝试理解时间的工作原理。您还应该了解这些模型中设置过程和 go 过程之间的分离,go 过程包含在一个时间步内必须发生的所有事情。您将需要 ticks
(当前时间步长)和 tick
(前进到下一个时间步长)。我怎么强调在任何模拟中理解这一点的重要性都不为过。
我是 Netlogo 的新手,但我想建立一个模型,其中代理(汽车 driver)在一天中的每个小时跟踪某个 turtle-own 变量(效用)。我 link 将报价调整为小时,所以一天有 24 个报价。
我打算整合两件事:
- 首先,这个想法是代理人在一天中的特定时间跟踪某个动作的效用(在我的模型中,这将是代理通过收费获得的效用),然后使用这个 utility-value 用于未来的 charge-or-not-charge 决定。我最初的方法是创建一个 table,其中每一行代表一个小时(总共应该有 24 行),列代表观察到的 turtle-own 变量(在本例中:效用)。
- 其次,列中的值应该在每天更新后更新(假设我们已经为星期一 01:00 am(打勾#1)存储了一个 utility-value,然后在一天后这个utility-value 应该由星期二 01:00 获得的 utility-value 更新(打勾 #25)。在这里,我将使用 foreach 来替换旧值通过新的。
turtle-own [utility]
to setup
__clear-all-and-reset-ticks
;; set the start date to January 1, 2020 and link the ticks to one hour
set start-time time:create "2020/01/01 00:00"
set current-time time:anchor-to-ticks start-time 1.0 "hour"
time:anchor-schedule start-time 1.0 "hour"
end
to setup-turtles
ask turtles [
set utility 0
]
end
to go
ask turtles [
set utility utility + 1 ; just a placeholder for now - I'm still working on the true utility-function
]
end
但是我很难实施第一步,因为我不能每小时 link 到 turtle-own 变量 "utility"。
感谢任何帮助!
如果你只想让乌龟存储 24 个效用值(每小时 1 个),那么效用可以是一个列表而不是单个数字。您可以使用 item
访问适当的小时值,因此您可能有一些东西:
let hours ticks mod 24
let new-value 1 + item hours utility
replace-item hours utility new-value
请注意,您需要在列表中包含值才能访问它们。例如,当您的列表只有 5 个值时引用 item 9
将产生错误。此外,NetLogo 是 0 索引的。这意味着列表中的第一个值是通过 item 0
而不是 item 1
.
正如您提到的您是 NetLogo 新手的一些观察结果。您不太可能需要此模型的时间延长。如果您基本上使用一小时的恒定时间步长,那么只需按正常方式使用 tick
即可。即使您在构建以某种方式引用实时的更复杂模型时最终需要使用时间扩展,您也可以在那时添加它。您还提到了 foreach
- 该原语用于循环遍历列表,您不需要这样做。听起来您会循环遍历效用值列表以表示时间的变化 - 如果是这样,请不要这样做。查看 NetLogo 库中的一些示例模型并尝试理解时间的工作原理。您还应该了解这些模型中设置过程和 go 过程之间的分离,go 过程包含在一个时间步内必须发生的所有事情。您将需要 ticks
(当前时间步长)和 tick
(前进到下一个时间步长)。我怎么强调在任何模拟中理解这一点的重要性都不为过。