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

函数与moveTo模块实例调用失败:AGV与Package类型匹配问题

AnyLogic中moveTo模块调用函数匹配AGV与Package类型并填充饼图问题

问题背景

需要填充饼图,但在无返回值函数AGVundTyp及moveTo模块中无法正确调用实例,原函数代码如下:

if ((Package)agent.p_type==0 && ((AGV)agent.p_type==0)) {
    AGV1_Type1++; 
} else if ((Package)agent.p_type==1 && ((AGV)agent.p_type==0)){
    AGV1_Type2++; 
} else if ((Package)agent.p_type==2 && ((AGV)agent.p_type==0)){
    AGV1_Type3++;
} 
else { 
    error ("error"); 
}


if ((Package)agent.p_type==0 && ((AGV)agent.p_type==1) ){
    AGV2_Type1++; 
} else if ((Package)agent.p_type==1 && ((AGV)agent.p_type==1)){
    AGV2_Type2++; 
} else if ((Package)agent.p_type==2 && ((AGV)agent.p_type==1)){
    AGV2_Type3++;
} 
else { 
    error ("error");    
}

if ((Package)agent.p_type==0 && ((AGV)agent.p_type==2)) {
    AGV3_Type1++; 
} else if ((Package)agent.p_type==1 && ((AGV)agent.p_type==2)){
    AGV3_Type2++; 
} else if ((Package)agent.p_type==2 && ((AGV)agent.p_type==2)){
    AGV3_Type3++;
} 
else { 
    error ("error");
}

当前错误

  • agent无法解析为变量
  • AGV与int操作数类型不兼容
  • Package与int操作数类型不兼容

场景说明

AGV类和Package类均包含int类型参数p_type:

  • Package类型在Source创建时初始化
  • AGV类型对应3个ResourcePool,每个Pool初始化对应类型
  • 函数需在moveTo算子中调用,用于对比AGV与Package的类型,但因参数名相同无法明确区分实例

解决方案

1. 修正函数参数,明确区分实例

修改AGVundTyp函数,直接接收Package和AGV实例作为参数,避免混淆:

void AGVundTyp(Package pkg, AGV agv) {
    // 校验实例非空
    if(pkg == null || agv == null) {
        error("Package或AGV实例为空");
        return;
    }

    int pkgType = pkg.p_type;
    int agvType = agv.p_type;

    // 按AGV类型分类统计
    if(agvType == 0) {
        switch(pkgType) {
            case 0: AGV1_Type1++; break;
            case 1: AGV1_Type2++; break;
            case 2: AGV1_Type3++; break;
            default: error("未知Package类型: " + pkgType);
        }
    } else if(agvType == 1) {
        switch(pkgType) {
            case 0: AGV2_Type1++; break;
            case 1: AGV2_Type2++; break;
            case 2: AGV2_Type3++; break;
            default: error("未知Package类型: " + pkgType);
        }
    } else if(agvType == 2) {
        switch(pkgType) {
            case 0: AGV3_Type1++; break;
            case 1: AGV3_Type2++; break;
            case 2: AGV3_Type3++; break;
            default: error("未知Package类型: " + pkgType);
        }
    } else {
        error("未知AGV类型: " + agvType);
    }
}

2. 在moveTo模块中正确调用函数

在moveTo模块的On exit事件(AGV完成移动后统计)中,传入当前Package和对应的AGV实例:

// 获取当前Package实例和分配的AGV实例
Package currentPkg = (Package)getAgent();
AGV assignedAgv = (AGV)getResource();
// 调用统计函数
AGVundTyp(currentPkg, assignedAgv);

如果是Package对象的流程内调用,可直接用this指代当前Package:

AGV assignedAgv = (AGV)this.getAssignedResource();
AGVundTyp(this, assignedAgv);

3. 错误原因解析

  • agent无法解析为变量:原函数未定义agent变量,必须明确传入具体的Package和AGV实例
  • AGV/Package与int操作数类型不兼容:原代码错误地将agent.p_type(int类型)强制转换为AGV/Package类型,正确方式是直接获取对应实例的p_type属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:54:56