检查整个代理集的相同值

问题描述 投票:0回答:1

我有一个带有银行网络的模型。 每家银行都与其他银行有联系。 我需要验证没有一对银行的某个银行属性具有相同的值。

(这是因为,由于我需要从另一个中减去一个并将结果放在表达式的分母处,因此如果任何两个银行具有相同的该属性值,我会收到“除以零”执行错误)。

为了检查这一点,我输入了以下行:

if (any? banks with [AttributeX = [AttributeX] of other banks]) [set same-risk-value-error? true]

然后我在“go”内放置一个停止执行行(在调用设置该特定属性的函数之后立即):

if same-risk-value-error? = true [stop]

但显然它不起作用,因为执行继续,并且在发生时我仍然收到“除以零”错误。

收到错误后,我在命令中心检查导致错误的特定银行对。

这就是我得到的:

observer> show [AttributeX] of bank 63
observer: 0
observer> show [AttributeX] of bank 83
observer: 0
observer> show (any? banks with [AttributeX = [AttributeX] of other banks])
observer: false

所以:两个银行(银行 63 和银行 83)的 AttributeX 值相同(在本例中该值等于 0),但当我询问整个银行中是否有两个银行时,我得到一个“假”该属性具有相同值的银行代理集。

怎么会?

我明显的猜测是支票

(any? banks with [AttributeX = [AttributeX] of other banks])

即使语法正确,但没有达到我想要的效果。

我应该如何编写布尔检查行(给我真/假)来检查代理集中没有两个代理具有相同的特定属性值?

boolean comparison netlogo agentset
1个回答
1
投票

问题在于您正在将数字与列表进行比较。

[atrributeX] of other banks
创建其他银行的所有 attributeX 的列表,而对于每个银行,AttributeX 是单个值。在将单个值与列表进行比较时,NetLogo 始终会产生
false
。 (如果 NetLogo 发出警告可能更合适,但那是另一个问题。)

如果每家银行都需要检查的话,你可以尝试一下

(any? other banks with [AttributeX = [attributeX] of myself]

由于

myself
是单个代理,因此
[attributeX] of myself
将产生单个值。另一方面,如果您只需要知道所有银行之间是否存在 AttributeX 的重复值,观察者可以简单地询问

if length [AttributeX] of banks != length remove-duplicates [AttributeX] of banks
© www.soinside.com 2019 - 2024. All rights reserved.