AnyLogic模型中While循环无法正常运行问题排查求助
咱们先拆解下你这段代码里可能导致循环逻辑失效的几个核心问题,再给出对应的调整思路:
1. 只处理了「进入块」,缺失「服务块完成后的流转逻辑」
你当前的代码只关注了代理进入对应流程块的enter.take(agent)操作,但完全没处理代理完成**服务块(service block)**之后的流转逻辑——这正是实现“填满第5个服务块后回到第1个块”的关键环节。
比如,当代理完成第5个流程的service block后,你需要主动触发它进入第1个流程的enter块;而前4个流程完成后,要触发进入下一个流程的enter块。当前代码没有这个触发机制,代理在完成service块后就会停滞,无法进入循环。
2. 无限while循环的阻塞风险与逻辑顺序问题
你用了while(true)的无限循环,在每次循环里遍历所有流程块判断allowedDay匹配,但这种主动轮询的方式在仿真环境(看起来像是AnyLogic?)里很容易导致线程阻塞,而且没有和代理的实际流程进度绑定——不管代理有没有完成当前服务,循环都会一直轮询,逻辑上和你要的“迭代填充流程块”不匹配。
3. 退出条件的逻辑不匹配需求
你设置的退出条件if (queue10.size() <= Throughtput1) break;和“代理在5个流程块间循环”的需求关联很弱,而且放在for循环外面,每次遍历完所有流程才检查,可能会在代理还没完成一轮循环时就意外退出整个循环。
调整后的思路参考
(1)用事件驱动替代主动轮询
不要用while(true)硬轮询,而是在每个服务块的onExit事件里添加流转逻辑:
- 给你的5个
Curing_Drying流程块按顺序编号(比如新增processId字段,1到5) - 当代理完成某个流程的service block时,判断当前
processId:- 如果是5,就把代理送到编号1的流程的
enter块 - 如果是1-4,就把代理送到编号+1的流程的
enter块
- 如果是5,就把代理送到编号1的流程的
(2)修正循环控制逻辑
如果需要控制循环次数(比如代理循环N次后停止),可以给代理添加一个loopCount变量,每次完成一轮5个流程就+1,当达到目标次数时,就不再流转到下一个流程块。
(3)优化退出条件
如果要停止整个仿真循环,应该基于代理的循环完成状态,比如当所有代理都完成了指定的循环次数,或者生产的产品数量达到阈值时,再退出,而不是基于某个队列的大小。
附你提供的原代码:
while(true) { for (Curing_Drying currProcess : collection) { if (currProcess.allowedDay == (int)time(DAY)) { currProcess.enter.take(agent); } } if (queue10.size() <= Throughtput1){ break; } }
内容的提问来源于stack exchange,提问作者Zag.D

