我需要知道是否可以一次将同一项目添加到多个列表中。具体来说,我想将项目添加到一只乌龟的列表以及连接到该乌龟的所有乌龟的列表中。 像这样:
set list lput item list
(龟列表)
set list lput item list
(邻居列表)
应该相同的项目。您可以想象一个图:乌龟是节点,每只乌龟都有自己的列表。 我的方法是:
ask one-of turtle[
set list lput item list
foreach [in-link-neighbors] of turtles-here
[ item -> set list lput item list ]
]
谢谢您的帮助
答案 0 :(得分:2)
简短的回答-是的,有可能。
这是一个带有打印输出的完整模型,因此您可以看到它在做什么。
turtles-own [mylist]
to setup
clear-all
create-turtles 10
[ set color blue
set mylist (list random 10)
]
ask turtles [ create-links-with n-of 2 other turtles ]
layout-circle turtles 7
ask turtles [show mylist]
ask one-of turtles [add-item-egonet]
ask turtles [show mylist]
reset-ticks
end
to add-item-egonet
let new-value 3
let targets (turtle-set self link-neighbors)
ask targets
[ set color red
set mylist lput new-value mylist
]
end
您没有说尝试代码时会发生什么,但是由于item
和list
是NetLogo关键字,因此您会收到错误消息。您还会遇到逻辑错误-ask
龟时,将透视图(或NetLogo术语中的“上下文”)切换到该龟时,随后的turtles-here
将在同一补丁上拾取所有龟。
我们的方法之间的最大区别在于,我使用的是代理集而不是列表。可以通过遍历一堆乌龟来完成此操作,但是如果您发现自己编写了在一组乌龟上运行foreach
的NetLogo代码,那么您应该做的第一件事就是重新考虑您的方法。在特定情况下,您需要乌龟列表,例如,如果您需要跟踪乌龟遇到的其他乌龟的序列。但是,除非您处于其中一种情况,否则最好使用代理集和ask
。
因此,切换到代理集的范例,我的代码创建了我要更改的乌龟的代理集(选定的乌龟及其网络邻居),然后简单地告诉它们将新值添加到自己列表的末尾值。
请注意,在模型中,这可以通过在询问时同时构造乌龟集而用一行完成,但更典型的做法是(在ask
中所以这个角度就是某些乌龟的视角):
set mylist lput new-value mylist
ask link-neighbors [ set mylist lput new-value mylist ]