从另一个代理集中删除一个代理集(第一组中的代理也存在于第二组中)
Removing an agentset from another agentset (the agents from the first set which are also present in the second set)
在我的 netlogo 代码中,我有一个与公司的网络(这是我的品种)。我想要求公司与他们的邻居和他们的邻居分享信息等等,这有效(见下面的代码,代理集是 b、c 和 d)。
然而,当我询问有关第三级邻居的信息时,我的代理集也包括第一级邻居(显然,因为它把所有邻居都计入了),所以我想从第三级邻居代理集中删除这些第一级邻居.在代码中,这意味着我想删除 D
中存在的代理,这些代理也存在于 B
中
但我找不到方法,other
不起作用,因为不是代理询问必须删除哪个。而且 remove
似乎也没有完成这项工作。我也试过 !=
不等于第一级,但它报告了 true
或 false
,我只想从第三级代理集中删除这些代理,所以我不会重复计算它们。
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]
这里有很多话要说:
- 查尔斯的回答在技术上是正确的。
如果 a
和 b
是代理集,a with [ not member? self b ]
将为您提供 a
中尚未在 b
.[=29= 中的代理]
但我认为有更好的方法可以完成您想要做的事情。我会回到那个,但首先,一个一般性的建议:
- 不要使用
who
!
who
原语有一些(很少)合法用途,但大部分都是邪恶的。它往往会导致脆弱、低效的代码。例如,当您执行以下操作时:
let i who
; ...
ask companies with [who = i] [ ... ]
NetLogo 必须扫描所有公司才能找到具有该特定 who
编号的公司。
NetLogo 可以直接存储代理引用。改用它!例如:
let this-company self
; ...
ask this-company [ ... ]
- 尤其不要使用
who
个数字的列表!
NetLogo 足以处理列表,但它 awesome 处理代理集。如果你这样做:
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
个数字的列表!
但是,如果您不需要单独的变量,我认为最好的解决方案是:
- 使用
nw:turtles-in-radius
.
NetLogo 的网络扩展有 a primitive that does exactly what I think you want to do:
ask companies [ set my-neighbors nw:turtles-in-radius 3 ]
就是这样。
在我的 netlogo 代码中,我有一个与公司的网络(这是我的品种)。我想要求公司与他们的邻居和他们的邻居分享信息等等,这有效(见下面的代码,代理集是 b、c 和 d)。
然而,当我询问有关第三级邻居的信息时,我的代理集也包括第一级邻居(显然,因为它把所有邻居都计入了),所以我想从第三级邻居代理集中删除这些第一级邻居.在代码中,这意味着我想删除 D
中存在的代理,这些代理也存在于 B
但我找不到方法,other
不起作用,因为不是代理询问必须删除哪个。而且 remove
似乎也没有完成这项工作。我也试过 !=
不等于第一级,但它报告了 true
或 false
,我只想从第三级代理集中删除这些代理,所以我不会重复计算它们。
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]
这里有很多话要说:
- 查尔斯的回答在技术上是正确的。
如果 a
和 b
是代理集,a with [ not member? self b ]
将为您提供 a
中尚未在 b
.[=29= 中的代理]
但我认为有更好的方法可以完成您想要做的事情。我会回到那个,但首先,一个一般性的建议:
- 不要使用
who
!
who
原语有一些(很少)合法用途,但大部分都是邪恶的。它往往会导致脆弱、低效的代码。例如,当您执行以下操作时:
let i who
; ...
ask companies with [who = i] [ ... ]
NetLogo 必须扫描所有公司才能找到具有该特定 who
编号的公司。
NetLogo 可以直接存储代理引用。改用它!例如:
let this-company self
; ...
ask this-company [ ... ]
- 尤其不要使用
who
个数字的列表!
NetLogo 足以处理列表,但它 awesome 处理代理集。如果你这样做:
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
个数字的列表!
但是,如果您不需要单独的变量,我认为最好的解决方案是:
- 使用
nw:turtles-in-radius
.
NetLogo 的网络扩展有 a primitive that does exactly what I think you want to do:
ask companies [ set my-neighbors nw:turtles-in-radius 3 ]
就是这样。