如何解决AnyLogic中Select Output块的‘result cannot be resolved to a variable’错误
解决AnyLogic Select Output块的变量错误并实现排序与指标统计
一、修复‘result cannot be resolved to a variable’错误
错误根源是代码中直接使用了未声明的result变量。Select Output块的代码要求返回布尔值(true/false),用来判断当前实体走哪个输出端口。你需要替换为具体的排序判断逻辑,比如按拖期时间或流转时间的比较:
假设你的产品实体有dueDate(交货期)和entryTime(进入系统时间)属性,要按拖期时间(time() - dueDate)从大到小排序,代码可以写:
// 比较当前实体与队列首项的拖期时间,当前实体拖期更久则走第一个出口 time() - dueDate > ((Product)main.myQueue.get(0)).dueDate - time()
注:Product是你的实体类名,main.myQueue是存放待排序实体的队列对象,需根据模型实际名称修改
如果是按流转时间(time() - entryTime)升序排序,代码:
time() - entryTime < ((Product)main.myQueue.get(0)).entryTime - time()
二、实现排序与指标统计需求
要输出产品排序、总流转时间等指标,需结合全局变量和实体属性完成统计:
1. 定义全局统计变量
在模型的Main代理中添加以下变量:
totalFlowTime(double,初始0):总流转时间totalTardiness(double,初始0):总拖期时间tardyJobCount(int,初始0):拖期作业数量productSequence(List,初始 new ArrayList<>()):产品排序记录
2. 在实体流转节点添加统计逻辑
- 记录产品排序:当实体进入排序后的流程时(比如Select Output的出口块),添加代码:
main.productSequence.add(this); - 统计流转时间:当实体离开系统时(比如
Exit块),添加代码:double flowTime = time() - entryTime; main.totalFlowTime += flowTime; - 统计拖期相关指标:同样在实体离开时计算:
double tardiness = Math.max(0, time() - dueDate); main.totalTardiness += tardiness; if(tardiness > 0){ main.tardyJobCount++; }
3. 计算与输出平均拖期时间
平均拖期时间可通过全局变量实时计算,比如在仪表盘或文本框中使用:
main.tardyJobCount > 0 ? main.totalTardiness / main.tardyJobCount : 0
4. 批量输出所有指标
可在模拟结束时通过控制台打印,或用Text组件展示:
// 控制台打印示例 traceln("产品排序:" + main.productSequence.stream().map(p -> p.name).collect(Collectors.toList())); traceln("总流转时间:" + main.totalFlowTime); traceln("总拖期时间:" + main.totalTardiness); traceln("平均拖期时间:" + (main.tardyJobCount > 0 ? main.totalTardiness / main.tardyJobCount : 0)); traceln("拖期作业数量:" + main.tardyJobCount);
三、注意事项
- 确保实体类(如
Product)已定义entryTime、dueDate、name等属性,且在实体生成时正确赋值(比如entryTime = time()) - 调用队列
get(0)前可先判断队列非空,避免空指针异常:!main.myQueue.isEmpty() && 排序逻辑
内容的提问来源于stack exchange,提问作者Shafaa P Al Zahra
相关产品推荐
相关产品推荐

