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

AnyLogic中如何将Tractor派发给最近的等待代理(双循环场景)

AnyLogic码头双循环流程:实现牵引车按最近等待代理分配

要实现牵引车释放后优先派给两个流程等待队列里的最近代理,核心是替换默认的随机资源分配逻辑,改用自定义的距离优先策略,具体步骤如下:

  • 调整Seize块的抢占模式
    把Flow1和Flow2对应的Seize块的「抢占方式」设为手动,让代理进入Seize块时直接加入等待队列,不自动发起资源请求。这样就能完全控制资源的分配时机和对象。

  • 编写距离优先的代理筛选函数
    新建一个自定义函数,用来遍历两个等待队列,找出距离当前空闲牵引车最近的代理:

    Agent findClosestWaitingAgent(Resource tractor) {
        Agent closest = null;
        double minDist = Double.MAX_VALUE;
    
        // 遍历Flow1的等待队列
        for (Agent a : flow1Seize.getWaiting()) {
            double dist = distance(tractor, a);
            if (dist < minDist) {
                minDist = dist;
                closest = a;
            }
        }
    
        // 遍历Flow2的等待队列,更新最近代理
        for (Agent a : flow2Seize.getWaiting()) {
            double dist = distance(tractor, a);
            if (dist < minDist) {
                minDist = dist;
                closest = a;
            }
        }
    
        return closest;
    }
    
  • 自定义牵引车的释放与分配逻辑
    在牵引车完成当前任务(比如Release块之后),添加一个「事件」来执行以下操作:

    1. 调用上面的函数,获取最近的等待代理;
    2. 如果找到代理,将牵引车分配给它:从对应等待队列移除该代理,调用Seize块的seize(tractor)方法完成抢占,然后触发代理继续后续流程;
    3. 如果没有等待代理,将牵引车放回资源池闲置。

    示例代码:

    Agent targetAgent = findClosestWaitingAgent(currentTractor);
    
    if (targetAgent != null) {
        // 从队列移除代理(避免重复分配)
        flow1Seize.getWaiting().remove(targetAgent);
        flow2Seize.getWaiting().remove(targetAgent);
        // 手动完成抢占并推进流程
        targetAgent.getSeizeBlock().seize(currentTractor);
        targetAgent.proceed();
    } else {
        // 无等待任务,牵引车回到资源池
        tractorPool.free(currentTractor);
    }
    
  • 额外注意事项

    • 若模拟是多线程模式,遍历等待队列时要加synchronized锁,避免并发问题;
    • 如果代理位置会动态变化,确保计算距离时使用最新的坐标值;
    • 可以根据需求扩展逻辑,比如当多个代理距离相同时,优先分配给某一类流程(如进口/出口)。

内容的提问来源于stack exchange,提问作者Swann Roussillon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:13:02