NetLogo中如何按ticks倍数周期性修改变量无需编写冗长判断?
解决方案
核心使用NetLogo内置的mod(模运算)判断时间差是否为指定间隔的正整数倍即可,无需枚举所有符合条件的数值,可无限覆盖所有符合规则的tick节点。
最简实现代码
直接替换原有冗长的多条件判断代码即可:
let time-since-first-leader ticks - first-leader-tick ; 同时满足两个条件才触发:1. 已经过了起始触发时间 2. 时间差是20的整数倍 if time-since-first-leader > 0 and mod time-since-first-leader 20 = 0 [ set octopamine-level octopamine-level - 1 ]
可选优化方案
如果后续需要频繁调整间隔步长,可把间隔值定义为全局变量,避免硬编码:
- 第一步:在全局变量声明块添加间隔配置项
globals [ first-leader-tick octopamine-level octopamine-decay-interval ; 递减间隔配置项 ]
- 第二步:模型初始化时为间隔变量赋值
set octopamine-decay-interval 20
- 第三步:修改为通用触发逻辑
let time-since-first-leader ticks - first-leader-tick if time-since-first-leader > 0 and mod time-since-first-leader octopamine-decay-interval = 0 [ set octopamine-level octopamine-level - 1 ]
注意事项
如果需要避免变量递减到负数,可以在判断条件中额外增加边界校验,比如添加and octopamine-level > 0即可。
内容的提问来源于stack exchange,提问作者E W
相关产品推荐
相关产品推荐

