AnyLogic中如何让顾客选择最短队列?多队列场景解决方案咨询
解决AnyLogic中多队列(12个)的最优分配问题
当队列数量较多时,嵌套if-else的方案完全不现实,用集合统一管理队列+遍历查找最小长度队列是最简洁高效的实现方式,具体步骤如下:
1. 统一管理所有队列
首先在模型初始化阶段(比如主代理的On startup事件),将12个Queue组件存入一个List集合,方便后续批量操作:
// 在主代理的变量面板声明全局List变量,类型为List<Queue> List<Queue> allQueues = new ArrayList<>(); // 在On startup事件中初始化集合,把所有队列加入 allQueues.add(queue1); allQueues.add(queue2); allQueues.add(queue3); // 依次添加queue4到queue12,确保所有队列都被纳入集合
2. 编写工具函数查找最小队列
创建一个自定义函数(返回类型设为Queue),遍历集合找到当前长度最小的队列:
Queue findSmallestQueue() { // 初始化最小队列为集合第一个元素 Queue smallestQueue = allQueues.get(0); // 遍历所有队列,更新最小队列 for (Queue q : allQueues) { if (q.size() < smallestQueue.size()) { smallestQueue = q; } } return smallestQueue; }
可选:处理并列最小队列的随机分配
如果存在多个队列长度相同且均为最小值,上面的函数会返回第一个匹配的队列。若需要随机选择其中一个,可修改函数逻辑:
Queue findSmallestQueue() { // 第一步:先确定所有队列的最小长度 int minSize = Integer.MAX_VALUE; for (Queue q : allQueues) { if (q.size() < minSize) { minSize = q.size(); } } // 第二步:收集所有长度等于最小长度的队列 List<Queue> candidateQueues = new ArrayList<>(); for (Queue q : allQueues) { if (q.size() == minSize) { candidateQueues.add(q); } } // 第三步:随机选取一个候选队列 return candidateQueues.get(uniform_discr(0, candidateQueues.size() - 1)); }
3. 分配顾客到目标队列
在需要分配顾客的逻辑节点(比如顾客到达事件、SelectOutput组件的触发逻辑),直接调用函数获取目标队列,让顾客进入:
// 获取当前最优队列 Queue targetQueue = findSmallestQueue(); // 让当前顾客进入目标队列 targetQueue.take(this);
如果一定要用SelectOutput组件,也可以在每个出口的条件中判断targetQueue == queueX,但直接用代码分配会更高效简洁。
内容的提问来源于stack exchange,提问作者Aqeel Tariq
相关产品推荐
相关产品推荐

