NetLogo中使用scale-color时如何动态获取potential变量的最值?
如何在NetLogo中获取动态patch变量的最小/最大值
嘿,这个问题我太熟悉了!既然你的potential是持续变化的patch变量,要拿到它的最小值和最大值,NetLogo提供了非常直接的方法,我给你分两种场景说明:
1. 实时直接计算(适合小模型或计算频率不高的情况)
如果你不需要频繁重复计算,或者模型里patch数量不多,可以直接在调用scale-color的时候实时计算最值:
ask patches [ set pcolor scale-color green potential (min [potential] of patches) (max [potential] of patches) ]
min [potential] of patches:遍历所有patch,返回potential变量的最小数值max [potential] of patches:同理,返回该变量的最大数值
这种方法的好处是不用额外维护变量,随用随算,缺点是每次调用都会遍历所有patch,大模型频繁使用可能会影响运行效率。
2. 缓存全局变量(适合大模型或高频计算场景)
如果你的模型patch数量多,或者需要频繁用到这两个最值,建议把它们存成全局变量,只在potential变化后更新一次,这样能节省计算资源:
首先,先在代码开头定义全局变量:
globals [ min-potential max-potential ]
然后写一个专门更新最值的过程:
to update-potential-bounds ; 过滤掉potential不是数字的情况(避免报错) let valid-patches patches with [is-number? potential] set min-potential min [potential] of valid-patches set max-potential max [potential] of valid-patches end
之后,每当你修改了potential变量(比如在某个更新patch的过程里),先调用update-potential-bounds,再执行你的颜色设置代码:
; 假设这里有修改potential的代码 ask patches [ set potential potential + random-float 0.1 ] ; 更新最值 update-potential-bounds ; 设置颜色 ask patches [ set pcolor scale-color green potential min-potential max-potential ]
小提示
如果你的模型里存在patch的potential未初始化(比如undefined)或者是NaN,一定要用patches with [is-number? potential]过滤掉这些patch,不然min和max函数会返回错误结果哦。
内容的提问来源于stack exchange,提问作者Javier Sandoval
相关产品推荐
相关产品推荐

