Anylogic队列现有agent集合创建及客户弃队模拟相关问题咨询
排队弃队联动逻辑实现方案(适配AnyLogic仿真平台)
前置准备(Customer Agent配置)
- 新增集合参数:命名为
frontAgents,类型选择ArrayList<Customer>,初始值设为new ArrayList<Customer>(),用于存储当前客户前方所有未弃队的客户agent引用 - 新增状态标记变量:命名为
isAbandoned,布尔类型,初始值为false,用于标记当前客户是否已经弃队 - 新增联动响应函数:命名为
frontCustomerLeft,入参为Customer leftAgent,函数内实现两个逻辑:- 从
frontAgents集合中移除已弃队的leftAgent - 执行你自定义的弃队判断规则(可结合当前自身等待时长、前方剩余人数、弃队人数占比等参数),如果符合弃队条件则触发自身弃队逻辑
- 从
Queue块On Enter动作代码
新客户进入队列时,直接调用Queue块自带的queue有序集合(队首元素索引为0,队尾为最大索引)填充前置集合:
// 转换agent类型为自定义的Customer Customer currentCustomer = (Customer) agent; currentCustomer.frontAgents.clear(); // 遍历队列中除刚加入的当前客户外的所有已有客户(已有客户都排在当前客户前方) for (int i = 0; i < self.queue.size() - 1; i++) { Customer frontCustomer = (Customer) self.queue.get(i); // 仅存储未弃队的前方客户 if (!frontCustomer.isAbandoned) { currentCustomer.frontAgents.add(frontCustomer); // 如果需要单独采集参数,可直接调用属性获取,比如frontCustomer.waitDuration、frontCustomer.customerType } }
弃队联动逻辑实现
某个客户触发弃队条件时,按以下顺序执行代码:
// 先标记自身已弃队 this.isAbandoned = true; // 遍历队列中所有排在当前客户后方的客户,发送弃队通知 int currentIndex = queue.indexOf(this); for (int i = currentIndex + 1; i < queue.size(); i++) { Customer behindCustomer = (Customer) queue.get(i); behindCustomer.frontCustomerLeft(this); } // 最后将自身移出队列 queue.remove(this);
无需单独存储agent ID,直接存储agent对象引用即可直接调用所有自定义参数、函数,操作效率更高
内容的提问来源于stack exchange,提问作者DiaLaDia
相关产品推荐
相关产品推荐

