通过 Netlogo 中的属性匹配两种不同的代理类型

Matching two different agent types by their properties in Netlogo

我在 Netlogo 中有两种类型的代理(公司和工人),它们通过一个公共标识符连接,但是,这是一个代理 属性(称为公司 ID,和 FirmID 为工人)。 我有兴趣要求公司通过执行对公司的询问来显示他们的劳动力,要求他们显示所有工人的数量,以使工人的 "firmID" 变量等于公司 "ID" 变量,如下所述:

我试图要求公司计算所有工人的数量,以使工人 ID 公司等于询问公司的 ID,但这在询问程序中不起作用。如果我一个一个地尝试,奇怪的是它确实有效。

一些可复制的玩具代码:

breed [Firms firm]
breed [Workers worker]
Firms-own[
 ID
] 

Workers-own[
 FirmID
]

to agent-creation
create-workers 3; There are 3 workers
create-firms 2; There are 2 firms
  ask worker 0 [set FirmID "333-1"]
  ask worker 1[set FirmID "333-1"]
  ask worker 2[set FirmID "444-1"]
  ask firm 3 [set ID "333-1"]
  ask firm 4 [set ID "444-1"]
end
; Thus, firm 333-1 has 2 workers, 444-1 has only one.

现在,

to matching-procedure
  ask firms [show count workers with [FirmID = [ID] of self]]
end

不起作用,但是

ask firms with [ID = "333-1"][show count workers with [FirmID = "333-1"]]

确实如此。

程序应该输出 [2 1](我会把结果放在一个列表中,但很明显这个想法是公司 333-1 有 2 个工人而 444-1 只有一个) 所以公司 333-1 应该声明 2 和 444-1 只是一个。

混淆 selfmyself 是很常见的,这就是您在这里所做的。尝试:

to matching-procedure
  ask firms [show count workers with [FirmID = [ID] of myself]]
end

你需要 myself 的原因是因为变量 ID 属于公司,也就是代理人做询问。相反,self 是被问到的。因此,您的原始代码会生成一个错误,让您知道工作人员不拥有该属性 ID。

这解决了您的问题。正如在 NetLogo 中将 firms/workers 或其他一对多关系链接在一起的一般注释一样,最好避免使用标识符并简单地存储代理。看起来像这样:

breed [Firms firm]
breed [Workers worker]
Firms-own[
 my-workers
] 

Workers-own[
 my-firm
]

to agent-creation
  clear-all
  create-firms 2; There are 2 firms
  create-workers 3
  [ set my-firm one-of Firms
  ]
  ask Firms
  [ set my-workers workers with [my-firm = myself]
  ]
end

to check-allocation
  ask Firms [show my-workers]
  ask Workers [show my-firm]
end

另一种常用的选择是在公司和工人之间建立 link。链接是表达关系的自然方式,可以隐藏起来,以免使视觉效果混乱。