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

AnyLogic作业车间调度按加工时长排序队列的配置与代码报错问题

问题

我正在使用AnyLogic实现作业车间调度,当前有20个作业(每个作业为包含自身工序对应设备序列数据库的智能体)和5台设备(资源)。

  • 现有模型结构:Source模块生成20个作业,在exit块中调用nextmachine函数,将每个作业发送到其工序对应的正确设备。
  • 当前需求:调用存储了每个作业各工序对应设备加工时长的数据库表,将所有队列按最短加工时间排序。我基于这张新数据表创建了名为processingTimes的新智能体,尝试将作业ID与processingTimes的ID关联以正确匹配加工时长,但目前关联逻辑存在问题。
  • 已尝试操作:
    1. 新建加工时长数据表
    2. 在processingTimes智能体中创建集合存储每个作业的加工时长
    3. 编写两类智能体ID关联逻辑(当前判定为不正确)
    4. 设置按加工时长排序作业的条件代码(当前判定为存在错误)
    5. 新增迭代器代码出现报错,附带新集合的属性配置
问题排查与修正方案

你当前的错误主要集中在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:39:05