在一起时询问另一个代理的id并检查它是否重复

时间:2017-02-13 13:19:25

标签: netlogo

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

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 
]

这一行将event品种ID写入eve-ids,但我想知道这不是步行者已经找到的重复事件(即只有在第一次找到它们时才写入事件ID) )。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

一种方法是将列表列表放入一个简单列表中,然后使用remove-duplicates清除任何重复事件。在NetLogo v.5.3中,第一步可以使用reducesentence完成,如下所示;

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)。在这里,我们只是将事件附加到事件-x中,而这些事件还没有在eve-id中找到。

foreach event-x [
  if not member? ? eve-ids [set eve-ids lput ? eve-ids]
]

现在我要引导NetLogo大师,并建议除非你真的需要它们,否则你不应该使用哪些数字,而应该使用代理集来处理你的事件。这也使生活更简单,因为代理集不能包含重复项。所以,如果你做了类似的事情:

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,reduceforeach编码会有所不同,因为这样会使用匿名记者。

查尔斯