AnyLogic资源池初始化报错求助:自定义Doctor资源单元配置问题
问题背景
已创建Doctor代理(包含name字符串属性、schedule日程属性)和Resource Pool,但在主代理onStartup中初始化资源池时抛出UnsupportedOperationException错误。
当前初始化代码(主代理onStartup):
List<Doctor> doctorList = new ArrayList<>(Arrays.asList( new Doctor("doctorX", schedule_doctorX), new Doctor("doctorY", schedule_doctorY), new Doctor("doctorZ", schedule_doctorZ) )); doctorPool.set_capacity(doctorList.size()); doctorPool.resourceUnits().clear(); doctorPool.resourceUnits().addAll(doctorList);
辅助创建函数:
Doctor doctor = new Doctor(); doctor.name = name; doctor.schedule = schedule; return doctor;
错误栈信息:
Error during model startup:
UnsupportedOperationException
java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:336)
at multiple_pathyways_mech.Main.onStartup(Main.java:4087)
at com.anylogic.engine.Agent.h(Unknown Source)
at com.anylogic.engine.Agent.start(Unknown Source)
at com.anylogic.engine.Engine.start(Unknown Source)
at com.anylogic.engine.ExperimentSimulation.e(Unknown Source)
at com.anylogic.engine.ExperimentSimulation.run(Unknown Source)
at com.anylogic.engine.ExperimentSimulation.h(Unknown Source)
at com.anylogic.engine.internal.m$m.run(Unknown Source)
分步解决方案
1. 核心错误原因
doctorPool.resourceUnits()返回的是不可修改的列表,直接调用clear()或addAll()会触发UnsupportedOperationException,这是Anylogic资源池的内置限制。
2. 正确初始化方式(无需更换为种群)
放弃直接操作resourceUnits()列表,改用Anylogic官方推荐的资源池初始化方法:
- 步骤1:在
Resource Pool的属性面板中,将资源类型设置为Doctor代理 - 步骤2:删除
onStartup中的clear()和addAll()代码,替换为循环创建并添加资源:
// 先清空资源池(用官方兼容方式) doctorPool.freeAll(); while(doctorPool.size() > 0){ doctorPool.remove(doctorPool.get(0)); } // 添加自定义Doctor实例 doctorPool.add(new Doctor("doctorX", schedule_doctorX)); doctorPool.add(new Doctor("doctorY", schedule_doctorY)); doctorPool.add(new Doctor("doctorZ", schedule_doctorZ)); // 设置容量 doctorPool.set_capacity(3);
- 步骤3:确保
Doctor代理有对应构造函数:
在Doctor代理的代码面板中添加构造方法:
public Doctor(String name, Schedule schedule){ this.name = name; this.schedule = schedule; }
3. 方案选择答疑
- 不需要更换为医生种群:资源池是管理静态服务资源的最优组件,种群更适合需要自主行为、自由移动的代理,医生作为服务资源用资源池更适配。
- 不需要将
name从字符串改为整数:字符串名称更直观,错误与属性类型无关,无需修改。
4. 额外检查项
- 确认
schedule_doctorX/Y/Z是主代理中已创建的有效Schedule对象,而非空引用 - 确保
Seize块选择的资源池为doctorPool,且资源筛选逻辑(如果有)正确引用Doctor的属性
内容的提问来源于stack exchange,提问作者Selin Ozen

