Anylogic中如何按固定调度而非超时触发Wait块结束放行
固定120分钟间隔发船逻辑实现方案
你之前两个方案失效的原因很明确:
- Wait块自带的
Enable exit on timeout是单实体维度的独立计时,每个实体进入块之后才开始算自己的等待超时时间,设计目的是限制单个实体的最长等待时长,根本没法对齐全局统一的发班间隔,不适用这个场景。 - Schedule块本身是时间信号发生器,不属于流程链路里的实体流转块,本来就不能通过拖拽流程线和Wait块建立连接,没写触发逻辑的话Wait块会一直保持阻塞状态,船自然卡住走不了。
具体操作步骤
- 保留现有基础流程链路:船舶按指数分布生成到港→进入港口受限区域→进入Wait块,彻底关闭Wait块的
Enable exit on timeout选项,Wait块仅作为完成登船流程的船舶暂存区,默认保持出口阻塞。 - 配置Schedule块参数:
- 触发模式选择循环触发,首次触发时间设为模型启动后120分钟(即
120 * minute()),重复触发间隔固定为120分钟,选择基于仿真时间计时,不需要绑定真实日历/时钟,完全匹配你不需要对齐具体时日、仅需固定间隔的要求。
- 触发模式选择循环触发,首次触发时间设为模型启动后120分钟(即
- 编写触发逻辑打通两个模块:
选中Schedule块,在组件的「触发时执行(On trigger)」代码编辑区写入以下逻辑:
Wait块本身提供了主动释放实体的// 发班时间到,检查泊位是否有等待离港的船舶 if (wait.size() > 0) { // 释放队列中第一艘完成登船的船舶离港 wait.free(wait.get(0)); }free()API,不需要做流程线连接,直接通过Schedule的触发动作调用这个API就能控制放船,这也是解决你“连不上两个块”问题的核心。
可选场景适配
- 若要求到点必须发船,哪怕船舶未完成登船流程也要强制离港:直接保留上述逻辑即可,
free()方法调用后会立刻释放实体,不会等待块内的附加流程执行完成。 - 若要求发班点到港时无待发船舶,后续第一艘到港完成登船的船舶无需等下一个120分钟间隔、直接离港:新增一个布尔型变量
pendingDepart,初始值设为false。修改Schedule触发逻辑:当Wait块无船时将pendingDepart设为true;再在Wait块的「实体进入时(On enter)」动作区加判断:如果pendingDepart为true,直接释放当前进入的实体,同时将pendingDepart重置为false。
内容的提问来源于stack exchange,提问作者Lorenzo Martello
相关产品推荐
相关产品推荐

