You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:10:30