将来自不同代理的代理集添加到一个 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

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

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

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

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