AnyLogic:如何针对不同sp参数的agent采用对应批量大小分批
AnyLogic 按Agent同参数值差异化分批实现方案
方案1:使用流程建模库原生组件(无额外代码,适合新手)
- 首先创建查找表(Lookup Table),命名为
spBatchMapping,输入类型设为整数,对应sp的1-5取值,输出值为对应sp的分批批量,按实际需求填写:如sp=1对应10,sp=2对应7等。 - 在产品Agent的流入路径中添加SelectOutput5块(因为sp取值为1-5共5类),设置路由条件为
agent.sp == 对应数值,将不同sp值的产品路由到不同下游分支。 - 每个分支各拖入1个Wait块,每个Wait块的「最大等待代理数」配置为
spBatchMapping.getValue(对应sp值),并勾选「达到最大等待代理数时释放所有代理」选项。 - 每个Wait块的输出端接入后续的批次处理逻辑即可:不够批量的产品会留在Wait块中,待后续新的同sp产品流入凑够批量后再统一释放为一个批次。
方案2:自定义代码实现(灵活度高,适合复杂规则场景)
第一步:全局变量定义
在Main Agent中定义2个全局变量:
- 变量1:类型为
HashMap<Integer, Integer>,命名为spBatchSize,用于存储sp值和对应批量的映射关系 - 变量2:类型为
HashMap<Integer, Queue<Product>>,命名为spWaitingQueues,用于存储不同sp值的待分批产品队列
第二步:初始化配置
在Main的「启动时」动作中添加初始化代码:
// 配置各sp对应的批量 spBatchSize = new HashMap<>(); spBatchSize.put(1, 10); spBatchSize.put(2, 7); spBatchSize.put(3, 你的自定义批量); spBatchSize.put(4, 你的自定义批量); spBatchSize.put(5, 你的自定义批量); // 初始化各sp的等待队列 spWaitingQueues = new HashMap<>(); for (int sp = 1; sp <= 5; sp++) { spWaitingQueues.put(sp, new LinkedList<Product>()); }
第三步:产品流入分批逻辑
在产品Agent的流入处理位置添加以下代码:
int currentSp = agent.sp; int targetBatchSize = spBatchSize.get(currentSp); Queue<Product> currentQueue = spWaitingQueues.get(currentSp); // 新agent加入对应队列 currentQueue.add(agent); // 循环判断是否可凑出完整批次 while (currentQueue.size() >= targetBatchSize) { List<Product> finishedBatch = new ArrayList<>(); for (int i = 0; i < targetBatchSize; i++) { finishedBatch.add(currentQueue.poll()); } // 此处替换为你的批次处理逻辑:如将批次传入下游流程、创建批次Agent装载产品等 }
以上两种方案均支持剩余不足批量的产品留存到下一轮,和新流入的同sp产品合并凑批,完全匹配需求。
内容的提问来源于stack exchange,提问作者Mohamed Youssef
相关产品推荐
相关产品推荐

