AnyLogic基于优先级的Queue实现:优先处理最短加工时间订单
生产仿真队列优先处理最短加工时间订单的实现方案
先把加工时间绑定到订单Agent
从表格读取到加工时间后,必须给每个订单Agent添加一个自定义属性(比如命名为processingTime),把对应数值存进去,确保每个订单都带着自己的加工时间数据,不能只存在表格里。修改Queue的出站选择逻辑
放弃系统默认的选择规则,在Queue的「选择下一个要处理的Agent」模块里写自定义逻辑:- 获取队列里所有待处理的订单Agent
- 逐个对比它们的
processingTime数值,找出最小的那个 - 指定这个Agent作为下一个出站对象
给你个通用伪代码参考(适配多数仿真软件的逻辑):
Agent targetAgent = null; double shortestTime = 999999; // 设一个足够大的初始值 for(Agent agent : 当前队列.get所有Agent()){ double currentTime = agent.get属性("processingTime"); if(currentTime < shortestTime){ shortestTime = currentTime; targetAgent = agent; } } return targetAgent;排查之前失败的常见原因
你之前选最小Agent没成功,大概率是这几个问题:- 加工时间没正确赋值给Agent,读取的是默认值(比如0、null)
- 选择逻辑错拿了Agent的ID、创建时间这类无关数值来比较,不是加工时间
- 队列的选择模式没切到「自定义逻辑」,还是用了系统默认的FIFO或随机模式
额外优化点
如果有多个订单加工时间相同,可以加次级优先级(比如先到先处理、订单编号从小到大),避免选择逻辑出现混乱。
内容的提问来源于stack exchange,提问作者Maike
相关产品推荐
相关产品推荐

