You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pedestrian库的超市仿真中实现排队agent切换短队列的方法

超市仿真行人队列切换(Jockeying)功能实现思路

AnyLogic 行人库的 Ped Service 组件没有内置队列切换逻辑,需要通过自定义状态轮询+队列退出重分配的逻辑实现,以下是可落地的实现方案:

  • 给客户 Agent 添加轮询触发器:在客户进入 Ped Service 排队状态后,给 agent 新增一个周期触发的Event事件,触发周期可根据仿真精度设置(建议 1~5 秒,避免触发过于频繁占用算力)。
  • 编写队列长度校验逻辑:事件触发时,遍历当前 Ped Service 下所有可用排队队列的长度,只有当其他队列比当前 agent 所在队列短的长度超过预设阈值(比如≥2 人,避免无意义的频繁切换)时,才触发切换动作。
  • 实现退出当前队列逻辑:调用ped.getService()获取当前绑定的 Ped Service 实例,再调用ped.cancelService()让当前 agent 立刻退出排队队列,行人会自动离开当前队列区域。
  • 重新分配最短队列:退出队列后立刻调用pedService.request(ped, targetQueue),直接指定找到的最短队列作为分配目标,不需要走默认的队列选择规则,避免 agent 被重新分配回原队列。
  • 补充边界逻辑处理:
    • 客户已经走到队列前端即将接受服务时禁止切换,可通过ped.getQueuePosition()判断当前排队位置,排在前 2 位时直接跳过轮询校验。
    • 存在动态开闭的结账台时,要把已关闭的队列从遍历列表中排除,避免分配到不可用队列。
    • 可添加切换概率参数,比如设置仅 80% 的客户会主动观测其他队列长度,更符合真实消费场景。

你可以参考以下示例代码实现核心逻辑:

// 轮询事件内的执行逻辑示例
int currentQueueSize = ped.getQueue().size();
PedQueue shortestQueue = null;
int minSize = Integer.MAX_VALUE;
// 遍历当前Ped Service所有关联的可用队列
for (PedQueue q : pedService.getQueues()) {
    if (q.isEnabled() && q.size() < minSize) {
        minSize = q.size();
        shortestQueue = q;
    }
}
// 满足切换条件才执行动作
if (shortestQueue != null 
    && minSize < currentQueueSize - 2 // 目标队列至少短2人才切换
    && ped.getQueuePosition() > 2) { // 不在队列前2位才允许切换
    ped.cancelService();
    pedService.request(ped, shortestQueue); // 直接指定分配到最短队列
}

如果要优化仿真性能,也可以不用给每个 agent 单独添加轮询事件,改为在结账区全局添加一个周期事件,统一遍历所有排队 agent 批量校验切换条件,算力消耗更低。

内容的提问来源于stack exchange,提问作者Joshua Heisler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 03:36:03