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

AnyLogic资源池初始化报错求助:自定义Doctor资源单元配置问题

Anylogic资源池初始化错误解决方案

问题背景

已创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:55:58