AnyLogic中为单Agent类型配置数据库动态DelayBlock延迟时间
解决AnyLogic中DelayBlock引用Excel数据库出现“not unique database value”错误的方案
问题原因
直接在DelayBlock的延迟时间中引用数据库列(如tabelle1.processing1)时,AnyLogic无法确定要选取哪一行数据(因为列包含多个值),因此抛出“非唯一数据库值”的错误。
解决方案1:为每个Agent分配固定的数据库行索引(适合每个Agent对应唯一延迟时间)
在Agent类型中添加变量
打开你的Agent类型编辑界面,添加一个整数类型的变量,命名为processingRowIndex,用于存储该Agent对应的Excel表行号。创建Agent时分配行索引
- 按顺序分配行:
在主环境中创建全局整数变量agentRowCounter,初始值设为1;在生成Agent的Source块的“On exit”动作中添加代码:agent.processingRowIndex = agentRowCounter; // 循环复用行数据的判断逻辑 if(agentRowCounter < tabelle1.size()){ agentRowCounter++; } else { agentRowCounter = 1; } - 随机分配行:
在Source块的“On exit”动作中直接设置:agent.processingRowIndex = uniform_discr(1, tabelle1.size());
- 按顺序分配行:
在DelayBlock中引用对应行的延迟时间
在DelayBlock的“Delay time”输入框中输入:tabelle1.get(agent.processingRowIndex).processing1
解决方案2:直接随机选取数据库行(适合每次延迟随机取一个值)
如果不需要每个Agent固定延迟时间,而是每次进入DelayBlock时随机获取Excel中的值,可直接在DelayBlock的“Delay time”中输入:
tabelle1.randomRow().processing1
注意事项
- 确保Excel数据库已正确导入AnyLogic,且数据库表名称为
tabelle1、列名称为processing1,大小写和拼写完全匹配。 - 使用行索引时,注意AnyLogic数据库的行号从1开始计数。
内容的提问来源于stack exchange,提问作者Omar Elsherif
相关产品推荐
相关产品推荐

