启动时 Anylogic Agent 创建顺序

Anylogic Agent creation order at startup

我有一个代理 "TANKFARM",它是一个罐的集合,有特定的规则,如它们填充的顺序,或者它们的产品被使用等。这些罐的数量(可见或不可见) ) 和初始内容 - 它们包含什么类型的流体以及此类流体的数量等都是在模型启动时从 Excel-sheet 中读取的。 "PRODUCTS" 本身由代理定义,该代理在启动时从另一个 Excel-sheet.

读取产品列表,每个产品都有其属性

因此在一个模拟中 运行 产品可能是不同等级的汽油。在下一个 运行 中,它可能是化学品等。罐区中的初始内容(产品和初始体积)也可能与一个 运行 不同(在 spreadsheets 中定义为每次模拟-运行)

现在,模型配置为 "PRODUCTS" 代理的 "On Startup" 事件从 Excel 读取其内容。然后它有一个嵌入式功能,当用户传递 productID 时设置不同产品的颜色。

"TANKFARM" 的 "On startup" 事件类似地读取 Excel 文件和油库设置。然后它 运行 是一个函数来设置所有坦克的初始条件(也在 "On Startup" 中)。所以它现在设置所有参数,其中包括 PRODUCTID 参数,执行 tank.set_capacity() & tank.set_initialAmount() 等。Anylogic "tank" 对象将其 InitialBatch 设置为参数 "PRODUCTID" 并将 InitialBatchColor 设置为 PRODUCTS_AGENT.setColor(PRODUCTID) (当用户传递 ProductID 时 returns 颜色的自定义函数)。一切顺利。

现在出现的问题如下: 当 Anylogic 启动模型 运行 时,它会在创建 PRODUCTS 对象之前创建 TANKFARM 对象。然后它 运行 是 TANKFRAM "On Startup" 事件,然后是 运行 PRODUCTS "On Startup" 事件(因此 Excel 文件以错误的顺序读取) .因此,当 TANKFARM 执行代码以设置罐中的初始量时,产品列表(及其颜色)尚不存在,因此罐中初始产品体积的颜色未正确设置 - 在customInitialBatch 已分配,产品列表仍为空。

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

所以...有没有办法改变代理的创建顺序,或者不同代理的 "On Startup" 事件被调用的顺序? (或者 .. 在 "On startup" 事件中读取并设置所有内容后,有没有办法更改初始批次(流体的颜色)?)

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

  • 其中一些是由您的模型结构规定的(parents 总是在 children 之前创建)
  • 一些来自您拖入东西的顺序(Main 上的几个代理群体...)

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

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

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

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