更新 Netlogo 中的列表

Updating a list in Netlogo

我正在尝试更新 netlogo 上列表中的值。 这里的代码是我的碰撞函数:一个品种与另一个品种发生碰撞,将圆圈变成黑色,然后我希望它在列表中存储 'found' 圆圈的 'who' 编号。

它目前只输出每个找到的人的编号,并且每次打印一个 'list' 的编号。

这是代码。

to collide2
  if any? circles2-on neighbors [
     set mylist [] ; not sure why I need this but 
                   ;doesn't work otherwise
     set whovalue [who] of circles2-on neighbors 
     set mylist lput whovalue  mylist
     ask circles2-on neighbors [set color black]
     output-print mylist
     ]
end

如果有多个circles-on neighbors,那么代码[who] of circles-2 on neighbors将return列出它们的值的who ID。您需要 sentence 命令来连接两个列表,使用 lput 会将列表添加为列表中的一个项目。例如:print lput [1 2] [3 4] 将打印出列表 [3 4 [1 2]]。在您的情况下,您将其添加到一个空列表中,因此创建的列表只有一个元素,而该元素本身就是一个列表。

但如果您的目标是获取 who 值的列表,则无需执行任何复杂的操作。代码 let whovalues [who] of circles2-on neighbors 将自动创建一个列表,因为 of 创建一个列表。

因此您的代码可以替换为:

to collide2
  if any? circles2-on neighbors
  [ set whovalues [who] of circles2-on neighbors 
    ask circles2-on neighbors [set color black]
    output-print whovalues
  ]
end

但是,看看您如何必须跟踪 who 值,然后单独 re-find 所有相邻的海龟?这是因为您正在存储 who 值而不是存储代理本身。直接引用代理而不是通过它们的 who 值来识别它们几乎总是更好,这样您就可以避免笨拙的代码,例如:ask turtle with [who = <some value>] [do-something].

因此,切换到海龟而不是 who,并且切换到代理集而不是列表(不是必需的,但列表仅在您需要跟踪订单或有多个实例等时才相关):

to collide2
  if any? circles2-on neighbors
  [ set colliders circles2-on neighbors 
    ask colliders [set color black]
    output-print colliders
  ]
end

所以现在很明显,同样的海龟被发现并变黑了。更好的是,您可以这样做,以便仅创建一次代理集(效率更高且更易于阅读):

to collide2
  let colliders circles2-on neighbors
  if any? colliders
  [ ask colliders [set color black]
    output-print colliders
  ]
end