NetLogo中WITH语法报错及指定条件agentset求和问题求助
解决NetLogo的
WITH报错与指定区域patch变量求和问题 先搞定那个WITH报错
你碰到的WITH expected a TRUE/FALSE block, but got a TRUE/FALSE instead?错误,本质是用错了with的语法。NetLogo里的with要求后面跟一个用方括号[]包裹的布尔表达式块——这个块会被每个agent(这里是patch)自己执行,判断是否满足条件。
举个错误的反例(这大概率是你之前写的):
;; 错误写法:直接写了布尔值,没有用[]包裹成块 patches-with-ash with xcor < some-turtle-xcor
正确的写法必须把条件放进[]里,而且如果要引用海龟的变量,得用[var] of turtle的方式(因为patch和海龟是不同的agent集,不能直接跨agent引用变量):
;; 正确写法:用[]包裹条件块,跨agent引用变量用[var] of patches-with-ash with [xcor < [xcor] of my-turtle]
针对你的实际需求:计算指定区域的plant-energy总和
你的需求是:对某只海龟,计算patches-with-ash中满足xcor < 该海龟xcor且ycor > 该海龟ycor的所有patch的plant-energy总和。这里分两种情况给你方案:
1. 针对单只特定海龟(比如monitor里固定测试某只)
如果是在monitor里测试,假设你要针对turtle 0计算,直接用sum配合过滤后的patch集:
sum [plant-energy] of (patches-with-ash with [xcor < [xcor] of turtle 0 and ycor > [ycor] of turtle 0])
注意:一定要把
with过滤后的agent套用括号括起来,因为NetLogo的运算符优先级要求先执行过滤,再取变量求和。
2. 针对每只海龟(比如海龟自己计算周围符合条件的总和)
如果是让每只海龟自己计算这个值,可以在海龟的过程里写:
ask turtles [ let target-patches patches-with-ash with [xcor < [xcor] of myself and ycor > [ycor] of myself] let total-energy sum [plant-energy] of target-patches ;; 这里可以把total-energy存到海龟变量里,或者打印出来 set my-total-energy total-energy ]
这里的myself代表当前执行代码的海龟,这样每只海龟都会用自己的xcor和ycor作为过滤条件。
常见坑点提醒
- 不要忘记
with后面的[],这是最容易触发你那个报错的原因; - 跨agent引用变量必须用
[var] of agent或者myself(在ask块里),直接写turtle-xcor会被NetLogo当成patch的变量,导致找不到或者逻辑错误; - 如果
patches-with-ash是空集,sum会返回0,不会报错,所以不需要额外判断空集(除非你需要特殊处理)。
内容的提问来源于stack exchange,提问作者Sam Marchetti
相关产品推荐
相关产品推荐

