将来自不同代理的代理集添加到一个 let 中
adding agentset from different agents togother into a let
我的模型是一个通过 link 相互连接的代理网络。
我尝试从代理的邻居及其邻居等创建一个代理集(我需要它来为其分配不同的值)。
但是,当我创建一个包含代理集的 let 时。代理人要求让这个代理人都拥有自己的代理人,到目前为止一切都很好。但是,当我希望原始代理向他询问他的二线邻居时,他只是 returns 来自其中一个邻居的代理集,而不是他所有二线邻居的组合代理集
我希望邻居将他们自己的邻居存储到一个代理集中,其中包含来自该集中不同代理的所有邻居。
我不能要求 let agentset 简单地做 turtleset current-agentset new-agentset
因为在 let
中你不能要求 let 变量。所以通常是 set second-neighbors (turtle-set second-neighbors other-nieghbors
的代码不起作用,因为我不能在 let
中询问第二个邻居
我也不能将其设为全局或其他,因为它是特定于代理的。
我目前的代码如下所示
ask companies [
let this-company self
let b link-neighbors
ask b [ let c link-neighbors with [self != this-company]
ask c [ let d link-neighbors with [not member? self b]
ask this-company [
set iburen b
set iiburen c
set iiiburen d
]
]
]
]
所以我想要的是代理集 c 中的所有代理都像现在一样报告他们的 link-邻居。但也将这些 link-neighbors 存储到一个新的 agentset 中,该代理集包含 c 中所有代理的所有 link-neighbors。就像一个简单的 i i + 1。但比 turtle-set (what I have) (what is new from the next agent asked)
d也一样
如果我 运行 模型现在代理几乎每次更新都会报告不同的代理集。他们只是从这些代理中选择一个代理集,而不是将它们全部组合在一起。
这是我认为您需要的:
extensions [ nw ]
breed [ companies company ]
companies-own [
buren ; a list of agentsets, with one item for each "level" of neighbors
]
to setup
clear-all
; create a random network and lay it out:
create-companies 20 [ create-links-with n-of 3 other companies ]
repeat 30 [ layout-spring turtles links 0.2 5 1 ]
let num-levels 3
ask companies [
let all-neighbors other nw:turtles-in-radius num-levels
set buren (list) ; initialize to empty list
foreach range num-levels [ i ->
let neighbors-at-this-level all-neighbors with [
nw:distance-to myself = i + 1
]
set buren lput neighbors-at-this-level buren
]
]
; demonstrate how to access the levels (sorted only for display purposes)
ask one-of companies [
show sort item 0 buren ; first level neighbors
show sort item 1 buren ; second level neighbors
show sort item 2 buren ; third level neighbors
]
end
这可能不是最 高效的代码,因为它会为每个级别遍历一次所有邻居的列表,但除非你有一个庞大的网络,否则你不应该注意。
如果您真的想使用 iburen
、iiburen
和 iiiburen
等变量,您可以随时为列表的项目添加别名:
set iburen item 0 buren
set iiburen item 1 buren
set iiiburen item 2 buren
...但我不推荐它。将代理集列在列表中应该会鼓励您以更一般的方式考虑您的级别。
我的模型是一个通过 link 相互连接的代理网络。 我尝试从代理的邻居及其邻居等创建一个代理集(我需要它来为其分配不同的值)。
但是,当我创建一个包含代理集的 let 时。代理人要求让这个代理人都拥有自己的代理人,到目前为止一切都很好。但是,当我希望原始代理向他询问他的二线邻居时,他只是 returns 来自其中一个邻居的代理集,而不是他所有二线邻居的组合代理集 我希望邻居将他们自己的邻居存储到一个代理集中,其中包含来自该集中不同代理的所有邻居。
我不能要求 let agentset 简单地做 turtleset current-agentset new-agentset
因为在 let
中你不能要求 let 变量。所以通常是 set second-neighbors (turtle-set second-neighbors other-nieghbors
的代码不起作用,因为我不能在 let
我也不能将其设为全局或其他,因为它是特定于代理的。
我目前的代码如下所示
ask companies [
let this-company self
let b link-neighbors
ask b [ let c link-neighbors with [self != this-company]
ask c [ let d link-neighbors with [not member? self b]
ask this-company [
set iburen b
set iiburen c
set iiiburen d
]
]
]
]
所以我想要的是代理集 c 中的所有代理都像现在一样报告他们的 link-邻居。但也将这些 link-neighbors 存储到一个新的 agentset 中,该代理集包含 c 中所有代理的所有 link-neighbors。就像一个简单的 i i + 1。但比 turtle-set (what I have) (what is new from the next agent asked)
d也一样
如果我 运行 模型现在代理几乎每次更新都会报告不同的代理集。他们只是从这些代理中选择一个代理集,而不是将它们全部组合在一起。
这是我认为您需要的:
extensions [ nw ]
breed [ companies company ]
companies-own [
buren ; a list of agentsets, with one item for each "level" of neighbors
]
to setup
clear-all
; create a random network and lay it out:
create-companies 20 [ create-links-with n-of 3 other companies ]
repeat 30 [ layout-spring turtles links 0.2 5 1 ]
let num-levels 3
ask companies [
let all-neighbors other nw:turtles-in-radius num-levels
set buren (list) ; initialize to empty list
foreach range num-levels [ i ->
let neighbors-at-this-level all-neighbors with [
nw:distance-to myself = i + 1
]
set buren lput neighbors-at-this-level buren
]
]
; demonstrate how to access the levels (sorted only for display purposes)
ask one-of companies [
show sort item 0 buren ; first level neighbors
show sort item 1 buren ; second level neighbors
show sort item 2 buren ; third level neighbors
]
end
这可能不是最 高效的代码,因为它会为每个级别遍历一次所有邻居的列表,但除非你有一个庞大的网络,否则你不应该注意。
如果您真的想使用 iburen
、iiburen
和 iiiburen
等变量,您可以随时为列表的项目添加别名:
set iburen item 0 buren
set iiburen item 1 buren
set iiiburen item 2 buren
...但我不推荐它。将代理集列在列表中应该会鼓励您以更一般的方式考虑您的级别。