将来自不同代理的agentset添加到let中

时间:2017-12-18 22:02:32

标签: netlogo let agentset

我的模型是一个通过链接相互连接的代理网络。 我尝试从代理及其邻居的邻居等创建代理集(我需要这个为其分配不同的值)。

然而,当我在其中创建一个带有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)

同样适用于

如果我运行模型,现在代理商几乎每个滴答报告不同的代理商。他们只是从这些代理中选择一个代理集,而不是将它们全部组合在一起。

1 个答案:

答案 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

这可能不是大多数高效代码,因为它通过每个级别的所有邻居列表,但除非你有一个庞大的网络,否则你不应该注意。

如果您真的想要使用ibureniibureniiiburen等变量,您可以随时为列表中的项目添加别名:

set iburen   item 0 buren
set iiburen  item 1 buren
set iiiburen item 2 buren

......但我不推荐它。将代理集放在列表中应该鼓励您以更一般的方式考虑您的级别。