AnyLogic离散事件仿真中为ResourcePool添加带参资源的实现问题
AnyLogic:用Source生成带参数资源并加入ResourcePool的正确做法
核心方案
别折腾Enter块或容量变量了,直接让Source生成自定义资源代理,通过代码把代理塞进ResourcePool,参数会自动保留。
分步操作
- 创建自定义资源代理类型
- 新建一个Agent类型(比如命名为
StockResource),在里面添加你需要的所有参数:purchaseDate(日期类型)、activityLevel(数值类型)等,对应Excel数据集里的字段。
- 新建一个Agent类型(比如命名为
- 配置Source块
- 将Source的「Agent type」设置为刚创建的
StockResource。 - 如果是按Excel逐行生成资源,把Source的「Arrival mode」改成「From dataset」,选择你的Excel数据集。
- 在Source的「On exit」代码框中,给每个生成的代理赋值参数,示例代码:
// 假设Excel数据集名为excelData,列名分别是"采购日期"和"活动等级" agent.purchaseDate = excelData.getDate(source.getCurrentDatasetRow(), "采购日期"); agent.activityLevel = excelData.getDouble(source.getCurrentDatasetRow(), "活动等级");
- 将Source的「Agent type」设置为刚创建的
- 将代理直接加入ResourcePool
- 继续在Source的「On exit」代码末尾添加一行,把生成的代理加入目标ResourcePool:
myResourcePool.add(agent); - 注意:你的ResourcePool的「Agent type」必须和
StockResource完全一致,否则无法添加。
- 继续在Source的「On exit」代码末尾添加一行,把生成的代理加入目标ResourcePool:
- 验证与后续使用
- 运行模型后,打开ResourcePool的「Inspect」窗口,查看代理列表就能确认参数是否正确赋值。
- 后续用Seize块获取资源时,可直接调用代理的参数,比如在Seize的「On seize」中测试:
traceln("当前使用资源的采购日期:" + agent.purchaseDate);
为啥之前的方法行不通?
- Enter块是给流程实体设计的,不是用来处理ResourcePool的资源,逻辑方向错误。
- 通过变量调整ResourcePool容量,只能修改池的最大容纳数,没法给池内代理添加自定义参数——因为默认代理没有你需要的字段。
内容的提问来源于stack exchange,提问作者Marcelle
相关产品推荐
相关产品推荐

