启动时的 Anylogic Agent 创建顺序

Posted

技术标签:

【中文标题】启动时的 Anylogic Agent 创建顺序【英文标题】:Anylogic Agent creation order at startup 【发布时间】:2020-09-09 05:03:44 【问题描述】:

我有一个代理“TANKFARM”,它是一组罐子,这些罐子的填充顺序或使用它们的产品等具有一定的规则。这些罐子的数量(可见或不可见)和初始内容- 当模型启动时,它们包含什么类型的流体以及这种流体的量等都是从 Excel 表中读取的。 “产品”本身是由一个代理定义的,该代理在启动时从另一个 Excel 表中读取产品列表,每个产品都有其属性。

因此,在一次模拟运行中,产品可能是不同等级的汽油。在下一次运行中,可能是化学品等。罐区中的初始内容(产品和初始体积)也可能因运行而异(在每个模拟运行的电子表格中定义)

现在,模型配置为“PRODUCTS”代理的“启动时”事件从 Excel 读取其内容。然后它有一个嵌入函数,当用户通过 productID 时设置不同产品的颜色。

“TANKFARM”的“启动时”事件类似地读取带有 tankfarm 设置的 Excel 文件。然后它运行一个函数来设置所有坦克的初始条件(也在“启动时”)。所以它现在设置所有参数,其中 PRODUCTID 参数,tank.set_capacity() & tank.set_initialAmount() 等。Anylogic“坦克”对象的 InitialBatch 设置为参数“PRODUCTID”,InitialBatchColor 设置为PRODUCTS_AGENT.setColor(PRODUCTID)(自定义函数在用户传递一个 ProductID)。一切都好。

现在问题来了: 当 Anylogic 开始模型运行时,它会在创建 PRODUCTS 对象之前创建 TANKFARM 对象。然后它在运行 PRODUCTS“启动时”事件之前运行 TANKFRAM“启动时”事件(因此 Excel 文件以错误的顺序读取)。因此,当 TANKFARM 执行代码以设置罐中的初始数量时,产品列表(及其颜色)尚不存在,因此罐中初始产品体积的颜色没有正确设置 - 在customInitialBatch 得到分配,产品列表仍然是空的。

在设置 InitialAmount 后,我​​找不到更改 customInitialBatchColor 的方法。

那么...有没有办法改变代理的创建顺序,或者不同代理的“启动时”事件被调用的顺序? (或者……有没有办法在“启动时”事件中读取并设置所有内容后更改初始批次(流体的颜色)?)

【问题讨论】:

【参考方案1】:

这是 AnyLogic 中的一个模糊区域,因为您无法显式更改代码执行的顺序:

其中一些是由您的模型结构规定的(父母总是在孩子之前创建) 有些来自您拖入的顺序(Main 上的几个代理群体...)

最简单的解决方案:通过不在您的个人代理和其他地方编写自定义“OnStartup”代码来解决此类问题。将它们放在 Main 上的 1 个可控函数中。

或者,在您的 TANKFARM 之后使用事件手动创建您的产品。

或者,如果 PRODUCTS 和 TANKFARM 都在 Main 上,请尝试删除两者并按照您需要的顺序重新创建它们的种群。这将改变代码执行...

更多选项,真正取决于您的具体设置

【讨论】:

谢谢@Benjamin。这似乎是创作工作的顺序。因此,如果我先删除 PRODUCTS 然后删除 TANKFARM,则首先读取产品电子表格,然后一切正常。不过我会探索其他选项。

以上是关于启动时的 Anylogic Agent 创建顺序的主要内容,如果未能解决你的问题,请参考以下文章

Q: [Anylogic] 如何计算在seize block队列中等待的所有agent的变量总和?

Anylogic 的 Agent 人口和 SD 住房示例中的 Add_people() 函数

基于两个参数的 AnyLogic 优先级队列作为 Java 代码

安装Zabbix5.0

anylogic,流程建模库:split.如何设置和引用代理副本的属性?

Anylogic如何创建新代理并分配属性?