通过 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 只是一个。
混淆 self
和 myself
是很常见的,这就是您在这里所做的。尝试:
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
。链接是表达关系的自然方式,可以隐藏起来,以免使视觉效果混乱。
我在 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 只是一个。
混淆 self
和 myself
是很常见的,这就是您在这里所做的。尝试:
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
。链接是表达关系的自然方式,可以隐藏起来,以免使视觉效果混乱。