Netlogo 表示其他海龟记忆的海龟变量
我有一个模型,其中海龟以离散增量(使用Netlogo 表示其他海龟记忆的海龟变量,netlogo,Netlogo,我有一个模型,其中海龟以离散增量(使用移动到过程)浏览节点图(也存储为海龟)和链接。我想创建一个基于turtle的变量,它允许turtle记住他们访问图中特定节点的次数 e、 g 海龟移动到节点 在所需结构中查找该节点的存在 如果存在设置与该节点关联的#访问#访问+1 如果未将其包括在结构中,则set#访问1 我想我的选项与列表或表格相关,但我不确定哪一个是最有效的。关于表,我认为关键不可能是海龟——也许是从who派生的字符串——但这感觉可能效率低下 可能相关的两点: 有些图将有大量的节点(~
移动到过程)浏览节点图(也存储为海龟)和链接。我想创建一个基于turtle的变量,它允许turtle记住他们访问图中特定节点的次数
e、 g
海龟移动到节点
在所需结构中查找该节点的存在
如果存在设置与该节点关联的#访问#访问+1
如果未将其包括在结构中,则set#访问1
我想我的选项与列表或表格相关,但我不确定哪一个是最有效的。关于表,我认为关键不可能是海龟——也许是从who派生的字符串——但这感觉可能效率低下
可能相关的两点:
- 有些图将有大量的节点(~5000个),而有些海龟通常不会访问所有的节点,因此动态增长结构以节省内存可能是明智的
- 也可能有数量相对较多的代理(~2500)
如以往一样,任何建议都将不胜感激 表是一种更有效的方式,而且在代码方面也更简单,尽管使用代理作为键不起作用(这让我很惊讶)。也就是说,您可以使用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
数字作为索引或其他什么)方面效率很高,但不能同时使用这两种方法,除非您基本上使用列表编写自己的哈希表实现
现在,抛开所有这些不谈,您通常应该担心以下性能问题,直到您:
现在有性能问题吗
知道这些是性能问题的根源(通过使用计时器或分析器
扩展进行评测)
我建议使用表扩展的真正原因是因为它是最简单的实现方式。我意识到我迟到了,Bryan的回答很好,但另一种解决方案是使用单独的链接来记录对节点的访问次数:
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
繁殖[节点]
无向链接繁殖[边缘];节点
繁殖[代理人]
定向链接[访问];代理-->节点
自己的访问量[num访问量]
设置
清除所有
创建节点10[使用n个(1+随机2个)其他节点创建边]
创建代理10[移动到其中一个节点]
结束
外带
询问代理人[
让目标节点成为其中一个节点的[边缘邻居]之一
移动到目的地
如果外出访问目的地=无人[创建访问目的地]
邀请访问目的地[设置访问次数num visions num visions+1]
]
结束
它可能没有使用表扩展的速度快,但它的优点是允许从两侧进行查询:您可以询问代理访问了哪些节点多少次,但您也可以询问节点被哪些代理访问了多少次。感谢这一点,Bryan-看起来正是我要找的。但是,在实现时,我会收到以下错误消息:扩展异常:(子节点149)不是有效的表键(表键只能是数字、字符串、true或false,或者项目为有效键的列表)
我使用设置节点访问表:make
实例化了表。我也在运行5.2.1而不是5.3.1,如果这有什么不同的话。我为代理打开了一个问题作为密钥: