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

AnyLogic中从数据库调用速率时模型崩溃问题求助

解决AnyLogic按日期配置流转速率时的数据库空值错误

我需要为AnyLogic模型的每一天配置不同的流转速率,于是创建了数据表,在流转(transition)中通过date()函数基于模型日期获取对应速率。模型仅能正常运行8小时左右就崩溃,抛出如下错误:

Exception during discrete event execution:
root.houses[1423]:
Empty database value result!
java.lang.RuntimeException: root.houses[1423]:
Empty database value result!
    at com.anylogic.engine.Engine.error(Unknown Source)
    at com.anylogic.engine.Agent.error(Unknown Source)
    at com.anylogic.engine.Utilities.error(Unknown Source)
    at com.anylogic.engine.Utilities.getResult(Unknown Source)
    at com.anylogic.engine.Utilities.selectUniqueValue(Unknown Source)
    at com.anylogic.engine.Utilities.selectUniqueValue(Unknown Source)
    at adr01.House.evaluateRateOf(House.java:285)
    at com.anylogic.engine.TransitionRate.start(Unknown Source)
    at adr01.House.enterState(House.java:204)
    at adr01.House.executeActionOf(House.java:318)
    at com.anylogic.engine.TransitionMessage.execute(Unknown Source)
    at com.anylogic.engine.Engine.a(Unknown Source)
    at com.anylogic.engine.Engine.ln(Unknown Source)
    at com.anylogic.engine.Engine$m.run(Unknown Source)

相关流程图与数据表截图:
流程图:带速率配置的流转
引用的数据表

禁用数据表改用固定速率时模型可正常运行,确认问题源于数据库引用环节,解决方案如下:

  • 统一日期匹配格式:
    date()函数返回的日期默认包含时间部分(时分秒),而数据表中的日期可能只有年月日,导致8小时后模型日期的时间部分变化,匹配失败返回空值。用toDate(date(), "yyyy-MM-dd")格式化模型日期,去掉时间部分后再执行查询,确保格式与数据表完全一致。

  • 添加空值 fallback 机制:
    在查询速率的代码中加入默认值处理,避免空值引发崩溃。示例代码:

    // 替换yourDataTable为你的数据表名称,defaultRate为预设默认速率
    String targetDate = toDate(date(), "yyyy-MM-dd");
    Double rate = selectUniqueValue(yourDataTable, "rate", "date = '" + targetDate + "'");
    return rate != null ? rate : defaultRate;
    
  • 检查数据表完整性:

    • 确认数据表覆盖了模型运行的所有日期范围,避免模型运行到无对应记录的日期时返回空值。
    • 检查日期列是否存在重复记录或格式错误,selectUniqueValue要求查询结果唯一,重复记录也可能引发异常;同时确保所有日期格式统一,无空值。
  • 调试查询过程:
    在流转速率的代码中添加trace输出,查看每次查询的日期和结果,定位问题日期:

    String targetDate = toDate(date(), "yyyy-MM-dd");
    trace("当前查询日期:" + targetDate);
    Double rate = selectUniqueValue(yourDataTable, "rate", "date = '" + targetDate + "'");
    trace("查询到的速率:" + rate);
    return rate != null ? rate : defaultRate;
    

    通过AnyLogic的Trace窗口查看输出,明确哪一次查询返回了空值,针对性修复数据或逻辑。

内容的提问来源于stack exchange,提问作者Toni Gliege

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:57:17