从另一个代理集中删除一个代理集(第一个代理集中的代理也存在于第二个集中)



在我的网络徽标代码中,我与公司(这是我的品种)建立了网络。我想要求公司与他们的邻居和邻居共享信息等等,这有效(请参阅下面的代码,代理集是 b、c 和 d)。

但是,当我询问有关第三级邻居的信息时,我的代理集还包括第一级邻居(显然因为它将所有邻居都包括在内),因此我想从第三级邻居代理集中删除这些一级邻居。在代码中,这意味着我想删除D中存在的代理,这些代理也存在于B

但是我找不到这样做的方法,other不起作用,因为不是代理要求必须删除。而且remove似乎也没有胜任这项工作。我也尝试!=不等于第一级,但这报告了一个truefalse,我只想从第三级代理集中删除这些代理,所以我不会重复计算它们。

ask companies [
let i who
let b link-neighbors
ask b [ let c link-neighbors
ask c [ let d link-neighbors
ask companies with [who = i] [ 
set iburen [who] of b
set iiburen [who] of other c
set iiiburen [who] of d
]
]
]
]

有人可以帮助我吗?

我认为你想要的是member?原始的。如果 D 和 B 是代理集,则以下内容应提供不是 B 成员的 D 成员。

let DminusB D with [not member? self B]

这里有很多话要说:

  1. 查尔斯的回答在技术上是正确的。

如果ab是代理集,a with [ not member? self b ]将为您提供尚未b中的a代理。

但我认为有更好的方法来完成你想做的事情。我会回到这一点,但首先,一个一般性的建议:

  1. 不要使用who

who原语有一些(很少)合法的用法,但它大多是邪恶的。它往往会导致代码脆弱、低效。例如,当您执行以下操作时:

let i who
; ...
ask companies with [who = i] [ ... ]

NetLogo必须扫描所有公司才能找到具有该特定who编号的公司。

NetLogo可以直接存储代理引用。改用它吧!例如:

let this-company self
; ...
ask this-company [ ... ]
  1. 特别是不要使用who数字列表!

NetLogo足以操作列表,但它非常适合操作代理集。如果你做这样的事情:

set iburen [who] of b
set iiburen [who] of other c
set iiiburen [who] of d

您正在失去代理集的权力。我不知道你为什么要分别存储三个不同的级别,但假设将所有邻居存储在一起是可以的,你可以这样做:

set my-neighbors other (turtle-set b c d)

使用other将排除原始公司,turtle-set将确保集合中的每个代理都是唯一的(因为代理集无论如何只能包含唯一的代理)。

如果您真的想要三个单独的变量,请使用 Charles 的答案,但请确保存储代理集,而不是who数字列表!

但是,如果您不需要单独的变量,我认为最好的解决方案是:

  1. 使用nw:turtles-in-radius.

NetLogo的网络扩展有一个原语,它完全可以做我认为你想要做的事情:

ask companies [ set my-neighbors nw:turtles-in-radius 3 ]

就是这样。

最新更新