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

自定义setuptime函数始终返回默认值10,功能失效求助

换型时间函数未生效,始终返回默认值10的排查与解决

问题描述

我创建了f_getDuration函数用于设置换型时间,在Service Block的延迟时间中调用f_getDuration(agent, v_Predecessor);其中v_Predecessor是Agent类型变量,已在出口处设置v_Predecessor = agent。但该多条件判断函数未生效,Service Block始终返回最后一个默认值10。

涉及的Agent类型包括Oberteil、Unterteil、Ring、Halteteil,函数参数currentAgent和predecessor均为Agent类型,函数代码如下:

if (currentAgent == Oberteil && predecessor == Unterteil) {
    return 45;
} else if (currentAgent == Oberteil && predecessor == Halteteil) {
    return 40;
}else if (currentAgent == Oberteil && predecessor == Ring) {
    return 45;
}else if (currentAgent == Unterteil && predecessor == Oberteil) {
    return 45;
}else if (currentAgent == Unterteil && predecessor == Halteteil) {
    return 40;
}else if (currentAgent == Unterteil && predecessor == Ring) {
    return 45;
}else if (currentAgent == Halteteil && predecessor == Oberteil) {
    return 40;
}else if (currentAgent == Halteteil && predecessor == Unterteil) {
    return 40;
}else if (currentAgent == Halteteil && predecessor == Ring) {
    return 45;
}else if (currentAgent == Ring && predecessor == Oberteil) {
    return 45;
}else if (currentAgent == Ring && predecessor == Unterteil) {
    return 45;
}else if (currentAgent == Ring && predecessor == Halteteil) {
    return 45;
}
return 10; 

问题根源

代码中存在核心错误:用==直接比较Agent实例与Agent类型。Oberteil、Unterteil等是Agent的类(类型),而currentAgent和predecessor是具体的Agent实例,这种比较永远不会成立,导致所有条件都不触发,最终执行默认返回10的逻辑。

修正方案

在AnyLogic中,判断Agent实例的类型需要用instanceof关键字,或调用getType()方法(若自定义类型时设置了标识),以下是两种正确写法:

写法1:使用instanceof

if (currentAgent instanceof Oberteil && predecessor instanceof Unterteil) {
    return 45;
} else if (currentAgent instanceof Oberteil && predecessor instanceof Halteteil) {
    return 40;
}else if (currentAgent instanceof Oberteil && predecessor instanceof Ring) {
    return 45;
}else if (currentAgent instanceof Unterteil && predecessor instanceof Oberteil) {
    return 45;
}else if (currentAgent instanceof Unterteil && predecessor instanceof Halteteil) {
    return 40;
}else if (currentAgent instanceof Unterteil && predecessor instanceof Ring) {
    return 45;
}else if (currentAgent instanceof Halteteil && predecessor instanceof Oberteil) {
    return 40;
}else if (currentAgent instanceof Halteteil && predecessor instanceof Unterteil) {
    return 40;
}else if (currentAgent instanceof Halteteil && predecessor instanceof Ring) {
    return 45;
}else if (currentAgent instanceof Ring && predecessor instanceof Oberteil) {
    return 45;
}else if (currentAgent instanceof Ring && predecessor instanceof Unterteil) {
    return 45;
}else if (currentAgent instanceof Ring && predecessor instanceof Halteteil) {
    return 45;
}
return 10; 

写法2:使用getType()(自定义类型带标识时)

如果你的Agent类型是通过Agent Type元素创建并设置了类型名称,可通过getType()获取类型后比较:

if (currentAgent.getType().equals("Oberteil") && predecessor.getType().equals("Unterteil")) {
    return 45;
}
// 其余条件按此格式替换

额外验证建议

  • 确认v_Predecessor赋值时机:需在前一个Agent离开上一模块时赋值,确保传入当前Service Block的是正确的前序Agent实例,而非空值或错误实例。
  • 添加日志输出验证:在函数中加入tracerln("当前Agent类型:" + currentAgent.getClass().getName()),可快速确认传入的Agent类型是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:20:26