AnyLogic模型在127.33天时停止执行问题求助
AnyLogic模型在127.33天停止运行的排查与解决
你的模型一加上这段代码就停在127.33天,核心问题是这段while循环会触发死循环,把仿真线程卡死,导致时间完全无法推进。
代码里的死循环诱因
先看你这段代码:
while ( !collection.isEmpty() ) { Order order = collection.getFirst(); if ( products > 0 ) { if ( order.amount <= products ) { order.retailer.products += order.amount; traceln("order.amount fel backorder: " +order.amount + " for : " +order.retailer); // remove the demand from the queue collection.removeFirst(); } } }
有两个直接触发死循环的点:
- 当
products <= 0时,循环里没有任何修改collection的操作,但collection不为空,循环会无限重复执行,永远跳不出来 - 当
products > 0但队列第一个订单的order.amount > products时,既不扣减库存也不移除订单,循环会反复检查同一个订单,陷入死循环
另外还有个隐藏问题:你处理订单时没有扣减products的数量,就算满足订单,库存一直保持初始值,会导致后续重复处理订单,也是潜在的bug。
修复方案
把循环改成「处理完当前能满足的订单就退出,避免无限重复检查同一订单」,同时补上库存扣减逻辑,示例代码如下:
// 库存没货直接退出,避免无意义循环 if (products <= 0) return; // 用迭代器遍历,避免并发修改集合的问题 Iterator<Order> iterator = collection.iterator(); while (iterator.hasNext() && products > 0) { Order order = iterator.next(); if (order.amount <= products) { order.retailer.products += order.amount; traceln("order.amount fel backorder: " + order.amount + " for : " + order.retailer); products -= order.amount; // 补上库存扣减 iterator.remove(); } else { // 如果订单是按需求大小排序的,库存不够当前订单就直接退出循环;如果没排序,可改为continue跳过当前订单 break; } }
补充说明
你添加的每日检查库存事件没用,是因为只要这段死循环代码被触发,仿真线程就会被完全卡死,根本轮不到每日事件执行。必须先解决死循环问题才能推进模型运行。
内容的提问来源于stack exchange,提问作者Souhail MNASRI
相关产品推荐
相关产品推荐

