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

时间:2019-05-24 14:05:14

标签: netlogo

我在Netlogo中有两种类型的代理(公司和工作人员),它们通过一个公共标识符连接,但是这是一个代理属性(称为Firms的ID,和FirmID 对于工人)。 我有兴趣要求公司通过执行对公司的询问来显示他们的劳动力,请他们显示所有工人的数量,以使工人的“ firmID”变量等于公司的“ 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只有1个工人) 因此,公司333-1应该将2和444-1声明为一个。

1 个答案:

答案 0 :(得分:2)

混合使用selfmyself是很常见的,这就是您在此处所做的。试试:

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

您之所以需要myself是因为变量ID属于公司,公司是进行询问的代理商。相反,self是被询问的那个。因此,您的原始代码会产生错误,通知您工作人员不拥有属性ID。

这可以解决您的问题。就像有关在NetLogo中将公司/工人或其他人与许多人联系在一起的一般性评论一样,最好避免使用标识符并简单地存储代理。看起来像这样:

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。链接是表达关系的自然方法,可以隐藏起来,以免使外观混乱。