我的模型是一个通过链接相互连接的代理网络。我尝试从代理及其邻居的邻居等创建代理集(我需要为它分配不同的值)。
但是当我在其中创建一个带有agentset的let时。代理商要求让这个代理商都有自己的代理,这是迄今为止的好。但是,当我希望原始代理人向他询问他的第二行邻居时,他只是从其中一个邻居返回一个代理集,而不是他所有第二行邻居的组合代理集,我希望邻居将他们自己的邻居存储到代理集中来自该集合中不同代理的邻居。
我不能让let agentset简单做turtleset current-agentset new-agentset
,因为在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中的所有代理都像现在一样报告他们的链接邻居。但是也要将这些链接邻居存储到一个新的代理集中,该代理集具有c中所有代理的所有链接邻居。就像一个简单的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
......但我不推荐它。将代理集放在列表中应该鼓励您以更一般的方式考虑您的级别。