NetLogo使用breed调用n-of命令报错及随机选取不生效问题求助
NetLogo n-of相关问题解决方案
问题1:执行n-of时报错"expected number here, rather than a list or block"
报错原因
NetLogo的breed声明语法为breed [复数种类名 单数种类名],你当前定义的breed [squad1 squad1s]中,squad1是复数名,squad1s是单数名,你在代码中调用的squad1s不属于合法的海龟集合参数,因此触发类型报错。
同时你的go函数存在逻辑嵌套错误:你将solar-battery1放在了ask squad1的代码块内部,每只squad1海龟都会触发一次选6只充电的逻辑,每tick总共会执行10次充电操作,完全不符合「每次仅给6只充电」的需求。
修复方案
- 调整
breed定义,或者调整调用时的种类名,二选一即可:- 方案1:将breed定义修改为
breed [squad1s squad1] - 方案2:将
solar-battery1中的代码改为ask n-of 6 squad1 [
- 方案1:将breed定义修改为
- 调整
go函数的逻辑层级,把充电判断移到ask squad1外部:
to go ask squad1 [ if individual-power >= 15 [forward 1 set label individual-power set individual-power individual-power - 1 set solar-delay solar-delay + 1] ] if recharge-options1 = "external-solar1" [solar-battery1] tick end
问题2:n-of选2只但所有海龟都被执行操作
问题原因
你的逻辑顺序写反了:当前代码是先随机选2只海龟,再判断这2只是否符合电量<=15的条件,符合的才充电。两个原因会导致看起来所有海龟都被操作:
- 每tick都会执行一次该逻辑,多轮运行后所有低电量海龟都会陆续被随机选中充电,最终呈现所有海龟都被操作的效果
- 随机选中的2只海龟如果不满足电量条件,就会浪费名额,达不到每次充2只的预期
修复方案
调整逻辑顺序,先筛选符合条件的海龟集合,再从集合中选指定数量的个体操作:
to refresh-combat-load ;; 先筛选所有低电量海龟 let low-power-turtles turtles with [battery_1 <= 15] ;; 只有低电量海龟数量足够时才执行选择,避免报错 if count low-power-turtles >= 2 [ ask n-of 2 low-power-turtles [ set battery_1 100 ] ] end
内容的提问来源于stack exchange,提问作者ABC
相关产品推荐
相关产品推荐

