访问netlogo表中的所有元素

时间:2018-12-13 10:34:28

标签: netlogo

我建立了一个模型,龟在其中穿越环境并建立了一个表(使用表扩展名),该表表示它们访问过每个特定位置的次数,其中可能有数千个(这些键在“谁的位置)。

这非常有效,因为它允许不经常移动的海龟存储比经常移动的海龟小的结构。

但是,我想执行一个过程,即每隔这么多个周期就将这些访问次数减少一次-这样,乌龟表中的每个项目都会减少一定量。我正在努力寻找一种无需指定所有键即可访问表中所有项目的方法。

有人知道如何轻松地做到这一点吗?还是表格根本不是以这种方式设计的?

非常感谢

2 个答案:

答案 0 :(得分:3)

好吧-这就是通常的情况,一旦您指定问题,就可以找到解决方案。

这可以通过以下方法完成:返回表中的所有键,然后使用foreach逐步遍历它们,并逐个访问每个元素。

to decay

    let memory table:keys location-visits

    foreach memory
    [
        x -> let visits table:get location-visits x
        table:put location-visits x (visits - 1)
    ]

end

我的真实版本还检查以确保访问量永远不会降到零以下。

在此阶段,这似乎相对有效-但如果有更快的方法,我会很高兴-幸好我没有在每个周期都运行此代码。

希望这对某人有用-我现在觉得很傻。

欢呼

答案 1 :(得分:2)

table扩展上存在一个未解决的问题,建议添加一个table:map过程来完全满足您的需要,这里为https://github.com/NetLogo/Table-Extension/issues/6

在此问题中,布莱恩·黑德(Bryan Head)提出了这样一个原始的NetLogo实现:

to-report table-map [ tbl fn ]
  report table:from-list map [ entry ->
    list (first entry) (runresult fn last entry)
  ] table:to-list tbl
end

在您的情况下,它会像这样使用:

set location-visits table-map location-visits [ visits -> visits - 1 ]

这可能会或可能不会比您自己的解决方案快,但是可能值得尝试。主要优点是,如果table:map成为现实,则代码可以利用它来是一个字符的更改(从-:)。