自定义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
相关产品推荐
相关产品推荐

