将相同的项目添加到更多列表

Adding same item to more lists

我想知道是否可以一次将同一项目添加到多个列表中。具体来说,我想将项目添加到一只海龟的列表以及连接到该海龟的所有海龟的列表中。 像这样:

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 ] 
]

感谢您的帮助

简答 - 是的,这是可能的。

这是一个带有打印输出的完整模型,因此您可以看到它在做什么。

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

你没有说当你尝试你的代码时发生了什么,但你会收到一个错误,因为 itemlist 是 NetLogo 关键字。您还有一个逻辑错误 - 当您 ask 一只乌龟时,您将视角(或 NetLogo 术语中的 'context')切换到那只乌龟,随后的 turtles-here 将拾起同一只乌龟上的所有乌龟补丁。

我们的方法之间的最大区别是我使用了代理集而不是列表。这可以通过遍历海龟列表来完成,但是如果您发现自己编写的 NetLogo 代码在海龟列表上运行 foreach,您应该做的第一件事就是重新考虑您的方法。在某些特定情况下,您需要海龟列表,例如,如果您需要跟踪海龟遇到的其他海龟的顺序。但是,除非您处于其中一种情况,否则最好使用代理集和 ask.

因此,切换到代理集的范例,我的代码创建了我想要更改的海龟代理集(选定的海龟及其网络邻居),然后简单地告诉它们在它们的末尾添加新值自己的值列表。

请注意,在一个模型中,这可以通过在询问它的同时构造海龟集来用单行来实现,但是更典型的做法是(从 ask 所以视角是一些选定的海龟的视角):

set mylist lput new-value mylist
ask link-neighbors [ set mylist lput new-value mylist ]