我建立了一个模型,龟在其中穿越环境并建立了一个表(使用表扩展名),该表表示它们访问过每个特定位置的次数,其中可能有数千个(这些键在“谁的位置)。
这非常有效,因为它允许不经常移动的海龟存储比经常移动的海龟小的结构。
但是,我想执行一个过程,即每隔这么多个周期就将这些访问次数减少一次-这样,乌龟表中的每个项目都会减少一定量。我正在努力寻找一种无需指定所有键即可访问表中所有项目的方法。
有人知道如何轻松地做到这一点吗?还是表格根本不是以这种方式设计的?
非常感谢
答案 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
成为现实,则代码可以利用它来是一个字符的更改(从-
到:
)。