我在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声明为一个。
答案 0 :(得分:2)
混合使用self
和myself
是很常见的,这就是您在此处所做的。试试:
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
。链接是表达关系的自然方法,可以隐藏起来,以免使外观混乱。