如何对 Anylogic 中的表进行动态引用?

Posted

技术标签:

【中文标题】如何对 Anylogic 中的表进行动态引用?【英文标题】:How to make dynamic references to tables in Anylogic? 【发布时间】:2020-07-29 01:28:58 【问题描述】:

我已经为六台机器建模。它们中的每一个都有不同的电力负荷曲线。 AnyLogic 的表格中提供了负载配置文件。每台机器都有一个存储这些值的自己的表。我遍历这些值以在 TableFunctions 中实现相同的值。现在我面临以下挑战:如何对相关表进行动态引用。我想根据机器指数选择一个特定的表。如何定义动态引用相关表对象的变量?

感谢您的帮助!

【问题讨论】:

我找不到您使用的 DBMS。你的试用码表是什么?但是对于这种模型,您可以使用 NoSql 数据库,如 mongoDB、Redies 等... Nosql 非常可行。我的合作伙伴与 Redies 合作保存传感器日志。 你是说AnyLogic内部数据库表还是说你说的是表函数,其实你说的是表函数中的数据(跟数据库无关,除了可以加载他们的数据来自内部数据库)? 【参考方案1】:

不确定在您的情况下是否真的有必要,但这里是:

您可以将对数据库表的引用存储到以下类型的变量中:

com.mysema.query.sql.RelationalPathBase

在特定列中选择 double(int、String 等)类型的值时,您可以通过调用 variable.getColumns().get(index) 的索引来获取该列。然后你需要把它转换成对应的类型,如下所示:

List<Double> resultRows = selectFrom(variable).where( ( (com.mysema.query.types.path.NumberPath<Double>) variable.getColumns().get(1) ).eq(2.0)) .list(( (com.mysema.query.types.path.NumberPath<Double>) variable.getColumns().get(1) ));

【讨论】:

如何创建这样的变量?我尝试使用调色板中的变量。然后我将 type 设置为 Other 并在旁边输入 com.mysema.query.sql.RelationalPathBase。但是,我收到错误消息“com.mysema.query 无法解析为类型”。 选择“其他”类型,然后在“RelationalPa”字段中键入并使用代码完成(在 Windows 上为 Ctrl+空格)。然后选择正确的条目。【参考方案2】:

您是否总是拥有有限数量的机器?您的负载配置文件是如何表示的?如果您有有限数量的机器,并且负载配置文件是一组单独的值 - 或者实际上只要您可以将这些值保存在每个元素的单个字段中 - 那么您可以创建一个表,例如machine_load_profile,其中第一列是 load_profile_element 并保存元素 ID,其他列命名为 machine_0、machine_1、machine_2 等,保存每个负载配置文件元素的值。然后,您可以像这样获取单台机器的负载配置文件元素:

List<Double> dblReturnLPEs = main.selectValues(
    "SELECT machine_" + oMachine.getIndex()
    + " FROM machine_load_profile"
    + " ORDER BY load_profile_element;"
);

然后迭代该列表或将它们转换为数组:

dblLPEValues = dblReturnLPEs.stream().mapToDouble(Double::doubleValue).toArray();

并对其进行迭代。

当然,您也可以对列和行使用相反的方向,使用 WHERE,我只是有一个以这种方式定向的方便示例。

【讨论】:

是的,我将拥有有限数量的机器。我按照你建议的方式做了。我为机器 idx 添加了一个列,并在查询中考虑了这一点。负载配置文件是从 db 中的值内插的。我使用表格函数在这些值之间进行插值并从中创建曲线。比我有一个每秒调用一次的事件并返回负载配置文件的值。 我正在将一个相当大的模型从总是从 Excel 读取参数值转换为使用数据库、表函数、自定义分布等,并在示例中找到了一些帮助。我在这里监视新问题,因此将在可能的情况下添加实用答案。例如,在我上面的转换代码的原始代码中,我转换为双精度数组的原因是我可以将它传递给自定义分布,而不必“手动”迭代所有值来创建阈值用于循环代理集合并伪随机分配配置文件。

以上是关于如何对 Anylogic 中的表进行动态引用?的主要内容,如果未能解决你的问题,请参考以下文章

计算如何在 anylogic 上工作?

(Anylogic)如何从另一个代理引用 Main

对anylogic中的不同任务使用相同的服务块

AnyLogic中的计算动态延迟

表格数据从 Excel 输入到 Anylogic 中的系统动态库存

Anylogic - 从其他代理访问变量