Queue模块Population of agents功能如何定向代理到指定队列
Queue模块「代理种群」模式下定向发送代理到指定队列的实现方法
选中Population of agents选项后,Queue模块会生成一组配置统一的队列实例集合,模块本身默认按预设规则自动分配入队队列,不会主动识别自定义目标,要实现定向发送按以下步骤操作即可:
- 先确认队列实例的生成规则
设置完种群内队列总数后,AnyLogic会自动按[Queue模块名]_[从0开始的索引]的规则生成单个队列实例。比如你将Queue模块命名为taskQueue,设置队列总数为3,最终生成的3个独立队列就是taskQueue_0、taskQueue_1、taskQueue_2。你也可以直接用模块自带的getElement(索引)方法调用对应位置的队列实例,不用硬记实例名。 - 拦截默认入队逻辑,手动注入到指定队列
打开Queue模块的「高级设置」面板,找到「入队前动作(Before enqueue)」代码框,写入以下逻辑:
如果你还没给代理加存储目标队列的参数,可以先在代理类型里新增一个int类型的自定义参数// 先终止模块默认的自动队列分配流程 cancel(); // 这里替换成你自己的目标队列索引判断逻辑,比如从代理的自定义参数取、按业务规则计算 int targetIndex = agent.targetQueueId; // 将当前代理直接注入到指定索引的队列中 this.getElement(targetIndex).inject(agent);targetQueueId,在代理进入Queue模块之前的节点(比如上游的服务模块、SelectOutput分流模块)就给这个参数赋好值,对应你要送去的队列序号即可。 - 补全队列出口的流转逻辑
种群模式下,单个队列实例的流出不会自动汇总到Queue模块的总输出端口,你需要给每个队列实例配置出口动作,把处理完的代理送到后续流程节点。如果不想逐个配置,可以在Queue模块的「初始化时」动作里批量绑定:for(int i=0; i<this.size(); i++){ Queue q = this.getElement(i); q.onExit.add( a -> { // 替换成你后续的流程模块名,比如送到下一个service模块 service.take(a); }); }
- 补充:如果你不需要完全指定固定队列,只是想自定义队列选择规则(比如选当前等待人数最少的队列、按代理优先级匹配队列),也可以在入队前动作里直接写判断逻辑计算targetIndex,不用提前给代理赋值。举个选最短队列的示例:
cancel(); int minLength = Integer.MAX_VALUE; int targetIdx = 0; for(int i=0; i<this.size(); i++){ if(this.getElement(i).size() < minLength){ minLength = this.getElement(i).size(); targetIdx = i; } } this.getElement(targetIdx).inject(agent);
注意:只要你写了
cancel()拦截默认逻辑,模块自带的队列选择规则(随机、最短队列、轮询等)就会失效,所有路由逻辑完全由你自定义的代码控制。
内容的提问来源于stack exchange,提问作者CrustyNoodle
相关产品推荐
相关产品推荐

