我有一个模型,其中海龟导航节点图(也存储为海龟)和离散增量链接(使用move-to
程序)。我想创建一个基于海龟的变量,它允许海龟记住他们访问图中特定节点的次数。
e.g。
move-to
一个节点set #visits #visits + 1
set #visits 1
我想我的选项与列表或表格有关 - 但我不确定哪些选项最有效。关于表格,我不认为密钥可能是一只乌龟 - 也许是一个源于它的字符串 - 但这感觉它可能效率低下。
可能相关的两点:
一些图表将有大量节点(~5000),并且通常一些海龟将永远不会访问所有这些节点,因此将结构快速增长到可能是合理的节省内存。
也可能有相对大量的代理(~2500)
任何建议,一如既往,非常感谢。
答案 0 :(得分:3)
表格是更有效的方式,而且代码更容易,但使用代理作为键不起作用(令我惊讶)。也就是说,您可以使用who
个数字作为键。
看起来像是:
extensions [ table ]
turtles-own [ node-visits ]
...
to move-to-node [ node ]
move-to node
let key [ who ] of node
let visits ifelse-value (table:has-key? node-visits key) [ table:get node-visits key ] [ 0 ]
table:put node-visits key (visits + 1)
end
表在内存使用和查找速度方面都很有效。您可以使用列表执行此操作并在内存使用方面有效(如果使用键值对)或查找速度(如果使用who
数字作为索引或某些内容)但不能同时使用两者,除非你基本上用列表编写自己的哈希表实现。
现在,除此之外,你通常应该担心这些性能问题,直到你:
profiler
扩展程序进行分析)我建议表扩展的真正原因是因为它是最简单的实现。
答案 1 :(得分:1)
我意识到我迟到了,而且布莱恩的答案非常好,但另一种解决方案是使用单独的链接来记录对节点的访问次数:
breed [ nodes node ]
undirected-link-breed [ edges edge ] ; node <---> node
breed [ agents an-agent ]
directed-link-breed [ visits visit ] ; agent ----> node
visits-own [ num-visits ]
to setup
clear-all
create-nodes 10 [ create-edges-with n-of (1 + random 2) other nodes ]
create-agents 10 [ move-to one-of nodes ]
end
to go
ask agents [
let destination one-of [ edge-neighbors ] of one-of nodes-here
move-to destination
if out-visit-to destination = nobody [ create-visit-to destination ]
ask out-visit-to destination [ set num-visits num-visits + 1 ]
]
end
它可能没有使用表扩展那么快,但它的优势在于允许来自双方的查询:您询问代理访问了多少次节点,但您也可以询问节点有多少次时间被哪些代理人访问过。