AnyLogic带间断递减函数时间曲线实现技术问询
AnyLogic递减函数逻辑修正与需求实现方案
现有代码的问题分析
- 条件判断顺序错误:先判断
usestock_boundary3 <=80就直接归零,后续的<=0判断永远不会触发——因为归零后变量值为0,但else if的逻辑会跳过该分支 - 重置值不符合需求:需求要求归零后从85开始递减,现有代码设为90
- 缺失“数日后恢复”的延迟逻辑:没有处理归零后等待指定天数再重新启动递减的流程
修正实现步骤
1. 添加辅助变量
在AnyLogic的变量面板中新增布尔型变量isInResetWait,初始值设为false,用来标记当前是否处于归零后的等待阶段,避免重复触发重置流程。
2. 修正递减函数代码
替换原有函数代码为以下逻辑:
// 仅当未处于等待重置阶段时,执行递减逻辑 if (!isInResetWait) { usestock_boundary3 -= 0.2; // 当数值降至80及以下时,直接归零并触发等待重置流程 if (usestock_boundary3 <= 80) { usestock_boundary3 = 0; isInResetWait = true; // 触发延迟重置事件(假设延迟天数为3天,可自行修改) event_resetStock.schedule(3, TimeUnit.DAYS); } }
3. 创建延迟重置事件
- 在模型中新增事件(命名为
event_resetStock) - 在事件的动作面板中添加以下代码:
// 结束等待阶段,重置变量为85,重新开始递减 isInResetWait = false; usestock_boundary3 = 85;
4. 原调用事件的设置
保持原有的调用递减函数的事件(比如按固定时间间隔触发,如每1个时间单位触发一次),确保递减逻辑持续执行。
逻辑说明
- 初始阶段
isInResetWait为false,变量从100开始以-0.2的斜率递减 - 当变量降至80及以下时,立刻归零,标记进入等待阶段,并触发延迟事件
- 延迟指定天数后,延迟事件触发,将变量重置为85,取消等待标记,恢复递减流程
内容的提问来源于stack exchange,提问作者Aditya Wani
相关产品推荐
相关产品推荐

