NetLogo中如何实现turtle的individual-power变量延迟20个tick恢复至100
NetLogo turtle变量延迟更新实现方案
现有代码问题分析
- 第一版
solar-battery使用repeat 20的逻辑错误:repeat命令会在同一个tick内一次性执行完所有循环,不会跨tick计时,因此无法实现20个tick的延迟效果,相当于当前tick直接把电量重置为100。 - 第二版带
solar-delay的代码逻辑漏洞:go过程中,当individual-power = 15时,会先触发if individual-power >= 15的分支,执行set individual-power individual-power - 1把值降到14,后续solar-battery中判断individual-power = 15的条件永远无法满足,计时逻辑根本不会启动。
方案1:等待20tick后直接恢复到100
修改后完整代码
首先确保你已经在代码开头声明了对应变量:
; 声明turtle自有变量 turtles-own [ individual-power solar-delay ] ; 如果recharge-options是全局变量也需要提前声明 globals [ recharge-options ]
setup-turtles代码无需修改,调整go和solar-battery逻辑如下:
to go ask turtles [ ; 只有电量大于15时才正常耗电移动 if individual-power > 15 [ forward 1 set label individual-power set individual-power individual-power - 1 ] if recharge-options = "external-solar" [ solar-battery ] ; 充电等待期间可显示剩余等待时间,不需要也可以删掉这行 if individual-power = 15 [ set label (word "充电中 剩余: " (20 - solar-delay) "tick") ] ] tick end to solar-battery ; 电量等于15时开始计时 if individual-power = 15 [ set solar-delay solar-delay + 1 ] ; 计时满20tick后重置电量和计时器 if solar-delay = 20 [ set individual-power 100 set solar-delay 0 ] end
方案2:20tick内逐步提升到100
如果需要平滑充电效果,每tick固定提升电量,20tick后刚好到100,修改solar-battery逻辑如下:
to solar-battery if individual-power < 100 [ ; 从15到100总共需要涨85,分20tick,每tick涨4.25,需要整数的话也可以改为4或者5 set individual-power individual-power + 4.25 ; 避免数值溢出超过100 if individual-power > 100 [ set individual-power 100 ] set label individual-power ] end
注意用这个方案时可以删掉
solar-delay变量,仅需要把原来go过程里的if individual-power >=15判断改为if individual-power >15即可。
内容的提问来源于stack exchange,提问作者ABC
相关产品推荐
相关产品推荐

