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

AnyLogic模型突发'Duplicate local variable self'错误求助

解决AnyLogic中「Duplicate local variable self」编译错误

问题描述

开发模拟工厂工作站的骰子游戏模型,初始运行正常,无任何改动的情况下突然出现编译错误:

错误信息:Duplicate local variable self。位置:Dice_Game_DtC/Main - Agent Type

定位到错误来自AnyLogic自动生成的Main.java代码,而非自定义代码。回退到正常版本并逐步添加改动后模型恢复正常,但几天后错误再次复发。模型为事件驱动架构,部分事件(如Pay_Costs、Define_Downs)的生成代码中,AnyLogic重复定义了名为self的变量,引发冲突。

以下是出现问题的事件代码示例:

if ( _e == Pay_Costs ) {
      EventTimeout self = _e;

//我的代码如下
Fixed_Costs_Round=Fixed_Cap_Cost;
Fixed_Cap_Costs_Payed.add(Fixed_Costs_Round);
Total_Fixed_Costs=Total_Fixed_Costs+Fixed_Costs_Round;

Total_Inv_Round=Total_WIP+Available_Finished_Prd;
Total_Inv_per_Round.add(Total_Inv_Round);
Invent_Cost_Round= Total_Inv_Round/Num_Players;
Invent_Cost_per_Round.add(Invent_Cost_Round);
Total_Invent_Costs=Total_Invent_Costs+Invent_Cost_Round 
//我的代码结束

;
      return;
    }
    if ( _e == Define_Downs ) {
      EventTimeout self = _e;

//我的代码如下

//1. 始终为Player 1设置无停机时间
for (int i = 1; i <= Num_ROUNDS; i ++){
    Downtimes_P1.add(i,0);
    Downtimes_ME_P1.add(i,0);
    Downtimes_MA_P1.add(i,0);
    Downtimes_HU_P1.add(i,0);};

//2. 为所有玩家的第1、2轮设置无停机时间
for (int i = 1; i < Num_Players; i ++){ //从1开始是因为索引0是已设置好的P1
    Downtimes_Datasets.get(i).add(1,0);
    Downtimes_Datasets.get(i).add(2,0);
    MA_Downs.get(i).add(1,0);
    MA_Downs.get(i).add(2,0);
    HU_Downs.get(i).add(1,0);
    HU_Downs.get(i).add(2,0);
    ME_Downs.get(i).add(1,0);
    ME_Downs.get(i).add(2,0);
    };

//3. 为除Player 1外的所有玩家、除第1、2轮外的所有轮次定义停机时间——每2轮设置一次
for (int i = 1; i < Num_Players; i ++){ //从1开始以忽略索引0的Player 1
    for (int y = 3; y < Num_ROUNDS; y +=2){ //y代表轮次
        //首先定义各环节(机器、方法、人员)的停机状态
        double down_value_ma=uniform(0,1);//MACHINE
        if (down_value_ma<DWT_Machine_Prob) down_value_ma =1; else down_value_ma =0; 
        MA_Downs.get(i).add(y,down_value_ma);
        MA_Downs.get(i).add(y+1,down_value_ma);
        
        double down_value_me=uniform(0,1);//METHOD
        if (down_value_me<DWT_Method_Prob) down_value_me =1; else down_value_me =0;
        ME_Downs.get(i).add(y,down_value_me);
        ME_Downs.get(i).add(y+1,down_value_me);
        
        double down_value_hu=uniform(0,1);//HUMAN
        if (down_value_hu<DWT_Human_Prob) down_value_hu =1; else down_value_hu =0;
        if (y>=HeadC_Inv_Round) down_value_hu=0;//若该轮有HeadC投资,则将停机时间设为0
        HU_Downs.get(i).add(y,down_value_hu);
        if (y+1==HeadC_Inv_Round) HU_Downs.get(i).add(y+1,0) ; else HU_Downs.get(i).add(y+1,down_value_hu);//若下一轮为投资轮次,直接设为0
        
        //若任一环节停机,则工作站停机
        int down_value;
        if (down_value_ma==1||down_value_me==1||down_value_hu==1) down_value=1; else down_value=0;
        
        Downtimes_Datasets.get(i).add(y,down_value);
        Downtimes_Datasets.get(i).add(y+1,down_value);};}
//我的代码结束
 
;
      return;
    }

解决方案

1. 清理生成代码缓存

  • 关闭当前模型,找到模型所在目录下的gen文件夹(AnyLogic自动生成Java代码的目录)
  • 删除gen文件夹内的所有文件及子文件夹
  • 重新打开模型,AnyLogic会重新生成干净的代码文件,避免旧缓存的残留冲突

2. 修复自定义代码的语法错误

  • 检查所有事件中的自定义代码,确保语法完整:比如示例中Pay_Costs事件的最后一行Total_Invent_Costs=Total_Invent_Costs+Invent_Cost_Round缺少分号,这类小错误会干扰AnyLogic的代码生成逻辑,导致内部变量重复定义
  • 逐一排查循环、条件语句的括号闭合情况,确保代码结构完整

3. 重置异常事件

  • 针对反复出现问题的事件(如Pay_Costs、Define_Downs),可以删除原有事件,重新创建一个新的同类型事件,再将原代码复制到新事件中,避免事件的内部配置损坏

4. 更新AnyLogic到稳定版本

  • 这类间歇性的代码生成错误可能是软件版本的已知bug,安装最新的官方稳定版本,修复已知的代码生成逻辑问题

内容的提问来源于stack exchange,提问作者Beatriz Valladão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:56:00