AnyLogic作业车间调度按加工时长排序队列的配置与代码报错问题
问题
我正在使用AnyLogic实现作业车间调度,当前有20个作业(每个作业为包含自身工序对应设备序列数据库的智能体)和5台设备(资源)。
- 现有模型结构:Source模块生成20个作业,在exit块中调用
nextmachine函数,将每个作业发送到其工序对应的正确设备。 - 当前需求:调用存储了每个作业各工序对应设备加工时长的数据库表,将所有队列按最短加工时间排序。我基于这张新数据表创建了名为
processingTimes的新智能体,尝试将作业ID与processingTimes的ID关联以正确匹配加工时长,但目前关联逻辑存在问题。 - 已尝试操作:
- 新建加工时长数据表
- 在processingTimes智能体中创建集合存储每个作业的加工时长
- 编写两类智能体ID关联逻辑(当前判定为不正确)
- 设置按加工时长排序作业的条件代码(当前判定为存在错误)
- 新增迭代器代码出现报错,附带新集合的属性配置
问题排查与修正方案
你当前的错误主要集中在3个核心环节,对应修正方案如下:
1. 智能体关联逻辑修正
你当前直接将作业智能体的自身ID与processingTimes智能体的ID绑定,逻辑天然不成立:processingTimes智能体是按加工时长表的每一行生成,同一个作业ID会对应多道工序的多条记录,单ID匹配无法找到当前工序对应的时长。
修正操作:
- 在作业智能体中新增两个变量:
int currentJobId存储当前作业的编号,int currentProcessStep存储当前作业执行到的工序序号,作业每完成一道工序就将currentProcessStep加1 - 匹配加工时长时,使用
currentJobId和currentProcessStep两个字段作为联合查询条件,在processingTimes集合中过滤出对应记录
2. 队列排序逻辑修正
你当前的排序代码没有关联作业当前工序,无法取到正确的加工时长,同时AnyLogic队列的优先级规则为数值越小优先级越高,最短加工时间排序直接返回对应工序的加工时长即可。
正确的队列优先级配置代码:
// 过滤出当前作业当前工序对应的加工时长记录 Optional<ProcessingTime> targetTime = filter(processingTimes, p -> p.jobId == agent.currentJobId && p.step == agent.currentProcessStep).findFirst(); // 非空判断避免空指针报错,默认返回大值兜底 return targetTime.isPresent() ? targetTime.get().duration : 99999;
3. 迭代器报错修正
你遇到的迭代器报错来自两个低级错误:
- 你创建的processingTimes集合没有指定泛型,默认存储
Object类型,读取时没有强制类型转换就直接调用加工时长属性,触发类型不匹配报错 - 没有做非空判断就直接调用
get()方法,当没有匹配到对应记录时会触发空指针异常
修正操作: - 打开processingTimes集合的属性配置页,将集合元素类型指定为你创建的
ProcessingTime智能体类型 - 所有查询processingTimes集合的代码都按照上面给的示例加上非空判断
内容的提问来源于stack exchange,提问作者Rodrigo Lemos
相关产品推荐
相关产品推荐

