Netlogo 当他们在一起时,询问另一个代理的id,并检查其是否重复

Netlogo 当他们在一起时,询问另一个代理的id,并检查其是否重复,netlogo,Netlogo,漫游器(动态)在连接链接的节点之间移动。某些节点具有事件(静态)代理。我想将这些事件的id保存在walker自己的列表(eve id)中。现在我在做: move-to n ; n is a next node if any? events-here [ let event-x events-here set eve-ids lput ([who] of event-x) eve-ids ] 这行代码将事件品种id写入eve id,但我想知道这不是walker已经发现的重复事件(

漫游器(动态)在连接链接的节点之间移动。某些节点具有事件(静态)代理。我想将这些事件的id保存在walker自己的列表(eve id)中。现在我在做:

move-to n ; n is a next node
if any? events-here [ 
   let event-x events-here
   set eve-ids lput ([who] of event-x) eve-ids 
]
这行代码将
事件
品种id写入
eve id
,但我想知道这不是walker已经发现的重复事件(即,仅在首次发现时写入事件id)


非常感谢您的帮助

我可以想出两种方法来解决这个问题。两者都认识到这里的
事件
产生了一个代理集,因此event-x的
[who]产生了一个事件代理列表。因此,在其他条件相同的情况下,
eveids
将是一个代理编号列表

一种方法是将列表列表制作成一个简单的列表,然后使用
删除重复项
删除任何重复事件。在NetLogo v.5.3中,第一步可以使用
reduce
句子
完成,如下所示

set eve-ids lput event-x eve-ids   ;add the event-x list to eve-ids
set eve-ids reduce [sentence ?1 ?2] eve-ids  ;collapses eve-ids to a simple list
set eve-ids remove-duplicates eve-ids   ;insures no duplicate events
当然,如果在每次发现新事件时都执行此操作,那么每次eve ID都将折叠为一个简单的列表,然后使用
foreach
(尽管
map
也可以执行此操作)。这里我们只是在event-x中附加event-id中尚未找到的事件

foreach event-x [
  if not member? ? eve-ids [set eve-ids lput ? eve-ids]
]
现在,我将向NetLogo专家们介绍,并建议,除非你真的需要他们,否则你根本不应该使用世卫组织的数字,而应该为你的活动使用代理集。这也使生活更简单,因为agentset不能包含重复项。所以,如果你做了如下事情:

set eve-ids no-turtles  ;start with an empty set of events.
启动你的沃克特工

那么您的代码可以是:

move-to n ; n is a next node
if any? events-here [ 
   let event-x events-here
   set eve-ids (turtle-set eve-ids event-x)
]
您将拥有一组越来越多的事件代理,它们没有重复项

希望这能有所帮助-如果您使用的是NetLogo v6.0,则
reduce
foreach
编码将有所不同,因为那时将使用匿名记者


查尔斯非常感谢你的回答。我最喜欢第三种解决方案,这在我看来似乎更好。我假设,尽管eve ids是一个walker own变量,但它可以包含一组代理。我认为这只能通过Netlogo中的
breed
来实现。是的,
walker-own
变量可以包含一个代理集(海龟集),并且集中的代理不一定都是同一个品种。