NetLogo v6中links_at_meeting reporter返回结果不稳定问题求助
one-of误用导致判断条件不稳定 你的links_at_meeting reporter返回结果波动的核心原因,是错误地使用了one-of来判断智能体是否在会议地点集合中。
为什么会出现随机波动?
看你代码里的判断逻辑:
[patch-here] of other-end = one-of (patch-set patch 0 0 ([neighbors] of patch 0 0 ))
one-of这个函数的作用是从集合中随机挑选一个元素,每次调用它都会返回不同的结果(除非集合只有一个元素)。这意味着,每次你调用links_at_meeting时,实际上是在检查:
链接另一端的智能体所在的patch,是否等于随机选中的某一个会议地点
而不是你真正想要的:
链接另一端的智能体所在的patch,是否属于所有会议地点的集合
举个例子:假设会议地点是patch 0 0和它的4个邻居,第一次调用one-of可能选中patch 0 1,第二次选中patch 1 0——如果链接另一端的智能体在patch 0 1,第一次会被计入结果,第二次就不会,导致返回的链接数量完全随机波动。
修正方案:检查patch是否属于会议地点集合
你需要把判断逻辑改成检查对方智能体的patch是否在会议地点的集合内,NetLogo提供了is-in?(NetLogo 6+支持)或member?函数来做这件事。
首先建议把会议地点的定义抽出来,避免重复计算,让代码更清晰:
; 先定义会议地点的集合 to-report meeting-patches report patch-set patch 0 0 neighbors patch 0 0 end
然后修改links_at_meeting reporter:
to-report links_at_meeting let meeting-patches meeting-patches ; 调用上面的reporter获取会议地点集合 ; 筛选出另一端智能体在会议地点的链接 report my-links with [ [patch-here] of other-end is-in? meeting-patches ] end
如果你习惯用member?,也可以写成:
to-report links_at_meeting let meeting-patches meeting-patches report my-links with [ member? [patch-here] of other-end meeting-patches ] end
同理修复neighbors_at_meeting
你的neighbors_at_meeting出现同样问题,大概率也是用了one-of来判断位置。按照同样的逻辑,把判断条件改成检查邻居的patch是否在meeting-patches集合里即可。
这样修改后,每次调用reporter都会基于固定的会议地点集合做判断,结果就会稳定下来,不会再出现同一tick内返回结果波动的情况了。
内容的提问来源于stack exchange,提问作者maria118code

