我的模型是一个通过链接相互连接的代理网络。 我尝试从代理及其邻居的邻居等创建代理集(我需要这个为其分配不同的值)。
然而,当我在其中创建一个带有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)
同样适用于
如果我运行模型,现在代理商几乎每个滴答报告不同的代理商。他们只是从这些代理中选择一个代理集,而不是将它们全部组合在一起。
答案 0 :(得分:3)
以下是我认为您需要的内容:
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
......但我不推荐它。将代理集放在列表中应该鼓励您以更一般的方式考虑您的级别。