基于列表值创建代理集 NetLogo

Creating agentset based on list values NetLogo

我想根据列表中的值对代理进行子集化。在下面的代码中,我有一个值列表,称为“ActiveID”。我想创建一个包含所有海龟的代理集,这些海龟拥有与列表“ActiveID”中的数字相匹配的海龟自己的“ID”值。我希望不隐藏具有匹配值的海龟,而隐藏所有具有不在列表中的“ID”值的海龟。

最终,列表中的每个勾号都会改变。

下面的代码不起作用,因为我一次一个地循环遍历列表“ActiveID”,导致海龟暂时变得可见,但随着代码继续在列表中移动而再次隐藏。理想情况下,我希望“ID”值与列表中的海龟相匹配的海龟不被隐藏。

globals [ ActiveID ]

turtles-own[ ID]

to setup
 ca
create-agents
create-list
reset-ticks
end

to go
  Activate
  tick
end

to create-agents
 create-turtles 20 [
 set ID random  10
 set size 4
 set color red
 setxy random-xcor random-ycor
    ]
end

to create-list
  set ActiveID  [ 0 4 9]
end


to Activate
  foreach ActiveID [ ?1 ->
    ask turtles [
      ifelse ID = ActiveID [
     set hidden? false
  ] [hide-turtle]]]
end ```

按正确的顺序做事肯定会有所作为。想想谁对谁做了什么也很好。

比如,列表是否让海龟做某事? ......或者海龟正在阅读列表并做某事?

如果列表在控制之中……他们如何与海龟交谈以确保它们只更改一次?

您可以隐藏所有的海龟,然后使用列表显示需要显示的海龟。

但这意味着为列表中的每个项目与海龟对话一次,然后再对话一次!

一定有更好的方法!

您可以使用 POSITION 报告器。

Position 在列表中搜索一个值,并报告该值的索引,或者 FALSE 如果该值不在列表中。

所以你会这样做:

Ask turtles
[ set hidden? 
  ((position ID ActiveID) = false)
]

您可以创建代理集,使用 WITH:

Let Active-Agents turtles with
[ position ID ActiveID != false ]