如何为流程建模Source块创建的Agent设置含随机性的常量值
问题根因
直接在Agent变量定义处初始化带随机逻辑的常量时,静态初始化阶段的类加载顺序和运行时动态生成Agent的类加载顺序不一致,就会出现动态生成的Agent无法正常访问utils类的报错;手动在Main中预创建Agent群体是模型启动阶段完成初始化,上下文加载完整,所以不会触发问题。
具体解决方法
方案1:使用带参构造函数实现Java层面的final常量
如果需要严格的不可修改的Java常量,按以下步骤操作:
- 在你的Agent类型中,仅声明常量不赋值,示例代码:
// 替换为你自己的变量类型和名称 public final double customConstant;
- 为Agent新增带参构造函数,入参接收常量值,在构造函数内完成赋值:
public 你的Agent类名(double inputConstant){ this.customConstant = inputConstant; }
- 打开Source块的设置面板,在「新实体」的生成逻辑处,不要使用默认的无参构造,改为调用你写的带参构造,随机值直接在Source块中生成传入:
// 替换为你自己的随机逻辑,比如正态分布、均匀分布等,也可以调用你的utils类方法 new 你的Agent类名(uniform(0,100))
方案2:使用AnyLogic只读变量(无需修改构造函数)
如果不需要严格的Java final修饰,仅需要模型层面不可修改的常量,操作更简单:
- 在Agent中定义变量时,将「可修改性」设置为「只读」,不需要加final修饰,也不要在定义处赋值
- 在Agent的「启动时」动作代码块中,调用utils类的方法或者随机函数完成变量赋值即可
- 保持Source块的默认生成逻辑即可,不需要额外修改
两种方案都可以避免类加载顺序导致的utils类访问报错,同时实现每个动态生成的Agent的常量值是随机且不可修改的。
内容的提问来源于stack exchange,提问作者Jaco-Ben Vosloo
相关产品推荐
相关产品推荐

