仿真实验页Before simulation run阶段访问Equipment代理内部参数方法
从AnyLogic实验页访问非主代理Equipment的参数方案
你在实验页无法直接使用root.XXX访问的核心原因是:实验页上下文的root指向实验对象本身,而非仿真运行时的主代理实例,需要先获取当前仿真的主代理入口再向下访问,根据Equipment的存放位置有三种常用实现方式:
- 若Equipment是主代理(默认类名为Main)下的单个实例/群体
在「Before simulation run」代码块中先通过引擎获取主代理实例,再直接访问对应Equipment:// 获取当前仿真的主代理实例,若你自定义了主代理类名,将Main替换为你的类名即可 Main mainRoot = (Main) getEngine().getRoot(); // 访问主代理下的单个Equipment实例(假设变量名为equipment) double targetParam = mainRoot.equipment.yourParameterName; // 如果是主代理下的Equipment群体(假设群体变量名为equipments),可按索引取对应个体 double firstEqParam = mainRoot.equipments.get(0).yourParameterName; - 若Equipment嵌套在其他非主代理的内部
从主代理实例开始逐层向下访问到Equipment所在层级即可,示例:Equipment存放在主代理下的Workshop群体第一个个体的内部:Main mainRoot = (Main) getEngine().getRoot(); Equipment targetEq = mainRoot.workshopPopulation.get(0).equipment; // 读取参数 int runDuration = targetEq.runDuration; - 若你不清楚Equipment的具体存放路径,可全局检索所有Equipment类型实例
使用AnyLogic内置的全局查找方法直接获取所有该类型的代理:// 检索当前仿真中所有Equipment类型的实例 List<Equipment> allEquipments = findAll(Equipment.class); // 遍历筛选你需要的实例读取参数 for (Equipment eq : allEquipments) { if (eq.eqId.equals("target_001")) { System.out.println(eq.yourParameterName); } }
注意:「Before simulation run」阶段所有仿真代理实例已完成初始化,上述代码不会出现实例未创建的空指针问题,只要你模型中确实创建了对应Equipment实例即可正常运行。
内容的提问来源于stack exchange,提问作者user16171092
相关产品推荐
相关产品推荐

