如何在AnyLogic中通过Select Output选择队列长度最短的队列?
用Select Output将Agent分配至最短队列的实现方案
直接比较法(适用于少量队列)
如果只有2-3个目标队列,可直接在Select Output的分支条件中编写长度比较逻辑:
假设你有queueA、queueB、queueC三个队列:
- 第一个分支条件:
queueA.size() < queueB.size() && queueA.size() < queueC.size()→ 满足时将Agent分配到queueA - 第二个分支条件:
queueB.size() < queueA.size() && queueB.size() < queueC.size()→ 满足时将Agent分配到queueB - 最后一个分支保留默认(不设条件)→ 当多个队列长度相同时,分配到queueC
集合动态查找法(适用于多队列场景)
如果队列数量较多,建议用集合统一管理并动态查找最短队列:
- 创建队列集合:在模型中定义一个
ArrayList<Queue>类型的变量(比如命名为queues),在模型启动时将所有目标队列加入集合:queues.add(queueA); queues.add(queueB); queues.add(queueC); // 按需添加更多队列 - 编写查找函数:创建一个自定义函数
findShortestQueue(),返回Queue类型:Queue findShortestQueue() { Queue shortestQueue = queues.get(0); for (Queue q : queues) { if (q.size() < shortestQueue.size()) { shortestQueue = q; } } return shortestQueue; } - 配置Select Output分支条件:每个分支的条件判断当前最短队列是否为该分支对应的队列:
- 分支1条件:
findShortestQueue() == queueA→ 分配到queueA - 分支2条件:
findShortestQueue() == queueB→ 分配到queueB - 后续分支依次类推,最后一个分支留作默认
- 分支1条件:
注意事项
- 确保队列长度调用正确:使用
queue.size()方法(而非属性)获取队列内Agent数量,部分仿真工具中需要严格遵循方法调用语法 - 处理长度相同的情况:上述逻辑会返回集合中第一个遇到的最短队列,若需随机分配,可在函数中加入随机判断逻辑
内容的提问来源于stack exchange,提问作者Pedro Sousa
相关产品推荐
相关产品推荐

